¿Usa Raspberry Pi sin un sistema operativo Linux?

33

Estoy interesado en usar Raspberry Pi como una unidad de CPU integrada pura, para el desarrollo de aplicaciones integradas. Como la Raspberry Pi tiene una CPU potente con bastante memoria, es una excelente placa integrada.

¿Es posible usar Raspberry Pi sin un sistema operativo Linux? ¿Cómo puedo hacer esto?

FarhadA
fuente
2
No creo que esta sea una pregunta real y no sea una buena opción para el formato de preguntas y respuestas.
Alex Chamberlain
55
Por qué no? ¿No cree que la gente pueda preguntar sobre el uso de RaPi de otra manera que no sea con un sistema operativo Linux? ¿Dónde en la lista de los estatutos de este grupo hay una sección que dice que uno no puede hacer tales preguntas?
FarhadA
2
Yo no dije eso. De hecho, creo que sería genial ver algunos proyectos que no usaban Linux, pero en realidad no hiciste una pregunta con una respuesta definitiva, sino que hiciste un punto de discusión.
Alex Chamberlain
@AlexChamberlain Estoy de acuerdo, lo he editado en una pregunta. FarhadA - Espero que esto esté bien, en su estado actual estaría cerrado. ¡Revisa y mejora mi edición!
Alex L
Ok, es cierto, tengo que hacerle una pregunta, ya que este es un sitio de preguntas y respuestas :)
FarhadA

Respuestas:

23

He investigado la programación de metal desnudo en la Raspberry Pi y suena como lo que quieres hacer. Hay varios buenos temas de foro sobre programación básica con algunas personas que se han esforzado mucho para que su código funcione. Mira estos para comenzar:

Guía para comenzar metal desnudo en Raspi

Programando el RPi en el metal desnudo

Programación en Basic en Bare Metal Tutorial 1

o, en general, puede ir al Foro Bare Metal de Raspberry Pi y simplemente navegar.

Tengo entendido que tendrá que arrancar desde la tarjeta SD debido a la secuencia de arranque integrada en el chip Broadcom. Estoy tratando de encontrar el enlace para la secuencia de arranque, pero mi Google Fu no funciona, lo editaré más tarde si lo encuentro.

Dan B
fuente
3
Además, puede usar este tutorial: cl.cam.ac.uk/freshers/raspberrypi/tutorials/os se trata de construir un sistema operativo, pero si extiende su idea de un sistema operativo, puede aplicarse a los sistemas integrados.
ohblahitsme
6

la única forma en que arrancará es desde una tarjeta sd con formato fat32, va de poweron a carga de firmware de gpu que ejecuta cualquier archivo binario llamado kernel.img, por lo que si desea hacer un kernel personalizado que haga lo que sea que esté buscando en este punto

joe
fuente
3
Sí, pero eso no es lo que quiero hacer, me gustaría saber si es posible cambiar el código de arranque del chip para que en lugar de ir a la tarjeta SD para buscar la imagen de arranque, se pueda cambiar para ir a una memoria flash SPI y arranque desde allí en su lugar. De esta manera, el código de arranque puede estar en una memoria flash SPI como AT25FS040 o AT25DF641 u otras unidades similares. Para aplicaciones integradas, son suficientes para almacenar todo el código, y se pueden cargar en SDRAM después del arranque. pero el gran desafío es cambiar el código ROM de arranque.
FarhadA
99
Eso no es lo que preguntaste en tu pregunta.
Alistair Buxton
Lo sé, pero mi conocimiento de la secuencia de arranque de RaPi es limitado, tenía la pregunta correcta en mi pregunta original antes de que fuera rechazada y editada en este formato actual.
FarhadA
2
@FarhadA: su primer comentario aquí me parece que sería una pregunta práctica y responsable en sí misma. Sin duda, sería mejor que la forma original de esta pregunta.
Mark Booth
Bueno, como dije, mi conocimiento de la secuencia de arranque de RasPi es limitado. Me inclino por crear un archivo de arranque simple en la tarjeta SD y cargar la aplicación desde un flash basado en SPI en mi propia placa de expansión. Realmente no me gusta tener la tarjeta SD en mi sistema, pero parece ser la única forma rápida y sucia de hacerlo. Ahora necesito aprender a crear un código de arranque simple para RasPi :)
FarhadA
4

He creado un emulador IBM S / 390 en C # que teóricamente se ejecutará en Mono / Linux, ya que se compila en código CIL y no utiliza ningún recurso .NET no compatible. Esto permitirá soluciones integradas que utilizan tablas de control independientes de la plataforma con un intérprete personalizado de máquinas de estados finitos. Sin embargo, todavía tendría Linux O / S esencial en segundo plano.

Kenneth Dakin
fuente
2

Ejemplo de intermitencia mínima de metal desnudo totalmente automatizado

Probado en el host Ubuntu 16.04, Raspberry Pi 2. Uso:

  1. Inserte la tarjeta SD en el host

  2. Haz la imagen:

    ./make.sh /dev/mmblck0 p1
    

    Dónde:

    • /dev/mmblck0 es el dispositivo de la tarjeta SD
    • p1es la primera partición del dispositivo ( /dev/mmblck0p1)
  3. Tarjeta SD insertada en PI

  4. Apague y encienda la alimentación

ingrese la descripción de la imagen aquí

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

empieza

.global _start
_start:
    mov sp, #0x8000
    bl main
hang:
    b hang

C Principal

#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 新疆 改造 中心 法轮功 六四 事件
fuente