Використовуєте Raspberry Pi без ОС Linux?


33

Мені цікаво використовувати Raspberry Pi як чистий вбудований процесорний блок для розробки вбудованих додатків. Оскільки Raspberry Pi має потужний процесор з досить небагато пам’яті, він робить відмінну вбудовану плату.

Чи можливо використовувати Raspberry Pi без ОС Linux? Як я можу це зробити?


2
Я не думаю, що це справжнє питання і не дуже підходить для формату питань і відповідей.
Алекс Чемберлен

5
Чому ні? Ви не думаєте, що люди можуть запитати про використання RaPi будь-яким іншим способом, ніж з ОС Linux? Де в переліку підзаконних актів цієї групи є розділ, в якому сказано, що не можна задавати такі питання?
FarhadA

2
Я цього не казав. Насправді я думаю, що було б дуже здорово побачити деякі проекти, які не використовували Linux, але ви насправді не задавали питання з остаточною відповіддю, скоріше ви зробили точку обговорення.
Алекс Чемберлен

@AlexChamberlain Я згоден - я відредагував це питання. FarhadA - Я сподіваюся, що це нормально, в його нинішньому стані це було б закрито. Перегляньте та вдосконаліть мою редакцію!
Алекс Л

Гаразд, правда, я мушу поставити це питання, оскільки це веб-сайт із питань відповідей :)
FarhadA

Відповіді:


23

Я розглядав програму голого металу на Raspberry Pi, і це звучить як те, що ти хочеш зробити. Існує кілька хороших тем форуму про програмування голого металу з деякими людьми, які доклали чимало зусиль, щоб їхній код працював. Ознайомтеся з цим, щоб розпочати:

Керівництво по початку голого металу на Raspi

Програмування RPi на голий метал

Програмування з основної мови з підручника з голого металу 1

або взагалі ви можете зайти на форум з голого металу Raspberry Pi і просто переглядати.

Я розумію, що вам доведеться завантажуватися з SD-карти через послідовність завантаження, вбудовану в мікросхем Broadcom. Я намагаюся знайти посилання для послідовності завантаження, але мій google fu не працює, я відредагую пізніше, якщо знайду його.


3
Крім того, ви можете використовувати цей підручник: cl.cam.ac.uk/freshers/raspberrypi/tutorials/os йдеться про створення операційної системи, але якщо ви розширите своє уявлення про операційну систему, його можна застосувати до вбудованих систем.
ohblahitsme

6

єдиний спосіб завантаження - з SD32, відформатованого fat32, переходить від Poweron до завантаження програмного забезпечення gpu, яке виконує будь-який двійковий файл з назвою kernel.img, тому, якщо ви хочете зробити користувацьке ядро, яке робить все, що ви шукаєте, щоб зробити його в цей момент


3
Так, але це не те, що я хочу робити, я хотів би знати, чи можна змінити завантажувальний код мікросхеми, тому замість того, щоб на SD-карту шукати завантажувальний образ, його можна змінити, щоб перейти до SPI флеш-пам’яті та завантаження звідти замість цього. Таким чином, код завантаження може знаходитись на флеш-пам’яті SPI типу AT25FS040 або AT25DF641 або інших подібних блоках. Для вбудованих додатків їх достатньо для зберігання всього коду, і вони можуть бути завантажені в SDRAM після завантаження. але велике завдання - змінити завантажувальний код ROM.
FarhadA

9
Це зовсім не те, про що ви задали своє запитання.
Алістер Бакстон

Я знаю, але мої знання про послідовність завантаження RaPi обмежені, у мене було відповідне запитання в моєму первісному запитанні, перш ніж його було проголосовано і відредаговано до цього поточного формату.
FarhadA

2
@FarhadA - Ваш перший коментар тут мені здається, що це було б практичним, відповідальним питанням саме по собі. Безумовно, краще було б оригінальної форми цього питання.
Марк Бут

Ну, як я вже говорив, мої знання про завантажувальну послідовність 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 вище за течією: https://github.com/cirosantilli/raspberry-pi-bare-metal-blinker/tree/d20f0337189641824b3ad5e4a688aa91e13fd764

старт.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"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.