AVR128DAとかDBをもうちょっと使ってみる

●XMEGAの後継!機能満載でエラッタも満載
品種的にはXMEGAの後継となるAVR-Dxシリーズ。数々の新機能がありますがそれは
同時に数々のエラッタを仕込むこととなりエラッタシートとチップリビジョンに
注意しておかないとドハマリして目の下にクマつけてダブルピースしてしまいます。

現在、AVR128DAに代表されるAVR-DAシリーズとAVR-DBシリーズが流通しております。
DAとDBの違いはアナログ入出力がさらに強化されているのと異なる電圧のI/O
そしてDAに存在したエラッタが修正されていることです。

マイクロチップは過去のシリーズで出たエラッタは新しい奴で修正するよという
スタンスなのでしょうか…???これから買う人はDBシリーズ以降にしておけば変な
地雷踏まずに済むと思います。ただし使用前にエラッターシートは必ず目を
通しておいてください。


●製造開始直後のAVR32DAに存在した致命的エラッタ
さてAVRはアトメル時代からまず大きめの容量のチップ作ってそのあとシュリンク
していく量産体制の流れになっていますがAVR128DAが世に出て少し経った頃に
製造されたAVR32DAというチップに致命的エなエラッタが存在していました!!!

エラッタの内容は本来は4バイト必要なリセットベクタが2バイト刻みになっている
というものです。AVR32DAのフラッシュ領域すべてにアクセスするためにはリセット
ベクタで4バイトのjmp命令を使う必要があります。が、ハード的に発生する割り込み
要因は2バイトずつで詰め詰めになってるのでjmp命令ではとんだ先がめちゃくちゃ
になってrjmp命令を使用しなければならず、8kB分しかアクセスできません。

↓以下AVRのジャンプ命令の参考資料

RJMPは16bitオペコードなので2バイト
(フラッシュ8kB以下のデバイスはこちら)


JMPは32bitオぺコードなので4バイト
(フラッシュ8kB以上のでデバイスはこちら)

avr-gccに関しては4バイト区切りの割り込みベクタアドレスを前提に
スタートアップコードがビルドインされておりうんこつきのAVR32DAでは
どう頑張ってもまともに割り込みが使えません!


↑データシートよりAVR32DAの割り込みベクタの解説。
アドレスは2ワード(=4バイト)区切りなのがわかります。

AVRって最初に出た当初は"すっきり16bitオペコード"を売りにしてて伝統的に
ワード(16bit)でプログラムアドレスを表現してきたからシュリンク設計した人が
バイトアドレスと間違っちゃったんじゃないかな…

というわけでこの製造初期に出てしまったAVR32DAは回収され、現在流通している
物については正しい割り込みアドレス間隔になっているそうです。わたしは怖くて
使う気もないですけど!

ちなみに致命的すぎるエラッタゆえにエラッターシートには記載されておらず、
AvrFreaksで指摘があって初めて広く知られるようになったそうです。


●AVR128DAにもやっぱりあかんエラッタ
そして私が持っているAVR128DAもフラシュメモリがらみのエラッタがありますが、
それは下記の条件がすべて重なった時に起こります。

.侫薀奪轡緡琉茲鬟如璽仁琉茲0x8000から32kB分をマッピングして読み書きする
FUSE領域のBOOTCODEに0以外の数値が入っている(=APPCODE領域を有効にする)
NVMCTRL.CTRLBのBOOTRPをたててブート領域のプロテクションを行う

上記すべてが重なると32kB区切りのどの領域をマッピングしても最初のBOOTCODEの
領域が頭のほうにかぶさってきやがります!!


↑超わかりづらい公式のエラッタシートの解説DA!。


ブート領域を設定しなかったりLPMでフラッシュ領域のデータの読み取りするなら
全く気にする必要はありませんがせっかくデータ領域にフラッシュ領域のデータを
マッピングできるのですからせめて活用はしたいですよね…!


●AVR-Dxを救いたい
というわけでせめて32kB分だけでもPROGMEMしないでSTM32とかと同じようにconst
な値を置いてみたかったので上記エラッタを踏まないように配慮したうえで
リンカスクリプトをいじりフラッシュ領域のマッピング機能を最大限に活用する
作戦を取りました!


1.通常版の場合

マッピングを使用せず素直にPROGMEMした場合のプランです。
128kByte自由に使えますが64kB以上のPROGMEMの読み出しはfarポインタを使用する必要が
あります。


なお、私は使おうとするAVRのフラッシュ容量を見てfar使うか使わないかを使い分け
られるようにしてます。しかしなんでもかんでもfarにするとべらぼうにリソースを
食ってしまいますのでChaN師に倣いfarはなるべく使用しない方が吉です。

2.マッピングあり&フラッシュ容量32kBのマイコンとして使う

妥協案その1。AVR128DAを32kB分しか使わず残り96kBは見なかったことにしたら
32kByte全域にPROGMEMしないでもconstだけでアクセスできるわ♥ヤッター!
ってあほか!


3.マッピングあり&rodataだけ最終セクタに押し込む。

妥協案その2.リンカスクリプトをいじくり倒してrodataだけ96kB以降に押し込んで
この領域をマッピングする!
これが一番妥協できて無難ではないでしょうか?FONTX2みたいな馬鹿でかいファイル
おかない限りはリード専用領域32kBは十分すぎると思いますよぅ。




リンカスクリプトのいじる際のミソは__RODATA_PM_OFFSET__にデータ領域へマッピング
されたアドレス0x8000を指定することとtextの次にrodataが来るようにすること(重要)
順番間違えたらビルドが通らないです。


こんなわけでAVR−Dxシリーズの売りの一つだったフラッシュ領域のデータ領域への
マッピングも一応使いものになってきましたので少しは救いになったかと思います!


今回のソースコードは↓になります。回路はAVR128DA48-CuriosityNANOに準拠した
つくりとなっておりますが設定を変えてビルドしたらDBシリーズでも使用可能です。
AVR-DAとかDBとか買ったはいいものの持て余してる方はお試しください。

AVR128DA48 CuriosityNANO TestProgram.



●AVR-XMEGA、お前は救えない

上でちょっと触れたfar使う使わないの判定ですがXMEGAにも横展開しておきました。
対象はChaN氏のAVR版xprintfと私のavr版fontx2ドライバです。
FONTX2ドライバとかサイズでかいからさいっしょっからfar必須でしょ
とお思いかもしれませんがankコードだけなら10kbyteもないものが
あるので少しでもリソース減らすために追加してみました。

なんというか4年ぶりのxmegaの更新をしましたがここまでプログラムの規模が
でかくなるとやはりSTM32とかの32bitマイコンのほうが使いやすいなと感じます。

一方AVR使うならフラッシュ容量32kB以下のものを使っていくのが適材適所かなと
感じてます。進化の袋小路に入りこんだXMEGA。そこから生まれたAVR-Dxはどこまで
正当な進化を続けられるのか?これからの活躍を見届けたいと思います!




おまけ


超久しぶりにXMEGA触ったからAとAUの違いって何だろうと調べたらUSB機能追加の
ほかにPORTLが存在しなくて不可能だった4Port-EBIが完全に使用できるのが判明!
今さら遅いんだYO!

Comments

Post a Comment








Go to top of page