Raspberry Pi'yi Linux işletim sistemi olmadan kullanmak?


33

Raspberry Pi'yi gömülü uygulamaların geliştirilmesi için saf gömülü bir CPU birimi olarak kullanmakla ilgileniyorum. Raspberry Pi'nin hafızası oldukça az olan güçlü bir CPU'ya sahip olduğundan, mükemmel bir gömülü kart yapar.

Raspberry Pi'yi Linux işletim sistemi olmadan kullanmak mümkün müdür? Bunu nasıl yapabilirim?


2
Bunun gerçek bir soru olduğunu ve soru-cevap formatına uygun olmadığını düşünüyorum.
Alex Chamberlain

5
Neden olmasın? İnsanların RaPi'yi Linux işletim sisteminden başka bir şekilde kullanma hakkında soru sorabileceğini düşünmüyor musunuz? Bu grubun tüzükleri listesinde, bu tür soruları soramayacağınızı söyleyen bir bölüm var mı?
FarhadA

2
Öyle demedim. Linux kullanmayan bazı projeleri görmenin gerçekten harika olacağını düşünüyorum, ancak kesin bir cevapla bir soru sormadınız, bir tartışma konusu yaptınız.
Alex Chamberlain

@AlexChamberlain Katılıyorum - Bir soru olarak düzenledim. FarhadA - Umarım bu iyidir, şu anki durumunda kapalı olacaktır. Lütfen düzenlememi inceleyin ve geliştirin!
Alex L,

Tamam, doğru, bir soru yapmak zorundayım, çünkü bu bir Soru-Cevap sitesi :)
FarhadA

Yanıtlar:


23

Ahududu Pi'deki metal programlamaya baktım ve yapmak istediğin gibi görünüyor. Çıplak metal programlama hakkında bazı iyi forum konuları vardır ve bazı kişilerin kodlarını çalışması için çok çaba sarf etmişlerdir. Başlamak için şunlara göz atın:

Raspi'de Çıplak Metal Başlama Kılavuzu

RPI'yi çıplak metal üzerinde programlama

Çıplak Metal Eğitimi Üzerine Temel Programlama 1

veya genel olarak Raspberry Pi's Bare Metal Forum'a gidip gezinebilirsiniz.

Anladığım kadarıyla Broadcom çipinde yerleşik olarak bulunan önyükleme sırası nedeniyle SD karttan önyükleme yapmanız gerekecek. Önyükleme sırasının bağlantısını bulmaya çalışıyorum, ancak google fu'm çalışmıyor, daha sonra bulursam düzenlerim.


3
Ek olarak, bu öğreticiyi de kullanabilirsiniz: cl.cam.ac.uk/freshers/raspberrypi/tutorials/os bir işletim sistemi oluşturmakla ilgilidir, ancak bir işletim sistemi fikrinizi genişletirseniz gömülü sistemlere uygulanabilir.
ohblahitsme,

6

önyüklemesinin tek yolu fat32 biçimli bir sdcard'dan, poweron'dan kernel.img adındaki herhangi bir kol ikili dosyasını çalıştıran gpu firmware yüklemesine gider, bu yüzden ne yapmak isterseniz onu yapan özel bir çekirdek yapmak istiyorsanız bu noktada


3
Evet, ama yapmak istediğim bu değil, çipin önyükleme kodunu değiştirmenin mümkün olup olmadığını bilmek istiyorum, böylece önyükleme görüntüsünü aramak için SD karta gitmek yerine, oraya gidilecek şekilde değiştirilebilir Bir SPI flaş hafızası ve oradan önyükleme yapın. Bu yolla, önyükleme kodu AT25FS040 veya AT25DF641 veya benzeri birimler gibi bir SPI flash bellekte olabilir. Gömülü uygulamalar için, bunlar tüm kodu depolamaya yeterlidir ve önyüklemeden sonra SDRAM'a yüklenebilirler. ancak en büyük zorluk boot ROM kodunu değiştirmektir.
FarhadA,

9
Sorunuzda sorduğunuz şey bu değil.
Alistair Buxton,

Biliyorum, ancak RaPi önyükleme sekansı hakkındaki bilgilerim sınırlı, asıl soruma oylama yapılmadan ve bu güncel formatta düzenlenmeden önce doğru sorum vardı.
FarhadA

2
@ FarhadA - Buradaki ilk yorumunuz, kendi başına pratik, yanıtlanabilir bir soru olarak durduğunu düşünüyor. Bu sorunun asıl şekli kesinlikle daha iyi olurdu.
Mark Booth,

Dediğim gibi RasPi önyükleme dizisi hakkındaki bilgilerim sınırlı. SD kartta basit bir önyükleme dosyası oluşturmaya meyilliyim ve uygulamayı SPI tabanlı bir flaştan kendi genişletme kartıma yüklüyorum. Sistemimde SD kartın olması hoşuma gitmiyor, ancak bunu yapmanın tek hızlı ve kirli yolu gibi görünüyor. Şimdi RasPi için basit bir önyükleme kodu oluşturmayı öğrenmem gerek :)
FarhadA

4

C #'da IBM S / 390 öykünücüsünü CIL kodunu derlerken ve desteklenmeyen .NET kaynaklarını kullanmadığından, teorik olarak Mono / Linux altında çalışacak bir IBM S / 390 emülatörü oluşturdum. Bu, özel sonlu durumlu bir makine yorumlayıcısına sahip platform bağımsız kontrol tablolarını kullanan gömülü çözümlere izin verecektir. Yine de arka planda temel Linux O / S'sine sahip olurdu.


2

Tam otomatik minimal çıplak metal flaşör örneği

Ubuntu 16.04 ana bilgisayarında, Raspberry Pi 2'de test edilmiştir.

  1. Ana bilgisayara SD kart takın

  2. Görüntüyü olun:

    ./make.sh /dev/mmblck0 p1
    

    Nerede:

    • /dev/mmblck0 SD kartın cihazı
    • p1cihazın ilk bölümüdür ( /dev/mmblck0p1)
  3. PI'da Ankastre SD kart

  4. Gücü kapatın ve açın

görüntü tanımını buraya girin

GitHub memba: https://github.com/cirosantilli/raspberry-pi-bare-metal-blinker/tree/d20f0337189641824b3ad5e4a688aa91e13fd764

start.S

.global _start
_start:
    mov sp, #0x8000
    bl main
hang:
    b hang

main.c

#include <stdint.h>

/* This is bad. Anything remotely serious should use timers
 * provided by the board. But this makes the code simpler. */
#define BUSY_WAIT __asm__ __volatile__("")
#define BUSY_WAIT_N 0x100000

int main( void ) {
    uint32_t i;
    /* At the low level, everything is done by writing to magic memory addresses. */
    volatile uint32_t * const GPFSEL4 = (uint32_t *)0x3F200010;
    volatile uint32_t * const GPFSEL3 = (uint32_t *)0x3F20000C;
    volatile uint32_t * const GPSET1  = (uint32_t *)0x3F200020;
    volatile uint32_t * const GPCLR1  = (uint32_t *)0x3F20002C;

    *GPFSEL4 = (*GPFSEL4 & ~(7 << 21)) | (1 << 21);
    *GPFSEL3 = (*GPFSEL3 & ~(7 << 15)) | (1 << 15);
    while (1) {
        *GPSET1 = 1 << (47 - 32);
        *GPCLR1 = 1 << (35 - 32);
        for (i = 0; i < BUSY_WAIT_N; ++i) { BUSY_WAIT; }
        *GPCLR1 = 1 << (47 - 32);
        *GPSET1 = 1 << (35 - 32);
        for (i = 0; i < BUSY_WAIT_N; ++i) { BUSY_WAIT; }
    }
}

ldscript

MEMORY
{
    ram : ORIGIN = 0x8000, LENGTH = 0x10000
}

SECTIONS
{
    .text : { *(.text*) } > ram
    .bss : { *(.bss*) } > ram
}

make.sh

#!/usr/bin/env bash

set -e

dev="${1:-/dev/mmcblk0}"
part="${2:-p1}"
part_dev="${dev}${part}"
mnt='/mnt/rpi'

sudo apt-get install binutils-arm-none-eabi gcc-arm-none-eabi

# Generate kernel7.img
arm-none-eabi-as start.S -o start.o
arm-none-eabi-gcc -Wall -Werror -O2 -nostdlib -nostartfiles -ffreestanding -c main.c -o main.o
arm-none-eabi-ld start.o main.o -T ldscript -o main.elf
# Get the raw assembly out of the generated elf file.
arm-none-eabi-objcopy main.elf -O binary kernel7.img

# Get the firmware. Those are just magic blobs, likely compiled
# from some Broadcom proprietary C code which we cannot access.
wget -O bootcode.bin https://github.com/raspberrypi/firmware/blob/597c662a613df1144a6bc43e5f4505d83bd748ca/boot/bootcode.bin?raw=true
wget -O start.elf https://github.com/raspberrypi/firmware/blob/597c662a613df1144a6bc43e5f4505d83bd748ca/boot/start.elf?raw=true

# Prepare the filesystem.
sudo umount "$part_dev"
echo 'start=2048, type=c' | sudo sfdisk "$dev"
sudo mkfs.vfat "$part_dev"
sudo mkdir -p "$mnt"
sudo mount "${part_dev}" "$mnt"
sudo cp kernel7.img bootcode.bin start.elf "$mnt"

# Cleanup.
sync
sudo umount "$mnt"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.