start.s

TOPPERS/JSP 1.4のリセット後の呼び出しシーケンスはこんな感じです

  • start
    • kernel_start()
      • cpu_initialize()
      • sys_initialize()
      • exit_and_dispatch()

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()の中には何らかの仕掛けが必要です。
ここの設計はよくないと感じます。