割込みディスパッチャの変更

割り込みディスパッチャにも気になる部分があったので連休最後の今日、手を入れました。一番変えたのは割り込みからの戻り方です。
一番外側の割り込みからタスクに戻る場合、ITRON4標準は必要に応じてタスク例外とディスパッチを行うよう要請しています。この二つはタスク・コンテキストで実行しなければなりません。割込みディスパッチャ内でタスクに戻らずにタスク・コンテキストに移行するのは簡単ですが、その後タスク・コンテキスト状態を変更せずにタスクに戻るのは至難の業です。
これまではいったん例外を起こして例外からタスクの中断点に戻る方式を取っていました。これはRTOSとしては一般的な方法だそうですが、例外へ遷移するオーバーヘッドや、例外ディスパッチャ先頭での振り分けオーバーヘッドが無駄です。
実はBF535にはセルフ・ネスティングと言う特殊な割込み技法がありましたので当初はそれを遣う予定でした。これを使うとretiレジスタ間接ジャンプのようなことが出来ます。しかし、BF533のハードウェア・リファレンス・マニュアルにはセルフ・ネストがなく、実験しても動作しないためあきらめていました。
新しいBF53x/BF56xのプログラミング・リファレンス・マニュアルにはセルフ・ネストの説明があり、デフォルトでディセーブルとのこと。これをイネーブルにして使うことで、割込みディスパッチャからの戻りがすっきりしました。
セルフ・ネストからの戻りは、retiレジスタのLSBを1にすることで実行できます。この状態でrti命令を実行すると、割込み実行順位を変えずに割り込まれた場所に戻ることが出来ます。ただし、IPENDのGIDISビットはクリアされます。この点はTOPPERS/JSP for Blackfinでは問題になりません。

SIO

ほったらかしだったSIOをナントカしようかと昨年末あたりから考えていました。jsppdic\simple_sio\st16c2550.cは、名前から想像できるとおり16550A互換です。BF533のUARTは16450互換ですが、先のファイルを見る限りFIFOは使っていないようなのでおそらくそのまま使えるでしょう。デバイス用デスクリプタに初期化時にアドレスを与えますが、それはsys_config.hで宣言します。このデバイスTOPPERS/JSPのSH3/ms7727cp01実装で利用されています。ms7727cp01.hで宣言され、sys_config.hにインクルードされています。