Используете Raspberry Pi без ОС Linux?


33

Я заинтересован в использовании Raspberry Pi в качестве чистого встроенного процессора для разработки встроенных приложений. Так как Raspberry Pi имеет мощный процессор с небольшим объемом памяти, он является отличной встроенной платой.

Можно ли использовать Raspberry Pi без ОС Linux? Как я могу это сделать?


2
Я не думаю, что это реальный вопрос и не очень подходит для формата вопросов и ответов.
Алекс Чемберлен

5
Почему бы нет? Вы не думаете, что люди могут спросить об использовании RaPi любым другим способом, кроме как с ОС Linux? Где в списке уставов этой группы есть раздел, в котором говорится, что нельзя задавать такие вопросы?
Фархада

2
Я этого не говорил. Я на самом деле думаю, что было бы неплохо увидеть некоторые проекты, которые не использовали Linux, но вы на самом деле не задавали вопрос с однозначным ответом, скорее вы высказали свое мнение.
Алекс Чемберлен

@AlexChamberlain Я согласен - я отредактировал это в вопрос. Фархада - Я надеюсь, что все в порядке, в текущем состоянии он будет закрыт. Пожалуйста, просмотрите и улучшите мое редактирование!
Алекс Л

Хорошо, правда, я должен задать вопрос, так как это сайт вопросов и ответов :)
FarhadA

Ответы:


23

Я изучал программирование голого металла на Raspberry Pi, и это звучит как то, что вы хотите сделать. Есть несколько хороших тем на форуме о программировании на голом металле с некоторыми людьми, которые приложили немало усилий, чтобы заставить свой код работать. Проверьте это для начала:

Руководство по началу голого металла на Raspi

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

Программирование в Basic на Bare Metal Учебник 1

или вообще вы можете пойти на Bare Metal Forum Raspberry Pi и просто просмотреть.

Насколько я понимаю, вам придется загружаться с SD-карты из-за последовательности загрузки, встроенной в чип Broadcom. Я пытаюсь найти ссылку для последовательности загрузки, но мой Google Fu не работает, я отредактирую позже, если найду его.


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

6

он загружается только с SD-карты в формате fat32, переходит от poweron к загрузке прошивки gpu, которая выполняет любой двоичный файл arm с именем kernel.img, так что если вы хотите создать собственное ядро, которое делает то, что вы хотите, его на данном этапе


3
Да, но это не то, что я хочу сделать, я хотел бы знать, возможно ли изменить загрузочный код чипа, поэтому вместо перехода на SD-карту для поиска загрузочного образа его можно изменить, чтобы перейти к флэш-память SPI и загрузку оттуда. Таким образом, загрузочный код может быть на флэш-памяти SPI, например, AT25FS040 или AT25DF641 или других подобных устройствах. Для встроенных приложений этого достаточно для хранения всего кода, и они могут быть загружены в SDRAM после загрузки. но большая проблема заключается в изменении кода загрузочного ПЗУ.
Фархада

9
Это совсем не то, что вы задали в своем вопросе.
Алистер Бакстон

Я знаю, но мои знания о последовательности загрузки RaPi ограничены, у меня был правильный вопрос в моем первоначальном вопросе, прежде чем он был отклонен и отредактирован в этом текущем формате.
Фархада

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

Ну, как я уже сказал, мои знания о последовательности загрузки RasPi ограничены. Я склоняюсь к созданию простого загрузочного файла на SD-карте и загрузке приложения из флэш-памяти на основе SPI на мою собственную плату расширения. Мне действительно не нравится иметь SD-карту в моей системе, но это, кажется, единственный быстрый и грязный способ сделать это. Теперь мне нужно научиться создавать простой загрузочный код для RasPi :)
FarhadA

4

Я создал эмулятор IBM S / 390 в C #, который теоретически будет работать под Mono / Linux, так как он компилируется в код CIL и не использует никакие неподдерживаемые ресурсы .NET. Это позволит встроенным решениям использовать независимые от платформы управляющие таблицы с пользовательским интерпретатором конечного автомата. Тем не менее, в фоновом режиме все равно будет существенная операционная система Linux.


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"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.