Menggunakan Raspberry Pi tanpa OS Linux?


33

Saya tertarik menggunakan Raspberry Pi sebagai unit CPU tertanam murni, untuk pengembangan aplikasi tertanam. Karena Raspberry Pi memiliki CPU yang kuat dengan memori yang cukup besar, Raspberry Pi menjadi papan yang disematkan dengan sangat baik.

Apakah mungkin untuk menggunakan Raspberry Pi tanpa OS Linux? Bagaimana saya bisa melakukan ini?


2
Saya tidak berpikir ini adalah pertanyaan nyata dan tidak cocok untuk format Tanya Jawab.
Alex Chamberlain

5
Kenapa tidak? Anda tidak berpikir orang bisa bertanya tentang cara menggunakan RaPi selain dengan OS Linux? Di mana dalam daftar anggaran rumah tangga kelompok ini ada bagian yang mengatakan seseorang tidak dapat mengajukan pertanyaan seperti itu?
FarhadA

2
Saya tidak mengatakan itu. Saya benar-benar berpikir itu akan sangat keren untuk melihat beberapa proyek yang tidak menggunakan Linux, tetapi Anda tidak benar-benar mengajukan pertanyaan dengan jawaban yang pasti, tetapi Anda membuat titik diskusi.
Alex Chamberlain

@AlexChamberlain Saya setuju - Saya telah mengeditnya menjadi pertanyaan. FarhadA - Saya harap ini ok, dalam kondisi saat ini akan ditutup. Tinjau dan perbaiki hasil edit saya!
Alex L

Oke, benar, saya harus mengajukan pertanyaan, karena ini adalah situs tanya jawab :)
FarhadA

Jawaban:


23

Saya telah melihat ke dalam pemrograman bare metal pada Raspberry Pi dan sepertinya itu yang ingin Anda lakukan. Ada beberapa topik forum yang bagus tentang pemrograman bare metal dengan beberapa orang yang telah berupaya keras agar kode mereka berfungsi. Lihat ini untuk memulai:

Panduan untuk Memulai Logam Telanjang di Raspi

Memprogram RPi pada bare metal

Pemrograman di Dasar pada Bare Metal Tutorial 1

atau secara umum Anda dapat pergi ke Bare Metal Forum Raspberry Pi dan hanya melihat-lihat.

Pemahaman saya adalah bahwa Anda harus melakukan booting dari kartu SD karena urutan boot yang dibangun ke dalam chip Broadcom. Saya mencoba menemukan tautan untuk urutan boot tetapi google fu saya tidak berfungsi, saya akan mengedit nanti jika saya menemukannya.


3
Selain itu, Anda dapat menggunakan tutorial ini: cl.cam.ac.uk/freshers/raspberrypi/tutorials/os ini tentang membangun sistem operasi, tetapi jika Anda memperluas ide Anda tentang sistem operasi, itu dapat diterapkan ke sistem embedded.
ohblahitsme

6

satu-satunya cara untuk mem-boot adalah dari sd32 diformat fat32, beralih dari pemuatan firmware ke gpu yang mengeksekusi semua file binary arm bernama kernel.img jadi jika Anda ingin membuat kernel kustom yang melakukan apa pun yang Anda cari lakukan pada saat ini


3
Ya, tapi bukan itu yang ingin saya lakukan, saya ingin tahu apakah mungkin untuk mengubah kode boot chip jadi daripada pergi ke kartu SD untuk mencari gambar boot, itu dapat diubah untuk pergi ke SPI flash memoery dan boot dari sana sebagai gantinya. Dengan cara ini, kode boot dapat berada pada memori flash SPI seperti AT25FS040 atau AT25DF641 atau unit serupa lainnya. Untuk aplikasi yang disematkan, itu sudah cukup untuk menyimpan semua kode, dan mereka dapat dimuat ke SDRAM setelah boot. tetapi tantangan besarnya adalah mengubah kode boot ROM.
FarhadA

9
Bukan itu yang Anda tanyakan dalam pertanyaan Anda sama sekali.
Alistair Buxton

Saya tahu, tetapi pengetahuan saya tentang urutan boot RaPi terbatas, saya punya pertanyaan yang tepat dalam pertanyaan asli saya sebelum ditolak dan diedit ke format saat ini.
FarhadA

2
@ FarhadA - Komentar pertama Anda di sini tampak bagi saya seperti itu akan berdiri sebagai pertanyaan praktis yang dapat dijawab dengan sendirinya. Tentu akan lebih baik daripada bentuk asli dari pertanyaan ini.
Mark Booth

Yah, seperti yang saya katakan, pengetahuan saya tentang urutan boot RasPi terbatas. Saya condong ke arah membuat file boot sederhana pada kartu SD dan memuat aplikasi dari flash berbasis SPI di papan ekspansi saya sendiri. Saya benar-benar tidak suka memiliki kartu SD di sistem saya, tetapi tampaknya itu satu-satunya cara cepat dan kotor untuk melakukannya. Sekarang saya perlu belajar cara membuat kode boot sederhana untuk RasPi :)
FarhadA

4

Saya telah membuat emulator IBM S / 390 dalam C # yang secara teoritis akan berjalan di bawah Mono / Linux karena mengkompilasi ke kode CIL dan tidak menggunakan sumber daya .NET yang tidak didukung. Ini akan memungkinkan solusi tertanam menggunakan tabel kontrol platform independen dengan juru bahasa mesin negara terbatas kustom. Itu masih akan memiliki Linux O / S penting di latar belakang sekalipun.


2

Sepenuhnya minimal blinker logam telanjang contoh otomatis

Diuji pada Ubuntu 16,04 host, Raspberry Pi 2. Penggunaan:

  1. Masukkan kartu SD pada host

  2. Buat gambar:

    ./make.sh /dev/mmblck0 p1
    

    Dimana:

    • /dev/mmblck0 adalah perangkat kartu SD
    • p1adalah partisi pertama perangkat ( /dev/mmblck0p1)
  3. Kartu SD inset pada PI

  4. Matikan dan hidupkan

masukkan deskripsi gambar di sini

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

mulai

.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; }
    }
}

skrip

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"
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.