スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

SDカード・トランスポータの作成(その20)

バッファ用変数を4byteアライメントで配置するにはリンカスクリプトを書く必要がありそうだ。avr-libcのマニュアル(C:\WinAVR-20090313\doc\avr-libcに入っている)を見ると ATmega644P に使われるアーキテクチャ属性は avr5 であり、デフォルトのリンカスクリプトっポイのが C:\WinAVR-20090313\avr\lib\ldscripts\avr5.x にある。このファイルを作業フォルダへコピーして編集し、Makefileにリンカスクリプトとして指定してやれば出来るはず。だが、少々めんどくさい気がする。そこで、今回は .noinit セクション を利用しようと思う。

.noinit セクションは、avr-libc-user-manual によると .bss セクションの一部で、スタートアップ時に0初期化されないセクションらしい。また、この領域を使うには、配置する変数の宣言時に以下の様にセクション指定を加える必要があるみたいだ。

int bar __attribute__ ((section (".noinit")));

また、avr-gccのオプションに以下の定義を加える事によって配置先をリンカスクリプトを書き換える事無く変更する事ができるみたいだ。

-Wl,--section-start=.noinit=addr


試しに、このセクションを指定していない状態でmapファイルを見ると、見事にこの領域は使用されていなかった。これを利用すれば、バッファ用変数を4byteでアライメントされた領域に配置することができる。

ただ、闇雲に .noinit セクションを配置してしまうと色々と支障をきたしてしまう気がする。バッファ用変数のサイズは固定(現時点では 2560byte(512x5))なので、RAMの末尾からこのサイズ分巻き戻した位置をセクションの先頭位置にする。

通常、スタック領域はRAMの末尾から先頭方向に向かって使用されるので、このままでは .noinit セクション と領域がかぶってしまう。なので、スタックの位置も変更する必要がある。これはavr-libcのマニュアルによると、以下のオプションで変更することが出来るみたいだ。

-Wl,--defsym=__stack=0x8006ff

配置はこんな感じ…。

sdc_memory_map



具体的にこれらを実現するには、バッファの宣言は

volatile uint8_t read_buff[5][512] __attribute__ ((section (".noinit")));

また、Makefileに以下の内容を追記する。

CFLAGS += -Wl,--section-start=.noinit=0x800700
CFLAGS += -Wl,--defsym=__stack=0x8006ff


これで完了だと思われる。念のため、コンパイルした結果をmapファイルで調べてみると、ちゃんと指定した位置に配置されてました。

スポンサーサイト

コメントの投稿

非公開コメント

黒ねこ時計 くろック D02
プロフィール

jujurou

Author:jujurou
運営HP:チャコの部屋
Twitter:jujurou

カレンダー
07 | 2017/08 | 09
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
最新記事
最新コメント
カテゴリ
ユーザタグ

ぺるけ RaspberryPi Linux トランジスタ式ミニワッター TRminiWatterPart4 MPD OpenOCD イーサネットコンバータ FON2405E DAC buildroot FM3ペリフェラル BeagleBoneBlack FM3評価ボード library OpenGL mingw ODROID-U2 TL-WR700N Edison bitbake KiCad 計測 VMware シングル FM4 ミニワッター 6N6P プリアンプ 

月別アーカイブ
ランキング

FC2 Blog Ranking

カウンター
検索フォーム
リンク
RSSリンクの表示
QRコード
QRコード
ライセンス
クリエイティブ・コモンズ・ライセンス
Twitter
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。