Raspberry PiでTOPPERS(TRON系OS)
Raspberry Piにて、TRON系リアルタイム(RTOS)であるTOPPERS OSをベースに開発する情報です。
IoTの基盤としては、Raspberry Pi+TRONはコスト面・機能面で最高の環境となるでしょう。
TOPPERSプロジェクト(名古屋大学大学院)にて掲載されました!(2016/11/07)
2017年05月28日 更新
Raspberry Pi(2/3)用TOPPERS/FMPカーネル
Raspberry Pi 2/3(SVCモードのみ) で、TOPPERS/FMPカーネルのSampleが動作する環境です。
TOPPERS/FMPカーネルは、マルチコアで動作します。
Github の RaspberryPi_TOPPERS_FMP リポジトリ
ターゲット依存部のみなので、ターゲット非依存部と組み合わせてビルドしてください。
FAT32でフォーマットしたSDカードに、以下の3つのファイルを入れ、
Raspberry Pi 2/3 に挿入して電源を入れれば動作します。
- bootcode.bin
- start.elf
- (RP2/3では 「kernel_old=1 disable_commandline_tags=1」と記載したconfig.txt)
- kernel7.img
シリアル通信は、Raspberry Piはピンヘッダより以下のように結線してください。
112500bps、データビット数8、パリティ無し、ストップビット1,フロー制御なし、です。(俗に言う112500,8N1)
- Pin 6 : GND →PC側のGNDにつなぐ
- Pin 8 : TXD →PC側のRXDにつなぐ
- Pin 10 : RXD →PC側のTXDにつなぐ
とりあえずは シリアル通信でログ出力させて(デフォルトでは無効)、
Sample1 の動作を観察すると良いでしょう。
動作例1:
- 2 キーを押す。 (プロセッサ1・タスク2を指定)
- a キーを押す。 (プロセッサ1・タスク2をact_tskで起動)
- 3 キーを押す。 (プロセッサ1・タスク3を指定)
- a キーを押す。 (プロセッサ1・タスク3をact_tskで起動)
- 1 キーを押す。 (プロセッサ1・タスク1を指定)
- r キーを押す。 (レディキューを回転)
→ タスクが切り替わる。
動作例2:
- 1 キーを押す。 (プロセッサ1・タスク1を指定)
- > キーを押す。 (プロセッサ1・タスク1の優先度をHIGHに指定)
- 2 キーを押す。 (プロセッサ1・タスク2を指定)
- a キーを押す。 (プロセッサ1・タスク2をact_tskで起動)
- < キーを押す。 (プロセッサ1・タスク2の優先度をLOWに指定)
- 1 キーを押す。 (プロセッサ1・タスク1を指定)
- d キーを押す。 (プロセッサ1・タスク1をdly_tsk10秒)
→ プロセッサ1・タスク2が動作する。
→ 10秒後、プロセッサ1・タスク1が動作する。
Q キーで停止します。
Raspberry Pi(Zero/1/2/3)用TOPPERS/ASP3カーネル
Raspberry Pi Zero/1/2/3 で、TOPPERS/ASP3カーネルのSampleが動作する環境です。
TOPPERS/ASP3カーネルは、1コアで動作します。
Github の RaspberryPi_TOPPERS_ASP3 リポジトリ
ターゲット依存部のみなので、ターゲット非依存部と組み合わせてビルドしてください。
FAT32でフォーマットしたSDカードに、以下の3つのファイルを入れ、
Raspberry Pi Zero/1/2/3 に挿入して電源を入れれば動作します。
- bootcode.bin
- start.elf
- (RP2/3では 「kernel_old=1 disable_commandline_tags=1」と記載したconfig.txt)
- kernel.img (RP2/3では kernel7.img)
シリアル通信は、Raspberry Piはピンヘッダより以下のように結線してください。
112500bps、データビット数8、パリティ無し、ストップビット1,フロー制御なし、です。(俗に言う112500,8N1)
- Pin 6 : GND →PC側のGNDにつなぐ
- Pin 8 : TXD →PC側のRXDにつなぐ
- Pin 10 : RXD →PC側のTXDにつなぐ
とりあえずは シリアル通信でログ出力させて(デフォルトでは無効)、
Sample1 の動作を観察すると良いでしょう。
動作例1:
- 2 キーを押す。 (タスク2を指定)
- a キーを押す。 (タスク2をact_tskで起動)
- 3 キーを押す。 (タスク3を指定)
- a キーを押す。 (タスク3をact_tskで起動)
- 1 キーを押す。 (タスク1を指定)
- r キーを押す。 (レディキューを回転)
→ タスクが切り替わる。
動作例2:
- 1 キーを押す。 (タスク1を指定)
- > キーを押す。 (タスク1の優先度をHIGHに指定)
- 2 キーを押す。 (タスク2を指定)
- a キーを押す。 (タスク2をact_tskで起動)
- < キーを押す。 (タスク2の優先度をLOWに指定)
- 1 キーを押す。 (タスク1を指定)
- d キーを押す。 (タスク1をdly_tsk10秒)
→ タスク2が動作する。
→ 10秒後、タスク1が動作する。
Q キーで停止します。
Raspberry Pi ブートローダーについて
Raspbianのfirmwareの以下の2ファイルを利用します。
- bootcode.bin
- start.elf
ブートローダはRaspberry Pi本体を初期化して、カーネルをメモリに配置してスタートさせる動作をします。
- RPZero/1では、kernel.imgを0x00008000番地に展開し、ARMを0x00008000番地からスタートします。
- RP2/3(SVCモード)では、上記2ファイルと、「kernel_old=1 disable_commandline_tags=1」と記載したconfig.txtと、kernel7.imgを使用します。
0x00000000番地に展開し、ARMを0x00000000番地から4コア同時にスタートします。
RPi2ではキャッシュ無し、RPi3ではキャッシュ有りで起動してきます。 - RP2/3(HYPモード)では、上記2ファイルと、kernel7.imgを使用します。
0x00008000番地に展開し、ARMコア0のみを0x00008000番地からスタートします。
キャッシュの有無は要調査。
Raspberry Pi用JTAG有効化+OpenOCD設定ファイル
レジスタ値調査
Raspberry Piの、レジスタの値を読み出したものをまとめています。
Raspberry Pi 1 Type B+ レジスタ値一覧(RP1 B+ registers list)(Excel)
Raspberry Pi 1用TOPPERS/JSPカーネル
Raspberry Pi 1で、TOPPERS/JSPカーネルのSampleが動作する環境です。
Github
Github にて、TOPPERS以外のRaspberry Piのベアメタル関連のネタを公開しております。
技術証明ファイル(TOPPERS/ASP3・FMPのRaspberry Piポーティング)
参考
- TOPPERSプロジェクト
- BCM2835 dataseet
- BCM2835 datasheet errata
- ARM1176JZF-S Technical Reference Manual
- dwelch67/raspberrypi · GitHub
- JTAGkey clone
- Tutorial: Preparing Raspberry PI for JTAG Debugging
- The OpenOCD debugging Eclipse plug-in | GNU ARM Eclipse
- Raspberry Pi2をJTAGデバッグできました - /home/tnishinaga/TechMEMO
- QA7_rev3.4.pdf
- PeterLemon/RaspberryPi · GitHub
- ARM アーキテクチャ リファレンス マニュアル ARMv7-A および ARMv7-R エディション
- Cortex™-A7 MPCore™ Technical Reference Manual
- Cortex™-A7 Floating-Point Unit Technical Reference Manual
- Cortex™-A7 NEON™ Media Processing Engine Technical Reference Manual
- Raspberry Pi • View topic - Trying Bare Metal on Raspberry Pi 2
- mrvn/test · GitHub