ใช้ Raspberry Pi โดยไม่มีระบบปฏิบัติการ Linux?


33

ฉันสนใจที่จะใช้ Raspberry Pi เป็นหน่วย CPU แบบฝังตัวเพื่อการพัฒนาแอพพลิเคชั่นแบบฝัง เนื่องจาก Raspberry Pi มีซีพียูทรงพลังที่มีหน่วยความจำค่อนข้างน้อยจึงทำให้บอร์ดฝังตัวที่ยอดเยี่ยม

เป็นไปได้ไหมที่จะใช้ Raspberry Pi ที่ไม่มี Linux OS? ฉันจะทำสิ่งนี้ได้อย่างไร


2
ฉันไม่คิดว่านี่เป็นคำถามจริงและไม่เหมาะสำหรับรูปแบบคำถาม & คำตอบ
อเล็กซ์แชมเบอร์เลน

5
ทำไมไม่ คุณไม่คิดว่าคนอื่นจะถามเกี่ยวกับการใช้ RaPi ด้วยวิธีอื่นใดนอกจากระบบปฏิบัติการ Linux หรือไม่? ในรายการข้อบังคับของกลุ่มนี้มีส่วนใดบ้างที่บอกว่าไม่สามารถถามคำถามได้
FarhadA

2
ฉันไม่ได้พูดอย่างนั้น จริง ๆ แล้วฉันคิดว่ามันค่อนข้างเจ๋งที่เห็นบางโครงการที่ไม่ได้ใช้ Linux แต่คุณไม่ได้ถามคำถามด้วยคำตอบที่ชัดเจน แต่คุณทำประเด็นการอภิปราย
อเล็กซ์แชมเบอร์เลน

@AlexChamberlain ฉันเห็นด้วย - ฉันได้แก้ไขมันเป็นคำถาม FarhadA - ฉันหวังว่านี่จะโอเคในสถานะปัจจุบันมันจะถูกปิด โปรดตรวจสอบและปรับปรุงการแก้ไขของฉัน!
Alex L

ตกลงจริงผมจะต้องทำให้คำถามตั้งแต่นี้เป็น Q & A :) เว็บไซต์
FarhadA

คำตอบ:


23

ฉันได้ดูการเขียนโปรแกรมโลหะเปลือยบน Raspberry Pi และดูเหมือนว่าคุณต้องการจะทำอะไร มีหลายหัวข้อในฟอรัมที่ดีเกี่ยวกับการเขียนโปรแกรมโลหะเปลือยกับบางคนที่ใช้ความพยายามอย่างมากเพื่อให้โค้ดทำงาน ตรวจสอบสิ่งเหล่านี้เพื่อเริ่มต้น:

คู่มือเริ่มต้นโลหะเปลือยบน Raspi

การเขียนโปรแกรม RPi บนโลหะเปลือย

การเขียนโปรแกรมพื้นฐานบน Bare Metal Tutorial 1

หรือโดยทั่วไปคุณสามารถไปที่ฟอรัม Bare Metal ของ Raspberry Piและเพียงแค่เรียกดูรอบ ๆ

ความเข้าใจของฉันคือคุณจะต้องบูตจากการ์ด SD เนื่องจากลำดับการบู๊ตที่สร้างไว้ในชิป Broadcom ฉันพยายามค้นหาลิงค์สำหรับลำดับการบู๊ต แต่ google fu ของฉันไม่ทำงานฉันจะแก้ไขในภายหลังหากพบ


3
นอกจากนี้คุณสามารถใช้บทช่วยสอนนี้: cl.cam.ac.uk/freshers/raspberrypi/tutorials/osมันเกี่ยวกับการสร้างระบบปฏิบัติการ แต่ถ้าคุณขยายแนวคิดของระบบปฏิบัติการมันสามารถนำไปใช้กับระบบฝังตัวได้
ohblahitsme

6

วิธีเดียวที่มันจะบู๊ตมาจากฟอร์แมต sdcard ของ fat32 เปลี่ยนจาก poweron ไปเป็น gpu Firmware load ที่ประมวลผลไฟล์ไบนารีแขนชื่อ kernel.img ดังนั้นหากคุณต้องการสร้างเคอร์เนลแบบกำหนดเองที่ทำสิ่งที่คุณต้องการจะทำ ณ จุดนี้


3
ใช่ แต่นั่นไม่ใช่สิ่งที่ฉันต้องการฉันอยากจะรู้ว่าหากเป็นไปได้ที่จะเปลี่ยนรหัสการบูตของชิปดังนั้นแทนที่จะไปที่การ์ด SD เพื่อค้นหาอิมเมจสำหรับการบูตมันสามารถเปลี่ยนเป็นไปได้ หน่วยความจำแฟลช SPI และบูตจากที่นั่นแทน ด้วยวิธีนี้รหัสบูตอาจอยู่ในหน่วยความจำแฟลช SPI เช่น AT25FS040 หรือ AT25DF641 หรือหน่วยอื่น ๆ ที่คล้ายกัน สำหรับแอปพลิเคชั่นที่ฝังไว้ผู้ใช้ก็เพียงพอที่จะเก็บรหัสทั้งหมดและสามารถโหลดลงใน SDRAM ได้หลังจากบู๊ต แต่ความท้าทายที่ยิ่งใหญ่คือการเปลี่ยนรหัสบูต ROM
FarhadA

9
นั่นไม่ใช่สิ่งที่คุณถามในคำถามของคุณเลย
Alistair Buxton

ฉันรู้ แต่ความรู้เกี่ยวกับลำดับการบูตของ RaPi นั้น จำกัด ฉันมีคำถามที่เหมาะสมในคำถามเดิมของฉันก่อนที่จะได้รับการโหวตและแก้ไขให้เป็นรูปแบบปัจจุบัน
FarhadA

2
@FarhadA - ความคิดเห็นแรกของคุณที่นี่ดูเหมือนกับฉันว่ามันจะเป็นคำถามที่ตอบได้จริงและตอบได้จริง มันจะดีกว่าแน่นอนว่ารูปแบบดั้งเดิมของคำถามนี้
Mark Booth

อย่างที่ฉันบอกว่าความรู้เกี่ยวกับลำดับการบูตของ RasPi นั้นมี จำกัด ฉันโน้มตัวไปสู่การสร้างไฟล์บูตอย่างง่ายบนการ์ด SD และโหลดแอปพลิเคชันจากแฟลชที่ใช้ SPI บนบอร์ดขยายของฉัน ฉันไม่ชอบที่จะมีการ์ด SD ในระบบของฉัน แต่ดูเหมือนจะเป็นวิธีเดียวที่รวดเร็วและสกปรกในการทำเช่นนั้น ตอนนี้ฉันต้องเรียนรู้วิธีการสร้างรหัสการบูตง่าย ๆ สำหรับ RasPi :)
FarhadA

4

ฉันได้สร้างอีมูเลเตอร์ IBM S / 390 ใน C # ซึ่งในทางทฤษฎีแล้วจะทำงานภายใต้ Mono / Linux เนื่องจากมันรวบรวมรหัส CIL และไม่ได้ใช้ทรัพยากร. NET ที่ไม่รองรับ สิ่งนี้จะอนุญาตให้โซลูชันแบบฝังโดยใช้ตารางการควบคุมที่เป็นอิสระจากแพลตฟอร์มพร้อมล่ามเครื่องสถานะ จำกัด ที่กำหนดเอง มันจะยังคงมี Linux O / S ที่จำเป็นอยู่เบื้องหลัง


2

ตัวอย่างไฟกระพริบโลหะเปลือยน้อยที่สุดแบบอัตโนมัติเต็มรูปแบบ

ทดสอบกับโฮสต์ Ubuntu 16.04, Raspberry Pi 2

  1. ใส่การ์ด SD บนโฮสต์

  2. ทำให้ภาพ:

    ./make.sh /dev/mmblck0 p1
    

    ที่ไหน:

    • /dev/mmblck0 เป็นอุปกรณ์ของการ์ด SD
    • p1เป็นพาร์ติชันแรกของอุปกรณ์ ( /dev/mmblck0p1)
  3. ใส่การ์ด SD ลงใน PI

  4. ปิดและเปิดเครื่อง

ป้อนคำอธิบายรูปภาพที่นี่

GitHub upstream: 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"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.