start.s
TOPPERS/JSP 1.4のリセット後の呼び出しシーケンスはこんな感じです
- start
- kernel_start()
- cpu_initialize()
- sys_initialize()
- exit_and_dispatch()
- kernel_start()
start
startはハードウェアリセットからのエントリーです。m68k実装ではstart.Sで定義されています。BLACKfinの場合はstart.asmになるでしょう。この部分ではループ・カウンタとLxレジスタの初期化、イベント・スタックとヒープの初期化を行います。startは最低限のハードウェアの設定を行って直ちにkernel_startを呼び出します。kernel_startは帰って来ませんので戻ってきた後の手当ては不要です。
kernel_start
kernel_startはこの中で唯一のターゲット独立関数です。kernel_startは直ちにcpu_initialize()とsys_initialize()を読んだあと、フック関数があればそれを実行します。VisualDSP++ではTOPPERS/JSPタイプのフック関数はリンカーが対応しないため使いません。最後にexit_and_dipatch()を呼び出します。
cpu_initialize
初期化のうち、CPUアーキテクチャーに依存しボードやペリフェラルに依存しない部分をここで初期化します。BLACKfinの場合はイベント処理部の初期化をこの部分で行います。sys_initialize
ボードやオンチップ・ペリフェラルに依存する部分をここで初期化します。BLACKfinの場合はCPLB、キャッシュ、PLLなどはここで初期化します。exit_and_dispatch
exit_and_dispatch()はkernel_startの中で呼び出されます。これは少し問題になります。exit_and_dispatch()はタスクコンテキストの中で呼ばれるものなのですが、kernel_startは非タスクコンテキストです。そのためexit_and_dispatch()の中には何らかの仕掛けが必要です。ここの設計はよくないと感じます。