WinAVR+BTC068でソフト開発
すいません m(_ _)m、本記事はブログ引越時に書式が崩れました。順次修正中です。
マイコン開発環境と言えばいろいろなものがありますが、BTC068用としてはベストテクノロジーから配布されている、GCC Developer Liteというすばらしい開発環境があります。しかし、ドキュメントの最後に、
「また、GCC Developer Liteは単なるヘルパーソフトウェアです。機能も少なく拡張性はないといっても過言ではありません。GCCの機能をフル活用するにはGCC Developer Liteから卒業し、ご自分の趣向に合った開発環境を整えられるようになる事を切望します。」
というのがあります。初めてマイコンを触ったときは、ベストテクノロジーのSH7047F+GDLだったんですが、その後もAKI-H8/3664や3694を使いながらもGDLを利用させてもらって(なんだか申し訳ないです)、現在はようやくKPIT(時々GDL)。切望されているのであれば、ここは一発奮起して、別の開発環境であるWinAVR(というか、GDLのベースとなっているらしい)を使ってみようと思います。
WinAVRの入手
WinAVRはGCCを使ったIDEみたいで、無償でSource Forge.net-WinAVRから入手することができます。ダウンロードしたのはWinAVR-20060421-install.exeです。ダウンロードしたファイルを起動すれば、あとはデフォルトで「次へ」を押していけばインストールは完了します。
さて、今までGDLとか、せいぜいKPITのGCCしか使った事がありません。つまり、マイコン特有の初期化ファイルみたいなものって一度も書いた事が無いんです。というわけで、これからがんばってみようと思います。GDLの中身をのぞけば…もとい、GDLを参考にさせていただければなんとかなるかなって思います。
まずはサンプル実行
さて、まずは何か簡単なものということで、GDLサンプルを実行してみようと思います。簡単に、ということで、拡張メモリは使わずにやります。
まず最初に、WinAVRの場合、自分でMakefileを書かないといけません。といっても、1つちゃんとしたものを作ってしまえば、後は使い回しができるはずです。で、Makefileってどうやって書くのかな?と調べてみると、WinAVRにはMFileという、Makefileを生成してくれるツールがある事がわかりました。このツールはMakefileのテンプレートを持っており、メニューから設定を変更していくと、最終的に必要なMakefileが得られるというものです。
MFileを早速起動
[Makefile]というメニューの中にあるアイテムを上から順番に設定してくと、Makefileが設定され、最後に保存すれば新しいmakefileが作成されます。ただ、ちょっとバグがあるとのことで、MFileの元ネタとなっているmakefile_templateを修正する必要があります。
* Front Page – AVR Wikiの「mfileに関するバグ(2) WinAVR20060421」を参考にさせていただきました。オリジナルからこちらに変更しておくと、「main.oが無いよー」とか「__AVR_ATmega128__が無いよー」と怒られなくなるので、お薦めです。
とりあえず、こんな感じで設定してみました。設定は、[Makefile]というメニューから行います。
- Code generation
コード生成のための設定です。 - Main file name…
ビルドされるファイル名を入力 - MCU Type – ATmega – atmega128
とりあえず初期値のままです。 - Output format – ihex
とりあえず初期値のままです。 - Optimization level –
とりあえず初期値のままです。 - Debug format – AVR-ext-COFF (AVR Studio 4.07+, VMLAB 3.10+)
* Front Page – AVR Wikiの「AVRStudio(4.07以降)でavrgccをデバッグする方法」内の「WinAVRにおける、COFの作り方」を参考にさせていただきました。 - C standard level – gnu99
とりあえず初期値のままです。 - C/C++ source file(s)…
追加するソースファイルを入力します。先のFront Page – AVR Wikiにて紹介されているテンプレートを使うといいんですが、CPPSRCになぜかmain.cppが残ってしまうので、後でMakefileをちょっと修正する必要があります。 - Assembler source file(s)…
追加するアセンブラファイルを選択します。 - printf() options – none/standard
とりあえず初期値のままです。
WinAVRってライブラリがついてて、printf()とかscanf()のライブラリが使えるようです。 - scanf() options – none/standard
とりあえず初期値のままです。 - External RAM options
- none
拡張メモリを設定するとややこしそうですので、今回は無しで、noneとします。 - AVRdude
Flash ROMへ書き込むためのツールです。 - Programmer – stk500
初期値のままです。 - Port – com1
パソコン環境に合わせて設定します。もしメニューに無ければ、一旦、makefileを作っておき、AVRDUDE_PORTという行を修正しても大丈夫です。ちなみに、BTC068は、stk500に対応したブートローダが入っているようです。
* 「stk500って何ですか?」と聞かないで下さい…勉強中。
* ベストテクノロジの「2006年05月02日 [UPDATE] GCC Developer Liteバージョンアップのお知らせ」にAVRDUDEの挙動が変わった事と対処方法がありますが、関係あるんでしょうか…。AVRdudeのパラメータに「-F」を入れなさいとあります(stk500の後ろ)。
最後に[File]-[Save As…]で名前をつけて保存します。もし、いきなり[Save]とやって締まった場合、MFileがインストールされているフォルダの中に、「Makefile」というファイルができますので、それを移動してもいいと思います。
その他、「F_CPU」というCPUクロックを書くところがありまして、ここは手で修正して「F_CPU = 16000000」としました(何に使っているのかなー)としました。
WinAVRで試しにビルド
試しに、ベストテクノロジーにて公開されている、ATmega128のサンプルプログラム、Smpl3.cを実行してみます。BTC068には、モード切替スイッチとLEDが実装されていますが、このスイッチとLED、実は普通のI/Oポートに接続されています。BTC068にはブートローダというプログラムがあらかじめ書きこまれており、GDLからプログラムを書きこむときは、ブートローダがまず起動して、それからデータを送り込むとフラッシュROMに書きこむ、という方法でプログラムを書きこんでいます。じゃあ、ブートローダってどうやって書き込むの?という話になりますが、これはまだ調査中ですので、まとまったらアップしますのでしばしお待ちくださいな。
で、話は戻りますが、Smpl3.cというのは、モードスイッチを操作するとLEDがチカチカしながらシリアル通信をする、というサンプルプログラムで、BTC068に電源さえ接続すれば動作確認ができる、というプログラムです。
んでは、WinAVR(Programmers Notepad 2)を起動し、まずは[File]-[New]-[Project]と操作してプロジェクトを作ります。そして、Projects画面の中の新しいProjectを選択して右クリックメニューを出して[Add Files]でSmpl3.cを追加しました。
そして先のMakefileも同じフォルダに入れればビルド準備完了です。
「ぶぃるどぉぉぉ!」
あら?
ちがいました。WinAVRでは、
「めぇいくおぅるぅぅぅ!」
お、いい感じです。エラーがでました。いや、いいんです。まずは動いた、ということで。GDLで準備されているシリアル通信のライブラリはリンクしていないので、ヘッダファイルのロードができないとかでエラーがでます。当たり前と言えば当たり前ですが、予想の範囲です。さて、どうやってリンクしたらいいんでしょう???
GDLのライブラリを試しにリンク(試しにですよ、試しに)
というわけで、困ったときにはGDL先生に尋ねる事にします。GDLでビルドすると、コマンドラインからビルドするためのバッチファイルを作ってくれます。で、これを見ると、「-I」でインクルードファイルのディレクトリを指定、「-L」でライブラリのディレクトリを指定しているようです。
パスの書き方ですが、「C:\PROGRA~1\BestTech\GCCDEV~1\TARGET\ATMEGA~1」のように、コマンドプロンプト用の書き方をする必要があるようです。Makefileって、スペースでデータを区切るようなので、ディレクトリ名(フォルダ名)にスペースが入っているとダメっぽいですね。試しに「C:\Program Files\BestTech\GCC Developer Lite\TARGET\ATmega128」という感じで書いてみたら、「んなディレクトリ、無いよ」って言われてエラーになりました。
というわけで、Makefileに以下の行を追加します。
- CFLAGS定義がいっぱいあるところの一番下に…
CFLAGS += -I C:\PROGRA~1\BestTech\GCCDEV~1\TARGET\ATMEGA~1 - LDFLAGS定義がいっぱいあるところの一番下に…
LDFLAGS += -L C:\PROGRA~1\BestTech\GCCDEV~1\TARGET\ATMEGA~1 -lm128
そして再び、
「めぇいくおぅるぅぅぅ!」
お、無事にリンクできたようです。
(そういえば、LDFLAGSの中に、linker_script.xが定義されているコメントアウトされた行があります。リンカースクリプトってよく聞くけど、なんだっけ?)
こ、これで大丈夫なのかな???不安なので、引き続き、リンカスクリプトの調査をしました。
リンカスクリプト
GDL先生に尋ねたら(いや、GDLのインストールされたフォルダを徘徊しただけですけど)、やっぱりリンカスクリプトなるものがあるようです。GDLだと「atmega128.x」と「atmega128extram.x」です。なんでみんなこんな訳のわからないものを書けるんだろう?」と思ったので、調査しました。
WinAVRのインストールされたフォルダの中を徘徊した結果、
C:\WinAVR\avr\lib\ldscripts
というフォルダの中にサンプルらしきものが入っているのを発見しました。5種類はいってまして、GDLのものと比較すると、これの中のavr5.xというのが一番近い感じです。で、それぞれどこが違うのかなーと比較してみたところ、最初の方にある、
MEMORY
{
text (rx) : ORIGIN = 0, LENGTH = 128K
data (rw!x) : ORIGIN = 0x800060, LENGTH = 0xffa0
eeprom (rw!x) : ORIGIN = 0x810000, LENGTH = 64K
}
だけが異なっている事がわかりました。さらにGDLに添付されているものとも比較してみましたが、やはりこのセクション?だけが異なるようです。ここは見ての通り、メモリのサイズとかアドレスが書いてあるようです。ということで、まずは「avr5.x」をSmpl3.cのあるフォルダにコピーして「linker_script.x」にリネーム、そして中身はGDLと同じにすることにします。
MEMORY
{
text (rx) : ORIGIN = 0, LENGTH = 128K
data (rw!x) : ORIGIN = 0x800100, LENGTH = 4k
eeprom (rw!x) : ORIGIN = 0x810000, LENGTH = 4K
}
「text」ってのは、プログラムするROMの領域サイズです。というわけで、ATmega128の仕様に合わせて128Kとしておけばよさそうです。次の「data」は、たぶん、RAMの事ですね。これは、ATmega128のメモリマップを見ればわかりますが、最初の256Byteは、「レジスタファイル」(なんで「ファイル」なんでしょう?)、「I/Oレジスタ」、「拡張I/Oレジスタ」に割り当てられており、それ以降がデータ等が置けるRAMとして使えるようになっているようです。それが「0x800100」なわけですね、きっと。
というわけでこの変更を反映させるため、Programmers Notepad2にて、一旦、「Tools」⇒「[WinAVR] Make Clean」して、もう一度、「Make All」します。で、Mapファイルを比較してみたら、「Memory Configuration」が異なっていることがわかりました。リンカスクリプトファイルが無い状態ですと、「data」、「eeprom」共に64kバイトぐらい取られて、あと開始アドレスがATmega128だとレジスタにかぶっている(ATmega103だと大丈夫だったかな?)のですが、これがリンカスクリプトに書いてある通りになります。じゃあ、リンカスクリプトファイルが無い時、WinAVRがこの情報をどうやって作ったとか、リンカスクリプトが無くても、どっかで設定できるんじゃないか?とか疑問はいろいろありますが、とりあえずほっておく事にします。
ATmega128への書き込み
BTC068は、stk500に対応したブートローダが入っているとのことですので、WinAVRから、少々ビビリながらやってみます。だって、二度と書き込めなくなったりしたら怖いじゃないですかー。
書き込みは、BTC068とパソコンをシリアルケーブルで接続して行います。あ、BTC068のモードスイッチを「Write」にして電源入れます。それから、シリアルポート番号に注意してください。先の、MFileで設定したポートがここで使われるのですが、Makefileの「AVRDUDE_PORT」を直接編集しても大丈夫です。
う、どうかな。smpl3.cは、モードスイッチを操作するとLEDが点灯、同時にシリアルポートに状態表示をするものなんですが。 といわけで、勇気を振り絞って、
「ぷろぐらぁぁむうぅ!」
おー、さくさくっと書き込み完了。
とりあえず動いちゃったんですが、これでよかったのかなー。
あとがき
なんだか結局、GDLに頼りっぱなしでした。あと、32kByteの拡張RAMを使う場合は、どうやったらできるか?というのをちょっと調査しているのですが、Makefileの変更、リンカスクリプトファイルの変更、それから何やら「.section」が「.init1」で「リセット直後に実行」なんです。GDLを見れば解があるのですが、せっかくなので、仕組みぐらいは理解しようと思って調査しています。
今のところはAVR LibC(日本語訳)にて解説記事を見つけたので、これを読みながらGDLをにらめっこしています。そして、なんか他の書き方無いのかなー(理解の証に)と模索しているところです。わかったらアップします。
これで、GDLの制約事項である、「1つのソースファイルでしか構成できない」という制限から開放されるのですが、やっぱ、GDLは良くできています。とっつきの良さは世界一!(SISOの知る範囲はたかがしれてますけど…)
最後に…
ベストテクノロジーの人ってすごいなー。
役に立ちそうな情報を調べたのでメモ。
開発情報
開発環境
- GCC Developer Lite (Best Technology)
日本語の統合環境でとっかかりにはすごくいい。ソースを分けられないがとにかくシンプル。 - Source Forge.net-WinAVR
IDEタイプのGNU GCC compiler for C and C++。英語版。 - AVR Studio
AVR用シミュレータ?Atmelのホームページよりダウンロードできる。 [PRODUCTS]→[AVR 8-Bit RISC]→[Tools & Software]と入って言ったページの下の方にある。 現在の最新直リンク…AVR Studio 4.12 (build 460)
Eclipseで構築してみてください。