Linux OS없이 Raspberry Pi를 사용하십니까?


33

임베디드 응용 프로그램 개발을 위해 Raspberry Pi를 순수한 임베디드 CPU 단위로 사용하고 싶습니다. 라즈베리 파이는 메모리가 많은 강력한 CPU를 가지고 있기 때문에 훌륭한 임베디드 보드를 만듭니다.

Linux OS없이 Raspberry Pi를 사용할 수 있습니까? 어떻게해야합니까?


2
나는 이것이 실제 질문이며 Q & A 형식에 적합하지 않다고 생각합니다.
Alex Chamberlain

5
왜 안돼? 사람들이 Linux OS 이외의 다른 방법으로 RaPi를 사용하도록 요청할 수 있다고 생각하지 않습니까? 이 그룹의 조례 목록에서 그러한 질문을 할 수 없다는 섹션이 있습니까?
FarhadA

2
나는 그렇게 말하지 않았다. 나는 실제로 Linux를 사용하지 않는 일부 프로젝트를 보는 것이 꽤 멋지다고 생각하지만 실제로는 확실한 대답으로 질문하지 않고 토론을했습니다.
Alex Chamberlain

@AlexChamberlain 동의합니다-질문으로 편집했습니다. FarhadA-이것이 좋기를 바랍니다. 현재 상태에서는 닫힐 것입니다. 편집 내용을 검토하고 개선하십시오!
Alex L

좋아, 사실, 나는 이것이 Q & A 사이트이기 때문에 질문해야한다 :)
FarhadA

답변:


23

Raspberry Pi에서 베어 메탈 프로그래밍을 살펴본 결과 원하는 작업처럼 들립니다. 코드를 작동시키기 위해 많은 노력을 기울인 일부 사람들과 베어 메탈 프로그래밍에 대한 몇 가지 좋은 포럼 주제가 있습니다. 시작하려면 다음을 확인하십시오.

Raspi에서 베어 메탈 시작 안내서

베어 메탈에서 RPi 프로그래밍

베어 메탈 튜토리얼 1 기본 프로그래밍

또는 일반적으로 Raspberry Pi의 Bare Metal Forum으로 이동하여 둘러 볼 수 있습니다.

내 이해는 Broadcom 칩에 내장 된 부팅 순서로 인해 SD 카드에서 부팅해야한다는 것입니다. 부팅 순서에 대한 링크를 찾으려고하는데 Google fu가 작동하지 않습니다. 나중에 찾으면 편집하겠습니다.


3
또한이 자습서를 사용할 수 있습니다 : cl.cam.ac.uk/freshers/raspberrypi/tutorials/os 운영 체제 구축에 관한 것이지만 운영 체제에 대한 아이디어를 확장하면 임베디드 시스템에 적용 할 수 있습니다.
ohblahitsme

6

부팅하는 유일한 방법은 fat32 형식의 sdcard에서 시작하고 poweron에서 gpu 펌웨어로드로 이동하여 kernel이라는 이름의 arm 이진 파일을 실행합니다 .img 따라서 원하는대로하는 사용자 정의 커널을 만들고 싶다면 이 지점에서


3
예,하지만 내가하고 싶은 것이 아닙니다. 부팅 이미지를 찾기 위해 SD 카드로 이동하는 대신 칩의 부팅 코드를 변경할 수 있는지 알고 싶습니다. 대신 SPI 플래시 메모리를 사용하여 부팅하십시오. 이런 식으로 부팅 코드는 AT25FS040 또는 AT25DF641 또는 기타 유사한 장치와 같은 SPI 플래시 메모리에있을 수 있습니다. 임베디드 응용 프로그램의 경우 모든 코드를 저장하기에 충분하며 부팅 후 SDRAM에로드 할 수 있습니다. 그러나 가장 큰 과제는 부팅 ROM 코드를 변경하는 것입니다.
FarhadA

9
그것은 당신이 당신의 질문에 전혀 요청한 것이 아닙니다.
Alistair Buxton 2018 년

나는 알고 있지만 RaPi 부팅 순서에 대한 지식은 제한적입니다. 원래 질문에 투표하여이 현재 형식으로 편집하기 전에 올바른 질문을했습니다.
FarhadA

2
@ FarhadA-첫 번째 의견은 실용적이고 대답하기 쉬운 질문으로 생각됩니다. 이 질문의 원래 형태가 확실히 좋습니다.
Mark Booth

글쎄, RasPi 부팅 순서에 대한 지식은 제한적입니다. SD 카드에 간단한 부팅 파일을 만들고 내 확장 보드의 SPI 기반 플래시에서 응용 프로그램을로드하려고합니다. 나는 내 시스템에 SD 카드를 쓰는 것을 정말로 좋아하지 않지만 그렇게하는 유일한 빠르고 더러운 방법 인 것 같습니다. 이제 RasPi에 대한 간단한 부팅 코드를 만드는 방법을 배워야합니다.
FarhadA

4

이론적으로 CIL 코드로 컴파일되고 지원되지 않는 .NET 리소스를 사용하지 않으므로 Mono / Linux에서 실행되는 IBM S / 390 에뮬레이터를 C #으로 만들었습니다. 이를 통해 맞춤형 유한 상태 기계 해석기와 함께 플랫폼 독립적 인 제어 테이블을 사용하는 임베디드 솔루션이 가능합니다. 그래도 여전히 백그라운드에서 필수 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. PI의 삽입 된 SD 카드

  4. 전원을 껐다 켜십시오

여기에 이미지 설명을 입력하십시오

GitHub 업스트림 : https://github.com/cirosantilli/raspberry-pi-bare-metal-blinker/tree/d20f0337189641824b3ad5e4a688aa91e13fd764

시작

.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.