_mi_initialize

昨日の説明が言葉足らずだったので補足しておきます。
ADSP-BF533にはROM化の方法が二つあります。

ROMブート
プロジェクトオプションのloadタブを使って設定する方法です。プログラムとデータは圧縮されてldrファイルに出力され、これをROMに書き込みます。BF533のマスクROM内のローダーがこれを解凍して内部/外付けメモリーに展開し、実行します。実行はL1命令メモリから始まります。
ノーブート
dxeファイルをスプリッターを使ってそのままhexファイルに変換します。EPROMには実行プログラムがそのまま焼きこまれます。BF533はマスクROM中のローダーを実行せず、外部EPROMのプログラムを直接実行します。変数の初期化には_mi_initializeを使います。

ノーブートは性能上のペナルティが大きいため、よほどの理由がない限りROMブートが使われます。どうしてもノーブートを行う場合、_mi_initializeに変数の初期化をさせるためにプログラマは三つの作業をしなければなりません。
まず、プロジェクトオプションのLinkerタブを開き、Additional Optionsの欄に

-meminit

を追加します。これはリンカーに対して_mi_initialize用のデータを追加するよう指示するものです。
次にLDFを開いて、_mi_initializeによって初期化を行わなければならない出力セクションにRUNTIME_INITを指定します。リンカーはこの印のついた出力セクションを圧縮してEPROMに格納するよう再配置します。

constdata RUNTIME_INIT
  {
    INPUT_SECTION_ALIGN(4)
    INPUT_SECTIONS($OBJECTS(L1_data_a) $LIBRARIES(L1_data_a))
    ...
    INPUT_SECTIONS($OBJECTS(constdata) $LIBRARIES(constdata))
  } >MEM_L1_DATA_A

最後に圧縮データを格納する専用の出力セクションを用意します。以下の例の"bsz_init"はゼロ初期化されるデータのことです。リンカーはゼロ初期化するデータをすべてこのセクションに押し込みます。.meminitは非ゼロの値で初期化するデータを格納する領域です。いずれの領域もMEM_ASYNC0セグメントに配置されますが、これはEPROM/フラッシュROM領域です。

bsz_init
  {
    INPUT_SECTION_ALIGN(4)
    INPUT_SECTIONS( $OBJECTS(bsz_init) $LIBRARIES(bsz_init))
  } >MEM_ASYNC0

.meminit 
  {
  } >MEM_ASYNC0

以上の3ステップはee239に詳しく書いてあります。繰り返しになりますが、これはノーブートの場合であり、ROMブートの場合はまったく無視してかまいません。_mi_initializeはROMブート時には何もせずに帰ってきます。