実装方針

以下ではADSP-BF533にTOPPERS/JSP 1.4を実装する上での方針を列挙します

コンテキスト

タスクコンテキストは最低割り込み優先順位であるIVG15に割り当てます。IPENDレジスタの値が$8000ならタスクコンテキストであり、それ以外の場合は非タスクコンテキストになります。

ユーザーモードは使用しません。

ディスパッチャ

ディスパッチャはサブルーチンコールとして実装します。ディスパッチャ内部の割り込み待ちで受け付けた割り込みは、非タスクコンテキストでの割り込みであると認識させなければなりません。そのため、ディスパッチャ内部の割り込み待ち状態はIVG14に遷移し、イベント・スタックに切り替えた状態で行います。

ディスパッチャ内部での割り込み待ちはIDLE命令を実行します。割り込みをウェイクアップイベントとして受け取ってIDLEから脱出した点で改めて割り込みを受け付けます。割り込みハンドラは割り込みがIVG15以外で受け付けられたことから、これを非タスクコンテキストでの割り込みと認識し、タスク・ディスパッチやタスク例外処理を行いません。

ディスパッチャ内部での割り込みをタスク・コンテキストでの割り込みと誤って認識してしまうと、ディスパッチャが再入呼び出しを受ける可能性があります。

CPUロック

IMASKレジスタに$C01Fを設定することでCPUをロックします。この状態ではIVG14も許されるので上のディスパッチャ内部での割り込み待ち状態への遷移が許されます。

命令はSTIを使います。CPUのアンロックはIMASKへの0xFFFFの書き込みを使用します。

割り込みからの復帰

ITRON4の実装では割り込みから復帰するときに一定の条件が整うと次のような動作を要求されます。

  1. 割り込みハンドラ(非タスクコンテキスト)からタスクコンテキストに遷移する
  2. 例外処理あるいはタスクディスパッチを実行する
  3. 割り込まれたタスクに戻る

割り込みハンドラのなかで漫然とRTI命令を実行するといきなり割り込まれたタスクに戻るため、上のシーケンスをたどることができなくなります。そこでタスクへの戻りを例外経由にすることで、制御の戻りと状態の戻りを分離しています。

タイマー

ティックの生成に必要なタイマーはGPタイマーを使います。マクロの変更でコアタイマーも利用できます。

依存部の分割

BF533への移植を行うにあたって、タイマーやシリアルポートはシステム依存部として扱います。つまりBlackfinコアをプロセッサとして扱い、内蔵ペリフェラルはシステム要素として扱います。Blackfinシリーズ間で移植する場合は当然システム依存部を変更します。

割り込みの振り分け

割り込みハンドラは割り込み順位ではなくデバイスの割り込み番号によって振り分けます。ここで割り込み番号とはSIC_IMASK中でのビット位置を指します。

割り込み順位で振り分ける場合、ユーザーの割り込みハンドラでSIC_IMASKを確認しなければなりません。これを省くことでコード・サイズの縮小とバグの排除を狙います。

設計時の注意

CPU依存部の心臓であるdispatch( )を割り込みハンドラの設計時には、あらかじめ以下の点をきっちり抑えておく必要があります。

Blackfin空挺団 | プログラム | EZ-KIT | コア&ペリフェラル | TOPPERS/JSP | こぼれ話 | DSP掲示板