TCP/IPプロトコル・スタックの省メモリ開発事例(後編) ――ROM 8Kバイト,RAM 0.5KバイトにTCP/IPプロトコル・スタックを収める
●○● Column ●○●
◆H8/Tinyへの移植◆
R8C/Tiny向けに開発したTCP/IPプロトコル・スタックの移植例として,H8/Tinyシリーズ(H8/3687)への実装について説明します.移植の際に考慮したH8/TinyとR8C/Tinyの違いは以下のとおりです(表A).
H8/Tiny
|
R8C/Tiny
|
|
エンディアン | ビッグ・エンディアン | リトル・エンディアン |
アライメント | 必要 | 不要 |
割り込み制御 | 優先レベルなし | 優先レベルあり |
1) エンディアン
H8/Tinyはビッグ・エンディアン形式でメモリ上にデータを格納します.そのため,R8C/Tinyとは異なり,パケットの送受信の際にヘッダ部の16ビット長,32ビット長のデータに対してエンディアンを変換する必要はありません.
2) アライメント
H8/Tinyが16ビット長,32ビット長のデータに対してアクセスできるのは,これらのデータが偶数番地に配置されている場合に限定されます.そのため,変数のアライメントに注意する必要があります.R8C/Tinyでは,これらのデータが奇数番地に配置されている場合でもアクセス可能です.
3) 割り込み制御
R8C/Tinyでは,マスク可能割り込み(場合によっては受け付けなくてもよい割り込み.以降,割り込みと表記)に優先順位(優先レベル)を設定できますが,H8/Tinyにはその機能はありません.
R8C/Tinyでは,割り込みの要因ごとに割り込み優先レベル(ILVL)を設定します(割り込み制御レジスタに設定しておく).割り込み要求が受け付けられると,マイコンのフラグ・レジスタ内のプロセッサ割り込み優先レベル(IPL)に,受け付けた割り込みの優先レベルが設定されます.IPLは,現在保持している値より優先レベルの高い割り込み要求だけを受け付けるため,優先順位を考慮した多重割り込み制御を容易に行えます.
● H8C/Tinyでは割り込みの違いをドライバで吸収
エンディアンやアライメントの違いについては,本文で述べたように関数やunionによる宣言で対処しました.割り込み制御の違いについては,H8/Tinyの割り込みハンドラの最初と最後に以下のような処理を追加して,R8C/Tinyの割り込み制御を模擬することにしました.
まず,割り込みハンドラの最初の部分では,現在の割り込みよりも優先順位の低い割り込みを無効に設定します.そしてマイコンのコントロール・レジスタ内にある割り込み許可ビットを有効にして,すべてのマスク可能割り込みを許可します.
割り込みハンドラの最後の部分では,現在の割り込み処理が終了したらコントロール・レジスタ内にある割り込み許可ビットを無効にして,いったんすべてのマスク可能割り込みを禁止します.そして,割り込みハンドラの最初で無効にした割り込み許可ビットを有効に戻します.