Usando o Raspberry Pi sem um sistema operacional Linux?

33

Estou interessado em usar o Raspberry Pi como uma unidade de CPU incorporada pura, para o desenvolvimento de aplicativos incorporados. Como o Raspberry Pi possui uma CPU poderosa com bastante memória, ele é uma excelente placa incorporada.

É possível usar o Raspberry Pi sem um sistema operacional Linux? Como posso fazer isso?

FarhadA
fonte
2
Eu não acho que essa seja uma pergunta real e não se encaixa no formato de perguntas e respostas.
Alex Chamberlain
5
Por que não? Você não acha que as pessoas podem perguntar sobre o uso do RaPi de outra maneira senão com um sistema operacional Linux? Onde na lista dos estatutos deste grupo há uma seção que diz que não se pode fazer essas perguntas?
FarhadA
2
Eu não disse isso. Na verdade, acho que seria muito legal ver alguns projetos que não usavam o Linux, mas você não fez uma pergunta com uma resposta definitiva, mas fez um ponto de discussão.
Alex Chamberlain
@AlexChamberlain Eu concordo - eu editei em uma pergunta. FarhadA - Espero que esteja tudo bem, no estado atual seria fechado. Revise e melhore minha edição!
Alex L
Ok, é verdade, eu tenho que fazer uma pergunta, uma vez que este é um Q & A local :)
FarhadA

Respostas:

23

Analisei a programação bare metal no Raspberry Pi e parece o que você deseja fazer. Existem vários tópicos bons no fórum sobre programação bare metal com algumas pessoas que se esforçaram muito para que seu código funcionasse. Confira estes para começar:

Guia para começar o bare metal em Raspi

Programando o RPi no metal puro

Programação em Basic on Bare Metal Tutorial 1

ou, em geral, você pode ir ao Bare Metal Forum do Raspberry Pi e apenas navegar.

Meu entendimento é que você precisará inicializar a partir do cartão SD devido à sequência de inicialização incorporada ao chip Broadcom. Estou tentando encontrar o link para a sequência de inicialização, mas meu fu do google não está funcionando, editarei mais tarde, se o encontrar.

Dan B
fonte
3
Além disso, você pode usar este tutorial: cl.cam.ac.uk/freshers/raspberrypi/tutorials/os trata da criação de um sistema operacional, mas se você estender sua ideia de sistema operacional, ele poderá ser aplicado a sistemas incorporados.
ohblahitsme
6

a única maneira de inicializar é a partir de um sdcard formatado em fat32, vai do poweron ao carregamento do firmware da gpu que executa qualquer arquivo binário de braço chamado kernel.img, portanto, se você deseja criar um kernel personalizado que faça o que quer que seja, neste ponto

Joe
fonte
3
Sim, mas não é isso que eu quero fazer, gostaria de saber se é possível alterar o código de inicialização do chip. Em vez de ir para o cartão SD para procurar a imagem de inicialização, ele pode ser alterado para ir para uma memória flash SPI e inicialize a partir daí. Dessa forma, o código de inicialização pode estar em uma memória flash SPI como AT25FS040 ou AT25DF641 ou outras unidades similares. Para aplicativos incorporados, eles são suficientes para armazenar todo o código e podem ser carregados no SDRAM após a inicialização. mas o grande desafio é alterar o código ROM de inicialização.
precisa saber é o seguinte
9
Não foi isso que você perguntou na sua pergunta.
Alistair Buxton
Eu sei, mas meu conhecimento da sequência de inicialização do RaPi é limitado, eu tinha a pergunta correta na minha pergunta original antes de ser votada para baixo e editada para este formato atual.
FarhadA
2
@ FararA - Seu primeiro comentário aqui me parece que seria uma pergunta prática e responsável por si só. Certamente seria melhor que a forma original desta questão.
22612 Mark Booth
Bem, como eu disse, meu conhecimento da sequência de inicialização do RasPi é limitado. Estou inclinado a criar um arquivo de inicialização simples no cartão SD e carregar o aplicativo a partir de um flash baseado em SPI na minha própria placa de expansão. Realmente não gosto de ter o cartão SD no meu sistema, mas parece ser a única maneira rápida e suja de fazê-lo. Agora eu preciso aprender como criar um código de inicialização simples para Raspi :)
FarhadA
4

Criei um emulador IBM S / 390 em C # que, teoricamente, será executado no Mono / Linux à medida que ele é compilado com o código CIL e não usa recursos .NET não suportados. Isso permitirá soluções integradas usando tabelas de controle independentes de plataforma com um interpretador de máquina de estado finito personalizado. No entanto, ele ainda teria O / S essencial do Linux em segundo plano.

Kenneth Dakin
fonte
2

Exemplo mínimo de um pisca-pisca de metal nu totalmente automatizado

Testado no host Ubuntu 16.04, Raspberry Pi 2. Uso:

  1. Inserir cartão SD no host

  2. Faça a imagem:

    ./make.sh /dev/mmblck0 p1
    

    Onde:

    • /dev/mmblck0 é o dispositivo do cartão SD
    • p1é a primeira partição do dispositivo ( /dev/mmblck0p1)
  3. Inserir cartão SD no PI

  4. Desligue e ligue novamente

insira a descrição da imagem aqui

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"
Ciro Santilli adicionou uma nova foto
fonte