読者です 読者をやめる 読者になる 読者になる

FRDM-KL25Z その6

さて、FRDM-KL25Zのプログラミングのために、IAR Embedded Workbench IDE
選んでるが、Eclipseベースのフリーな環境もあるらしい。
今はコード量が問題ではないので、コード制限評価版として IAR を選択した。
至れり尽くせりなのは、FRDM-KL25Zメーカ(nxp)のサイトで、各社ワークベンチ向け
のサンプルコードがダウンロードできるところ。

IAR向けのサンプルでLチカを試すことができた。

 

さて、それはさておきスタートアップはどうなってるのか。
IARのマニュアルを確認してみる。IARのFAQでスタートアップに関するものがあり、
そこからPDFがダウンロードできる。

 

PDFの中身を確認すると、
Cortex-M0/M3/M4向けのベクタテーブルが抜き出されている。
IARのインストールディレクトリを確認すると・・・あった。
C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\src\lib\thumb\vector_table_M.s

------------------------------------------------------
__vector_table

DCD sfe(CSTACK)
DCD __iar_program_start

DCD NMI_Handler
・・・
------------------------------------------------------

ふむふむ、IAR社のCortexマイコン用スタートアップだから、iar_...なるほど。
ちなみにDCD命令はARMサイトで以下のように説明されている。
DCD ディレクティブは、ワード単位でメモリを割り当てて 4 バイト境界で整列させ、実行時のメモリの初期内容を定義します。

ここでは関数アドレスを示す__jar_program_startをメモリに割り当てている感じか。

このコードの手前に

------------------------------------------------------
EXTERN __iar_program_start
PUBLIC __vector_table
------------------------------------------------------

 

とあるので、__iar_program_startは別の場所に定義されている。
同じフォルダに、cstartup_M.cがあり、内容を確認すると、あった・・
------------------------------------------------------
void __iar_program_start( void )
{
__iar_init_core();
__iar_init_vfp();
__cmain();
}
そういえばこれ、アセンブラコードとc言語コードの両方の記述が可能であり
(Cortex-Mプロセッサがそーいう風にできている)、
同じ名前のアセンブラファイル cstartup_M.sに以下のように定義されている。

__iar_program_start:
FUNCALL __iar_program_start, __iar_init_core
BL __iar_init_core
FUNCALL __iar_program_start, __iar_init_vfp
BL __iar_init_vfp
FUNCALL __iar_program_start, __cmain
BL __cmain
REQUIRE __vector_table

やってることは一緒である。さて、まず__iar_init_coreはどこで定義されているのか。

cstartup_M.cで以下のように宣言されているので
__weak void __iar_init_core( void );
乱暴に言えばなくても怒られないexternである。

C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\src\lib\arm\coreinit.s
ここに定義されているっぽい。アプリ側のフルgrepでは見つからなかったので、
唯一ここにあるだけか?__iar_init_core_v6とあるので、ARMv6アーキテクチャ向け。
MRC/MCRでステータスレジスタを初期化してる感じ。あまり踏み込まないでおこう。

__cmainはどうだろう? ここからmain関数がコールされるので
ユーザアプリは動くわけだけど、さて、pdfに書かれているようなcmain.sが
存在しない。

cライブラリを含めたIARの便利ライブラリをロードしつつ、アプリを動かす
のだとすると、その部分(おそらくCortexプロセッサをどう初期化するか含めて)
IAR資産なのかと推測。

とりあえずリセット割り込みから、Cortexプロセッサの標準的な初期化を行い、LEDチカまでの最小限の流れが追えるとよいのだが、便利なものはシステムが肥大化し、
内部は隠蔽されるの法則か・・

Cで全てを抽象化するなら、Linuxアプリコードを書くのと大して変わらず面白くない・・・

うーむ、このへんにしておこう。