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

これまでのところ、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) { } }
      
      







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



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



All Articles