むき出しの鉄でラズベリーパイをプログラムします

これまでのところ、Raspberry Piは依然として最も人気のあるテクノロジーガジェットの1つであり、このボードには、ほぼすべてのオペレーティングシステムをインストールできます。 しかし、今日は、ハードウェアのみを使用して、オペレーティングシステムなしでこのボードのプログラムを作成する方法について説明します。

キャッチは何ですか?


一見したところ、タスクは簡単に思えます。キールをダウンロードし、プロジェクトを作成します...しかし、それはそれほど単純ではありません。 すべてのプログラミング環境(keil、IAR、Atolic)は最大のARM9をサポートします。 これは、ARM9よりも前にベアメタルに書き込み、次にLinuxに書き込むという、書かれていない規則によるものです。 しかし、まだ抜け穴が1つあります。arm-none-eabi-gccはすべてのARMをサポートします。
2番目の問題は、このプロセッサ(BCM2835)の構成ファイル、ヘッダーなどがないことです。 ここでは、Raspberry Piブートローダーが役立ちます。 そして彼が所有権を持っていることは何もありません。 2つの機能を実行します。プロセッサとその周辺機器を初期化し、kernel.imgカーネルに制御を転送します。 プログラムをカーネルとして偽装し、ブートローダーがそれを起動します。

何が必要ですか?


1)Raspberry Pi自体、そのためのメモリカードおよび電源。
2) プロセッサへのDatashit
3)Linuxがインストールされたコンピューター(ただし、Windowsでも可能です。私は知りません、試していません)。
4)ステップ3からコンピューターにインストールされたクロスコンパイラー。arm-none-eabi-gccを使用します。
5) このパパの内容。

料理。


FAT16でメモリカードをフォーマットし、 このフォルダーの内容をドロップする必要があります 。 これは、ブートローダーとカーネルです。 次に、そこからkernel.imgおよびkernel_emergency.imgファイルを削除します。 これはLinuxカーネルですが、必要ありません。

最初のプログラム。


これで、最初のプログラムの作成を開始できます。 main.cファイルを作成し、次のコードを記述します
int main (void) { while(1) { } } void exit (void) { while(1) { } } 

ご覧のとおり、このプログラムは何もしません。 exit関数は、何らかの理由でコンパイラに必要です。
今それを収集します。
arm-none-eabi-gcc -O2 -mfpu = vfp -mfloat-abi = hard -march = armv6zk -mtune = arm1176jzf-s -nostartfiles main.c -o kernel.elf
arm-none-eabi-objcopy kernel.elf -Oバイナリkernel.img

生成されたkernel.imgファイルはメモリカードにスローされます。 できた!

GPIO


まったく何もしないプログラムに満足することはまずありません。 次に、電球を点灯してみます。
最初に、GPIOがあるアドレスを宣言します(これはデータシートで読むことができます)。
#define GPIO_BASE 0x20200000UL

また、ポートが出力用に構成されていることを決定する変数(GPIO_GPFSEL1)と、ポートに低レベル(つまり、ライトがオン)を供給する変数(GPIO_GPCLR0)を宣言します。
#define GPIO_GPFSEL1 1
#define GPIO_GPCLR0 10

そして最後に、電球を点灯するためのメイン関数を変更します。
 volatile unsigned int* gpio; int main(void) { gpio = (unsigned int*)GPIO_BASE; gpio[GPIO_GPFSEL1] |= (1 << 16); gpio[GPIO_GPCLR0] = (1 << 16); while(1) { } } 


組み立て、フラッシュ、そして喜びます。

次のパートでは、タイマーと割り込みを試してみます。

Source: https://habr.com/ru/post/J208726/


All Articles