「devkitPPC - 開発メモ」の編集履歴(バックアップ)一覧に戻る

devkitPPC - 開発メモ - (2005/09/01 (木) 13:06:39) のソース

* 開発メモ(覚書き)

- 32バイト境界&br()devkitPPCでは、多くの変数(構造体やメモリブロック)を32バイト境界に載せないといけません。&br()境界を揃える方法は3つあります。
-- ATTRIBUTE_ALIGNマクロを使用する(C/C++の変数宣言時に有効)。
-- memalign関数でメモリブロックを確保する(C/C++のメモリブロック宣言時に有効)。
-- 「[[.align 5>http://www.watalab.cs.uec.ac.jp/students/yuke/directive.html]]」を使用(GNU AS(アセンブラ)にて有効)
- ATTRIBUTE_ALIGNマクロ&br()こんな感じに使います。
> TDImage ATTRIBUTE_ALIGN(32) tdimg;
- memalignについて&br()激しくマイナーですが、libcには[[memalign>http://www.linux.or.jp/JM/html/LDP_man-pages/man3/posix_memalign.3.html]]という関数があります。&br()これは、第一引数boundaryの倍数に相当するメモリブロックを第二引数size(単位:バイト)分確保する関数です。&br()まず、この関数の説明で混乱します。バウンダリの意識が薄いと説明を読んでもよくわかりません。&br()しかも、引数の値が入れ替わっていても希望のサイズのメモリブロックが確保できてしまいます。&br()本家のサンプルさえこれを間違えています。&br()正しい使用方法は以下のとおりです。&br()32バイト区切りで、300バイト以上のメモリブロックを確保します。&br()32の倍数で300以上の近似値は320バイトなので、320バイトのバッファが確保されます。
> p = (void*)memalign( 32, 300 );

- memalignの落とし穴&br()memalignの処理で重要なことがあります。&br()それは、バウンダリをあわせることです。&br()先の説明でもあるように、この関数は引数を間違える人が多いです。&br()引数を間違えると、32バイト境界にバウンダリが合わない可能性があります。&br()浅い経験上、これが問題になったことはありませんが、エンバグの元になることはたしかです。

- キャッシュ&br()[[参考>http://www.gcdev.com/phpBB2/viewtopic.php?t=1458]](後日追記します)&br()[[参考>http://www.xilinx.co.jp/xlnx/xil_ans_display.jsp?iLanguageID=2&getPagePath=17151&BV_SessionID=@@@@2131011366.1125277646@@@@&BV_EngineID=cccgaddfidjdelicefeceihdffhdfjf.0]]

* 参考リンク
- [[yuke@watalab(電気通信大学)>http://www.watalab.cs.uec.ac.jp/students/yuke/]]
記事メニュー
目安箱バナー