アセンブリ言語TIPS

仕事が忙しくて空挺団をアップデートできるのがいつかわからないため、BlackfinのTIPSをちょっとメモしておきます。

SPに即値を書いてはいけない

以下のようにSPに直接値を書き込んではいけません。

sp.L = lo(stacktop);
sp.H = hi(stacktop);

この2行の間で割り込みが入るとプログラムが暴走します。SPに値を設定するときには次のように書きます。

r0.L = lo(stacktop);
r0.H = hi(stacktop);
sp=r0;

アプリケーション・プログラマには関係ない話です。OSを書く人は注意。私は割り込みハンドラの頭でスタックをタスク・スタックから割り込みスタックに切り替えるときに足をとられました。

割り込みのアンロック

sti命令を使って割り込みを禁止してはいけません。割り込みは必ずcli命令で禁止します。imaskに特定のビットパターンを書き込んで一部割り込みを禁止する場合、つい

r0 = INTRMASK(z);
sti r0;

と書いてしまいがちです。しかしこの方法では割り込みの禁止まで数クロックかかりますのでそれまでの間割り込みから保護されません。これを安全に実行するには

r0 = INTRMASK(z);
cli r1;
sti r0;

とします。cliは割り込み禁止を即有効にしますので、この方法なら安全です。デバイス関連のプログラムを書く際、気をつけてください。