GNU系のリンカスクリプトはなんとなく理解して読めるようになってきた。リンカスクリプトを勉強するのに1週間はいらない。どのようなセクションの名前が必要かは分からないし、スタートアップルーチンを一から自力で書くのは厳しいし、シンボルの値を手軽に確認する方法は気になるけれども分からない。今は適度にコンパイラやマイコンメーカが提供してくれてるスタートアップコードを使っておこう。
Qiitaの記事を読んでいてUARTで送信したファームウェアをRAMに展開して、そのまま実行するブートローダを作る、みたいにはまだメモリを使いこなせていない。組込みOS自作本を読み進めよう。
OSについて思ったこと、30日OS自作本も組込みOS本も独自コンパイラやツールを使って説明するので、ARMに置き換えて学ぶ際の勉強コストが高い。書いてある環境を用意して手を動かすだけもうすこしスイスイ進むだろう。どちらも古い本だし、今みたいに便利なツールが簡単に手に入る時代じゃなかったからかな。
CubeIDEでLチカ
CubeIDEを使って、Nucleo-F429ZIでLチカをやってみた。mbedを使わないため、GPIOに直接アクセスするところがポイント。
CubeIDEが出力してくれるNucleF4xx用のHALライブラリを使って、Lチカコードを記述する。HALライブラリの中身はさほど難しくないけれども、マイコンの仕様を知らないといけないのでモチベが上がらない。そのうちやろう。あと、デバッグを開始せずに書き込む方法が気になった。
Lチカなんて余裕だろうと思っていたのだが、なぜかLD1が点滅せず焦った。回路を調べてLD1を点滅させるにはPB0(GPIOBのPin0)を上げ下げすればいいことはわかったのに、なぜかうまくいかない。結論から言うと、CubeIDEが出力したGPIO初期化コードが間違っていた。LD1がPC9に繋がっている設定でGPIOを初期化していたのでPB0を出力モードにできておらず、GPIOの上げ下げが外部に反映されなかった。
freertos, cubeide, openocd
CubeIDEを使うとFreeRTOSを組み込んだプロジェクトも簡単に生成してくれる。RTOSを使うとリンカスクリプトをどのように改造しないといけないのかが気になっていたのだが、全く同一だった。FreeRTOSを使う場合、リンカスクリプトに特に手を加える必要はなさそうだ(ただしCubeIDEが生成したリンカスクリプトを使う)
SysTickじゃなくてハードウェアタイマを使ってよというダイアログが出た。SysTickってなんなんだろう。今は動かすのが目的なのでパス。
デバッガをST-Link(gdb)以外にOpen-OCDにすることもできた。ただ、引数に-rtos freertos
または-rtos
auto
を指定するとfailed to execute MI
command
と出てGDBに接続できなかった。デバッガの画面ですべてのタスクの状態が確認できたら素敵!と思ったのだが、簡単にはいかなかったようだ。タスク初期化前にブレークポイントを張るとだめだよ、という情報もあったが問題はなおらず。この問題とは関係ないかも。
freeRTOSは使ったことがなかったので、細かいこと何も知りません。きっとITRONとそんなに変わらないでしょ。