ソースツリーを読む

LPC1768への移植に向けてTOPPERS/ASP for CQ-STARMのソースコードを読んでいます。

依存部は2層

以前、TOPPERSのユーザーMLで、「ターゲット依存部を3層にしたらどうか」と提案したことがあります。調べてみて驚きましたが、もう6年前のことです。
TOPPERS/JSPのターゲット依存部は「CPU依存部」「システム依存部」の2層になっています。CPU依存部はその名のとおりCPUに依存する部分です。システム依存部はそれ以外で、システム・タイマー・コントローラやシリアルIOのコードを含みます。
ところが、広く知られているように、今はワンチップマイコンの時代です。システム・タイマーやシリアルIOが使うペリフェラルはチップに格納されており、システム依存部を作る度にこれらのプログラムをコピーする事は、メンテナンス上よくないですし、何より美的感覚にそぐわないです。
そこで、「CPU依存部」「チップ依存部」「システム依存部」の3層にすることを提案したのですが、最終的に高田先生の「複雑になりすぎる」という一言で却下されたのでした。その後、TOPPERS/JSP for Blackfinや、TOPPERS/JSP for LPC2388ではid:monamour555さんの助言を参考にターゲット依存部を3層にしています。
ASPカーネルCQ-STARM依存部を読む限り、2層のままです。当面このままとしても、そのうち3層にしてしまおうと思っています。

シリアルはUSART

CQ-STARMのマイコン、STM32F103VBは16450互換UARTを持っていません。代わりに同期通信も可能なUSARTを持っています。高機能であることは結構ですが、リファレンス/マニュアルを斜め読みした感じではUART非互換です。
シリアルIOのコードは他のプロセッサから持ってくるか、書き直すしかありません。

NVIC使いにくそう

一度TOPPERS/JSP for CORTEX-M3というプロジェクトを立ち上げたことがあります。その後頓挫してしまいましたが、四苦八苦した中でいくつか鮮烈に覚えていることの一つがNVICの使いにくさです。
中でも「割り込み番号と割り込みビットマスクの位置があっていない」という点には飽きれました。設計者は素人かと思ったほどです*1
さて、カーネルの割り込み待ちから割り込みのエントリコードを追いかけている時に「あれっ」と気づいたことが一点あります。TOPPERS/ASPの割り込みサービス・ルーチンはNVICのエントリではなくメモリ上のexc_tbl[]配列に格納されいるのです。
NVICは割り込みソースに対応するISRを直接呼んでくれる便利な仕掛けです。おまけにISRはC言語で書けます。ところがASPカーネルアセンブリ言語で記述されたエントリ・コードが全NVICエントリに登録されており、あとでメモリ上のテーブルから対応するISRを呼び出しています。
これは、TOPPERS/ASPの割り込み出入り口コードが単純なCサブルーチンにならないためです。TOPPERS/JSP for m68Kでは、この問題を解決するために、割り込みソースごとにユーザーISRと出入り口コードをマクロで融合させて専用ISRを生成していました。とてつもない手間ですし、なによりメモリの無駄です。
これはどのプロセッサでもやっている方法ですのでCORTEX-M3だけをせめるのはかわいそうですが、以外に根深いところでRTOSベンダーとプロセッサ・ベンダーの溝は断絶は大きいと再認識した次第です。

*1:BlackfinのEVCの優先順位指定にも同じ問題がある