Linux OSなしでRaspberry Piを使用していますか?


33

組み込みアプリケーションの開発のために、Raspberry Piを純粋な組み込みCPUユニットとして使用することに興味があります。Raspberry Piにはかなりのメモリを搭載した強力なCPUが搭載されているため、優れた組み込みボードになります。

Linux OSなしでRaspberry Piを使用することは可能ですか?これどうやってするの?


2
これは本当の質問ではなく、Q&A形式には適さないと思います。
アレックスチェンバレン

5
何故なの?Linux OS以外の方法でRaPiを使用することについて人々が質問できるとは思わないでしょうか?このグループの細則のリストのどこに、そのような質問をすることはできないと言っているセクションがありますか?
FarhadA

2
私はそれを言わなかった。Linuxを使用していないプロジェクトを見るのは実にクールだと思いますが、実際に決定的な答えを出して質問するのではなく、議論のポイントを作りました。
アレックスチェンバレン

@AlexChamberlain同意します-質問に編集しました。FarhadA-これで問題ないことを望みます。現在の状態では閉じられます。編集内容を確認して改善してください!
アレックスL

わかりました、本当です、これはQ&Aサイトですので、質問しなければなりません:)
FarhadA

回答:


23

Raspberry Piのベアメタルプログラミングを調べましたが、やりたいことのように聞こえます。ベアメタルプログラミングに関するいくつかの優れたフォーラムトピックがあり、コードを機能させるために多大な労力を費やした人々がいます。開始するためにこれらをチェックしてください:

Raspiのベアメタルの開始ガイド

ベアメタルでのRPiのプログラミング

ベアメタルの基本的なプログラミングチュートリアル1

または一般的には、Raspberry Piのベアメタルフォーラムにアクセスして、参照するだけです。

私の理解では、Broadcomチップに組み込まれているブートシーケンスのため、SDカードからブートする必要があります。ブートシーケンスのリンクを見つけようとしていますが、Google fuが機能していません。見つけたら後で編集します。


3
さらに、このチュートリアルを使用することもできます:cl.cam.ac.uk/freshers/raspberrypi/tutorials/osオペレーティングシステムの構築に関するものですが、オペレーティングシステムのアイデアを拡張する場合、組み込みシステムに適用できます。
-ohblahitsme

6

起動する唯一の方法は、fat32形式のsdcardから、poweronからkernel.imgという名前のアームバイナリファイルを実行するgpuファームウェアのロードに移行することです。したがって、目的のカスタムカーネルを作成する場合は、この時点で


3
はい、しかし、それは私がやりたいことではありません。チップのブートコードを変更できるかどうかを知りたいので、SDカードに移動してブートイメージを探すのではなく、代わりにSPIフラッシュメモリとそこから起動します。このように、ブートコードはAT25FS040やAT25DF641などのSPIフラッシュメモリ、または他の同様のユニットに配置できます。組み込みアプリケーションの場合、これらはすべてのコードを保存するのに十分であり、ブート後にSDRAMにロードできます。しかし、大きな課題はブートROMコードを変更することです。
-FarhadA

9
それはあなたが質問で尋ねたものではありません。
アリスターバクストン

私は知っていますが、RaPiブートシーケンスについての私の知識は限られているため、元の質問に適切な質問があり、この現在の形式に投票されて編集されました。
FarhadA

2
@FarhadA-ここでの最初のコメントは、それ自体が実用的で回答可能な質問であるように思えます。確かにこの質問の元の形式の方が良いでしょう。
マークブース

さて、RasPiのブートシーケンスについての私の知識は限られています。SDカードに簡単なブートファイルを作成し、独自の拡張ボード上のSPIベースのフラッシュからアプリケーションをロードすることに傾倒しています。私のシステムにSDカードがあるのは本当に好きではありませんが、それはそうするための唯一の迅速で汚れた方法のようです。次に、RasPiの簡単なブートコードを作成する方法を学ぶ必要があります:)
FarhadA

4

C#でIBM S / 390エミュレーターを作成しました。理論的には、CILコードにコンパイルされ、サポートされていない.NETリソースを使用しないため、Mono / Linuxで実行されます。これにより、プラットフォームに依存しない制御テーブルとカスタムの有限状態マシンインタープリターを使用した組み込みソリューションが可能になります。ただし、バックグラウンドには依然として重要な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

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"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.