※この記事は、筆者自身のブログに連載していたものを読みやすく1ページにまとめたダイジェスト版です。無断転載などではありませんのでご了承ください。
概要
ちょっとしたデバイス作成に、業務に趣味にと大人気のMicrochip社の8bitマイコン「AVR」。
そのAVRマイコンに32bit版があったなんてご存知でしたか?
今回取り上げるのは、その「AVR32」です。
詳細は英語にはなりますが、このページを御覧ください。
かつては「AP7」と「UC3」の二種類のコアを販売していました。
「AP7」は、いわゆるアプリケーション・プロセッサーというべきもので、Linuxも動作するほどの高い性能を持っていました。
一方の「UC3」は、マイクロプロセッサー、いわゆるマイコンと呼ばれるカテゴリーに属します。
今回取り上げるのもこの「UC3」の方です。
ARMでいうところの「Cortex-A」コアが「AP7」に、「Cortex-M」コアが「UC3」に相当すると思えばイメージし易いですかね?
共にAtmel社の独自設計、8bitのAVRとは全く異なる設計思想の32bitRISCコアとなります。
このAtmel社が辿った運命、この記事でも触れましたが、PICマイコン擁するライバルのMicrochip社に買収されてしまいます。
Microchip社もPIC32(このカーネルもそのうち公開予定)などの32bitマイコンを販売しており、この統合によってこのAVR32は淘汰されてしまいました。
現在Microchip社では、新規設計非推奨の扱いとなっています。
どっかで似たような話を最近書いたような…?
結局、Microchip社のPIC32も思うように販売が伸ばせず、ARMコアの製品ラインを展開することとなります。
歴史の闇に沈んでいったAVR32。
あまり市場に受け入れられなかったのは事実ですが、実際に扱ってみると相当に優れた設計であることが分かりました。
このまま埋もれさせるのは惜しい…。
そこで、この不幸なAVR32に「μITRON4.0」準拠のRTOS(リアルタイムOS)であるTOPPERS/ASPを移植してみました。
せめてもの供養…。
もしかしたら、RTOSがあれば使ってくれる人もいるかもしれない!…そんな思いです。
新規設計非推奨の扱いではありますが、それは仕事で使う上での問題。
市場在庫分を購入して、趣味で使う分には、まだまだ有力なマイコンであると言えます。
その証拠に、秋月電子通商さんでは、AVR32は3種類も!在庫が豊富な状態で販売されています。
●AVRマイコン AT32UC3B0512
●AVRマイコン AT32UC3B064
●AVRマイコン AT32UC3L064
値段を見ていただければ分かると思いますが、高い性能に見合わずとても安いです。
もはや投げ売りです!
特に「AT32UC3B0512」の場合は、同じような性能のSTM32だったら多分1,000円くらいしちゃうと思います。
…まあ、パッケージがQFPなのでハンダ付けは難しいですが。
昨今の半導体不足で入手困難なARM系マイコンの代打として、悲劇のマイコンAVR32の無念を晴らすため(そして僕らの強い味方、秋月電子通商さんの不良在庫処分のため!)、このマイコンで電子工作はいかがですか?
必要なもの
まずは、今回のターゲットとなる「AT32UC3A3-XPLD」です。
こちらでは、まだまだ入手可能です!
6,000円くらいです。
次に、デバッガです。
「Atmel-ICE」っていいます。
秋月電子さんで16,800円ですね。
高い!…と思われるかもしれませんが、これ一台あるとAtmel系は今回のAVR32やAVRの8bitのシリーズ、SAM(ARM)シリーズのデバッグも出来ちゃいます。
Microchip社のマイコンの中でもAtmel系のシリーズを普段お使いの方は買っておいて損はないですよ。
とはいえ、躊躇する値段ですよね…。
ダウンロード/GitHub
ソースコードの入手は、こちらからどうぞ。
とは言っても、このソースコードをダウンロード、もしくは「git clone」しても、絶対にビルドが通りません。
このソースコードは未完成です。
なぜなら、Microchip社のドライバを後から付け加える必要があるんです。
そのMicrochip社のドライバのライセンスの条項が理解に難しく、公開、および再配布しない方が無難と判断したためです。
ですので、今後この記事では、それらのソースコードの入手方法やコピーする場所などを事細かに書いていくつもりです。
すご~く面倒ですが、お付き合いしていただけると嬉しいです。
ビルドは、まだやっちゃダメですよ~。
開発環境の構築(Microchip Studio編)
早速、開発環境を構築していきます。
まずは、Microchip社の純正の統合開発環境(IDE)である「Microchip Studio」のインストールからです。
詳しい手順については、同じMicrochip社のAVRを使用した「TOPPERS/ASP Arduino Mega2560版」の時に書いた記事が参考になります。
このページ(TOPPERS/ASP - Arduino Mega2560版 開発環境の構築(Microchip Studio編))をそのまま参考にして作業して下さい。
ただし、インストーラーで開発ターゲットのアーキテクチャを選択する部分には要注意!
以下のような画面が表示されたら、必ず「UC3」のチェックを忘れずに!
今回の「TOPPERS/ASP AVR32版」においても、「Microchip Studio」と「Eclipse」の二つのIDEを使用する方針です。
開発環境の構築(Eclipse編)
さて、デバッガを使うための「Microchip Studio」のインストールに続き、コーディングとビルドを行うための「Eclipse」をインストールします。
まずは、今回使う「AVR32」用のツールチェーンの環境変数の設定を行います。
ツールチェーンは、「Microchip Studio」のインストールにより既に以下のディレクトリにセットアップされているはずです。
C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr32\avr32-gnu-toolchain\bin
環境変数の設定方法は他のページで調べていただくか、あるいは手前味噌で恐縮ですが、私のブログのページ(TOPPERS/ASPのビルドからデバッグまで~GNUツールチェーンの導入)の「環境変数の設定」の項目を御覧ください。
ただし、パスは…
C:\Program Files (x86)\GNU Tools ARM Embedded\7 2017-q4-major\bin
…となっているところを…
C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr32\avr32-gnu-toolchain\bin
また、このページの「パスの確認」の項目で打ち込むコマンドも、以下のように変わります。
続きまして「Cygwin」のインストールを行います。
基本的には「gcc-core」、「make」、「diffutils」、「perl」と「git」の5つのパッケージを含むようなCygwin環境を構築すれば良いです。
もしよろしければ、私のブログのページ(TOPPERS/ASPのビルドからデバッグまで~Cygwinの導入)を参考にしてください。
次に、ソースコードをゲットしちゃいましょう。
以下のコマンドでソースコードのクローンを行います。
$ git clone https://github.com/RyutaroMorita/asp_avr32_gcc.git
ダウンロードとGithub、いずれの場合も「asp_avr32_gcc」というディレクトリの名前を「asp_1.9.2」などと改名すると、上記のページと同じ状況になります。
さて、コンパイラーをインストールして、ソースコードもダウンロードしました。
早速ビルドを~!って思う気持ちはわかりますが、やめておきましょう。
どうせ、必ずビルドは失敗します。
なぜならば、ソースコードに色々加えなければならないからです。
その手順も追って説明いたしますので、ここはグッと我慢。
それよりも先に「Eclipse」のインストールを行います。
あまりにも古すぎるものを除けば、好きなバージョンの「Eclipse」をインストールしてください。
よろしければ、このページ(TOPPERS/ASPのビルドからデバッグまで~Eclipseの導入)を参考にしてください。
Atmel Software Framework (ASF)とは?
ASFとは、ドライバ、プロトコル、スタック、コーディングユーティリティ、ビルドシステムなどを開発者に提供するソースコードのライブラリです。
いわゆる純正のライブラリパッケージであり、これを使用するとCPUに内蔵されているペリフェラル(周辺機器)を簡単に利用することができるというものです。
今回の「TOPPERS/ASP AVR32版」のカーネル内でも、割り込み、タイマーやシリアル通信ドライバなどは、このASFのドライバを使用しています。
ところが、このASFのソースコードのライセンスの条項が不明瞭なために再配布できません。
そのため「TOPPERS/ASP AVR32版」のソースコードが不完全なものとなり、そのままではビルドが通らず、通すためには手動で不足分のソースコードをコピーしていただくという手間を強いることになってしまいました。
面目無いです…。
では、そのASFのソースコードを何処から入手すれば良いのか?
そのためには、インストールした「Microchip Studio」上で雛形となるプロジェクトを作って、そこで生成されたASFのソースコードを「TOPPERS/ASP AVR32版」のソースツリーにコピーするという方法を採ります。
雛形プロジェクトの作成
まずは「Microchip Studio」を起動して下さい。
画面上部の「File」、「New」、「Project...」メニューを順にクリックしていきます。
以下のようなダイアログが表示されます。
ここでは「GCC ASF Board Project」を選択し、ダイアログ右下の「OK」ボタンをクリックしましょう。
これで「GccBoardProject1」という名前のプロジェクトを作成したことになります。
このプロジェクト名、覚えておいてください。
続いて、以下のようなダイアログが表示されます。
まずは「Extensions」コンボボックスに注目してください。
デフォルトでは「Atmel ASF(x.xx.x)」と言った具合に、「Microchip Studio」をインストールした時点での最新版のASFを使用するように選択されています。
今回の場合、デフォルトの最新版でも多分大丈夫なのでしょうが、検証をしていないので「Atmel ASF(3.49.1)」に設定してください。
これで動くことを確認してから、最新版を試すことをオススメします。
気持ち悪いから最新版で試したい!って方は、貴殿のご武運をお祈りします!
使用するASFのバージョンを設定したら、そのコンボボックスのすぐ左、「Select By Board」のラジオボタンをクリックします。
このASFのバージョンでサポートされている多くの評価ボードがリストアップされています。
その中から、今回使用する「UC3-A3 Xplained - AT32UC3A3256」を選択し、ダイアログ右下の「OK」ボタンをクリックします。
すると、以下のようにダイアログが消えて、元の「Microchip Studio」の画面に戻ります。
ただし「ASF Wizard」というタブが表示されていますね。
このタブの左上、「Project:」という表示のコンボボックスに注目してください。
このコンボボックスをクリックすると、作成した「GccBoardProject1」というプロジェクト名が選択できるようになっているので、これをクリック!
すると「ASF Wizard」というタブは、以下のような表示に切り替わります。
この画面の見方なのですが、左側のリストには、このプロジェクトで指定したデバイスである「AT32UC3A3256」で使用できるASFのライブラリが表示されています。
右側のリストには、このプロジェクトで既に選択されている(使用する)ASFのライブラリが表示されています。
デフォルトで選択されているのは「GPIO」と「Generic board support」のみですね。
つまり、左側のリストから右側のリストに項目を移動させることにより、自由に使用するASFのライブラリをプロジェクトに付け加えることができる訳ですね。
今回の「TOPPERS/ASP AVR32版」に必要な最低限のASFライブラリは以下の4つです。
●GPIO - General - Purpose Input / Output (driver)
●Generic board support (driver)
●TC - Timer / Counter (driver)
●USART - Serial interface (service)
このうち、上の2つは既に選択されていますので、残りのOSタイマーとして使用する「TC - Timer / Counter」と、デバッグ・シリアルに使用する「USART - Serial interface」の2つを追加しましょう。
まずは「TC - Timer / Counter」から。
左側の「Available Modules」リストから「TC - Timer / Counter (driver)」を選択して、「ASF Wizard」タブの下部にある「Add」ボタンをクリックします。
すると、無事、右側の「Selected Modules」リストに「TC - Timer / Counter (driver)」が追加されたでしょうか?
同じ要領で「USART - Serial interface」も追加しちゃいましょう。
左側の「Available Modules」リストから「USART - Serial interface (service)」を選択して、「ASF Wizard」タブの下部にある「Add」ボタンをクリックします。
すると、右側の「Selected Modules」リストに「USART - Serial interface (service)」が追加されるはずです。
以上で、必要なASFライブラリの設定は終わりました。
次は、この設定通りにASFライブラリのソースコードをプロジェクトに吐き出させる作業です。
なんてことはないです。
ただ「ASF Wizard」タブの下部にある「Apply」ボタンをクリックするだけです。
以下のダイアログが表示されます。
特にやることもなく「OK」ボタンをクリックします。
以下のように、派手な表示の変化もなく作業は終了します。
ちょっと不安ですね?
ちゃんとソースコードが吐き出されているかどうか、後で確認しましょう。
さて、必要なソースコードを雛形プロジェクトへ吐き出させたようなので「Microchip Studio」を一旦終了させましょうか。
左上のバッテン(X)をクリックすると以下のダイアログが表示されています。
この雛形プロジェクトを保存するかどうかを問われます。
保存しておいた方が良いでしょう。
(「Yes」ボタンをクリックです。)
もしこの先、無事に「TOPPERS/ASP」の起動に成功して、イザ何かを作ろう!となった場合、今回追加したASFライブラリだけでは絶対に足らなくなることでしょう。
評価ボードにセンサーを繋げて、そのセンサーとSPIで通信するとか、AD変換を使いたいだとか…。
その際には、再び今回の手順で必要になったASFライブラリを追加して、ソースコードを吐き出させて、更にそれを「TOPPERS/ASP」のソースツリーにコピーしなければなりません。
そういう意味では、この雛形プロジェクト、結構使用頻度が高くなるかもしれませんよ?
大切に取っておきましょう!
さて、一連の作業で吐き出されたASFライブラリのソースコードがどうなっているのか?確認しておきましょう。
特に変わったことをしていないのであれば、雛形プロジェクト「GccBoardProject1」は以下のディレクトリに保存されているはずです。
C:\Users\<ユーザー名>\Documents\Atmel Studio\7.0\GccBoardProject1
さらに、このディレクトリの中にある、これまた「GccBoardProject1」というディレクトリの中は以下のようになっています。
さらにさらに、このディレクトリの中にある「src」というディレクトリの中は以下のようになっていますでしょうか?
ここで現れる「ASF」と「config」(さらに「asf.h」)こそが、欲しかったモノです!
これらが見つかれば、作業は成功です!
Atmel Software Framework (ASF)のコピー
先程作成した雛形プロジェクトのディレクトリと、「TOPPERS/ASP AVR32版」のソースツリーのディレクトリを同時に2つエクスプローラーで開いておきましょう。
記事通りに作業すると、雛形プロジェクトは以下のディレクトリに保存されているはずです。
C:\Users\<ユーザー名>\Documents\Atmel Studio\7.0\GccBoardProject1
同じく、TOPPERS/ASPのソースツリーは以下のディレクトリに保存されているはずです。
(「asp_avr32_gcc」や「asp_avr32_gcc_master」を「asp_1.9.2」に改名した場合。)
C:\cygwin64\home\<ユーザー名>\asp_1.9.2
さて、2つ開いたエクスプローラーでそれぞれ以下の場所を表示するようにします。
まず、雛形プロジェクトの方は、以下のディレクトリへ移動させます。
C:\Users\<ユーザー名>\Documents\Atmel Studio\7.0\GccBoardProject1\GccBoardProject1\src
次に、TOPPERS/ASPのソースツリーの方は、以下のディレクトリへ移動させます。
C:\cygwin64\home\<ユーザー名>\asp_1.9.2\target\at32uc3a3_xpld_gcc
雛形プロジェクトの方のディレクトリに注目!
以下の3つのディレクトリとヘッダーファイルを確認して下さい。
この3つを開いてあるもう一方のエクスプローラー、TOPPERS/ASPのソースツリーの方にコピーします。
結果、TOPPERS/ASPのソースツリーの方は、以下のようになりましたか?
これで、ASF関連のソースコードの回収は完了です。
雛形プロジェクトの方のエクスプローラーは閉じちゃって構いません。
ヘッダーファイルのコピー
TOPPERS/ASPをビルドするにあたり、AVR32の様々な定義を記述したヘッダーファイルが必要となります。
それを一から自分で書いていたら大変ですので「Microchip Studio」からいただいちゃいましょう。
新たに、以下のパスを表示するエクスプローラーを開きましょう。
C:\Program Files (x86)\Atmel\Studio\7.0\packs\atmel
次に、TOPPERS/ASPのソースツリーの方のエクスプローラーは、以下のディレクトリへ移動させます。
C:\cygwin64\home\<ユーザー名>\asp_1.9.2\arch\avr32uc3_gcc
ヘッダーファイルの方のディレクトリに注目!
以下のディレクトリを確認して下さい。
このディレクトリを開いてあるもう一方のエクスプローラー、TOPPERS/ASPのソースツリーの方にコピーします。
結果、TOPPERS/ASPのソースツリーの方は、以下のようになりましたか?
ここで、コピーしたヘッダーファイルのバージョンを調べておきます。
TOPPERS/ASPのソースツリーの方のエクスプローラーでコピーした「UC3A_DFP」ディレクトリをダブルクリックしてください。
そこで新たに現れたディレクトリの名前がヘッダーファイルのバージョンを示します。
以下の例では「1.0.80」となっていますね?
このバージョンは「Microchip Studio」をインストールした時期によって異なります。
そのため、TOPPERS/ASPのMakefileに対し、このバージョン通りのディレクトリ名を教えてあげないといけません。
それを行うには、以下のディレクトリにある「Makefile.prc」を修正する必要があります。
C:\cygwin64\home\<ユーザー名>\asp_1.9.2\arch\avr32uc3_gcc
そこで「Makefile.prc」をテキストエディターなどで開き、以下の部分を修正します。
15行目付近からの…
...
#
# コンパイルオプション
#
INCLUDES := $(INCLUDES) \
-I$(SRCDIR)/arch/$(PRC)_$(TOOL)/UC3A_DFP/1.0.53/include/AT32UC3A3256
COPTS := $(COPTS) -mpart=uc3a3256 -DBOARD=UC3_A3_XPLAINED -std=gnu99
LDFLAGS := $(LDFLAGS)
...
…という部分を以下のように修正します。
...
#
# コンパイルオプション
#
INCLUDES := $(INCLUDES) \
-I$(SRCDIR)/arch/$(PRC)_$(TOOL)/UC3A_DFP/1.0.80/include/AT32UC3A3256
COPTS := $(COPTS) -mpart=uc3a3256 -DBOARD=UC3_A3_XPLAINED -std=gnu99
LDFLAGS := $(LDFLAGS)
...
おわかりいただけただろうか?
「INCLUDES :=」の定義の2行目において「1.0.53」などとなっている古いバージョンの表記を今回使用する「1.0.80」に修正しています。
もちろん、前述した方法でヘッダーファイルのバージョンを調べた結果「1.0.80」でなかった場合は、それに合わせたバージョン番号をディレクトリ名として修正すれば良いです。
修正が終わったら、忘れずに「Makefile.prc」を保存してください。
これで、ヘッダーファイルの回収は完了です。
ヘッダーファイルの方のエクスプローラーは閉じちゃって構いません。
スタートアップファイル「start.S」のコピーと修正
ターゲットに電源が入った後、いの一番に実行されるアセンブラのソースコード「start.S」を作成します。
一から書くのは大変なので、既に用意されているものをベースに作成しましょう。
元となるソースコードは、「startup_uc3.S」という名前で以下のパスに配置されています。
C:\cygwin64\home\<ユーザー名>\asp_1.9.2\target\at32uc3a3_xpld_gcc\ASF\avr32\utils\startup
この「startup_uc3.S」を以下のディレクトリにコピーします。
C:\cygwin64\home\morita\asp_1.9.2\arch\avr32uc3_gcc
ついでに、今コピーした「startup_uc3.S」を「start.S」に改名しておきましょう。
続きまして、改名した「start.S」をテキストエディターなどで開き、以下の部分を修正します。
59行目付近からの…
...
.global _stext
.type _stext, @function
_stext:
// Set initial stack pointer.
lda.w sp, _estack
...
…という部分を以下のように修正します。
...
.global _stext
.type _stext, @function
_stext:
// Set initial stack pointer.
//lda.w sp, _estack // コメントアウト!
lda.w r0, _kernel_istkpt // 追記!
ld.w sp, r0[0] // 追記!
...
もう一箇所!
103行面付近からの…
...
// Start the show.
lda.w pc, main
...
…という部分を以下のように修正します。
...
// Start the show.
//lda.w pc, main // コメントアウト!
lda.w pc, sta_ker // 追記!
...
修正が終わったら、忘れずに「start.S」を保存してください。
リンカスクリプト「at32uc3a3_xpld.ld」のコピーと修正
ソースコードをビルドした後に、どのようにメモリに配置すればよいのか?をリンカに指示するためのリンカスクリプト「at32uc3a3_xpld.ld」を作成します。
こちらも一から書くのは大変なので、既に用意されているものをベースに作成しましょう。
元となるリンカスクリプトは、「link_uc3a3256.lds」という名前で以下のパスに配置されています。
C:\cygwin64\home\<ユーザー名>\asp_1.9.2\target\at32uc3a3_xpld_gcc\ASF\avr32\utils\linker_scripts\at32uc3a3\256\gcc
この「link_uc3a3256.lds」を以下のディレクトリにコピーします。
C:\cygwin64\home\<ユーザー名>\asp_1.9.2\target\at32uc3a3_xpld_gcc
ついでに、今コピーした「link_uc3a3256.lds」を「at32uc3a3_xpld.ld」に改名しておきましょう。
続きまして、改名した「at32uc3a3_xpld.ld」をテキストエディターなどで開き、以下の部分を修正します。
42行目付近からの…
...
OUTPUT_FORMAT("elf32-avr32", "elf32-avr32", "elf32-avr32")
OUTPUT_ARCH(avr32:uc)
ENTRY(_start)
...
…という部分を以下のように修正します。
...
OUTPUT_FORMAT("elf32-avr32", "elf32-avr32", "elf32-avr32")
OUTPUT_ARCH(avr32:uc)
/* ENTRY(_start) コメントアウト! */
STARTUP(start.o) /* 追記! */
PROVIDE (hardware_init_hook = 0) ; /* 追記! */
PROVIDE (software_init_hook = 0) ; /* 追記! */
PROVIDE (software_term_hook = 0) ; /* 追記! */
...
修正が終わったら、忘れずに「at32uc3a3_xpld.ld」を保存してください。
クロック設定の変更
デフォルトのままではパフォーマンスが悪いのでCPUのクロック設定を変更します。
これを行うには、ASFのクロック設定ファイル「conf_clock.h」の内容を変更する必要があります。
この「conf_clock.h」は、以下のパスに配置されています。
C:\cygwin64\home\<ユーザー名>\asp_1.9.2\target\at32uc3a3_xpld_gcc\config
「conf_clock.h」をテキストエディターなどで開き、以下の部分を修正します。
44行目付近からの…
...
#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_RCSYS
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_OSC0
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLL0
...
…という部分を以下のように修正します。
...
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_RCSYS // コメントアウト!
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_OSC0
#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLL0 // アンコメント!
...
もう一箇所!
60行面付近からの…
...
//#define CONFIG_PLL0_SOURCE PLL_SRC_OSC0
//#define CONFIG_PLL0_SOURCE PLL_SRC_OSC1
/* Fpll0 = (Fclk * PLL_mul) / PLL_div */
//#define CONFIG_PLL0_MUL (48000000UL / BOARD_OSC0_HZ)
//#define CONFIG_PLL0_DIV 1
...
…という部分を以下のように修正します。
...
#define CONFIG_PLL0_SOURCE PLL_SRC_OSC0 // アンコメント!
//#define CONFIG_PLL0_SOURCE PLL_SRC_OSC1
/* Fpll0 = (Fclk * PLL_mul) / PLL_div */
//#define CONFIG_PLL0_MUL (48000000UL / BOARD_OSC0_HZ)
#define CONFIG_PLL0_MUL (84000000UL / BOARD_OSC0_HZ) // 追記!
#define CONFIG_PLL0_DIV 1 // アンコメント!
...
修正が終わったら、忘れずに「conf_clock.h」を保存してください。
コマンドラインでのビルド
さて、これで全ての準備は整いました。
お疲れ様でした~!!
早速ビルドしてみましょう。
Cygwinを開いて、TOPPERS/ASPソースツリーの場所まで移動しましょう。
$ cd asp_1.9.2/
次にその直下の「OBJ」ディレクトリに移動します。
$ cd OBJ/
コンフィギュレーターのパーミッションを実行可能に設定します。
$ chmod 755 ../cfg/cfg/cfg.exe
そうしたら、プロジェクトのコンフィグファイル(sample1.cfg)の情報を元に、OSに必要な定義を記したソースコード(「kernel_cfg.c」と「kernel_cfg.h」)を生成します。
$ make depend
以下のような表示にならずエラーが出力される場合は、残念ながらこれまでの作業に誤りがあります。
お手数ですが、最初からご確認を!
ここまで上手くいったら、ホンチャンのビルド。
以下のコマンドを実行します。
$ make all
プロジェクトの作成
この「TOPPERS/ASP AVR32版」では、2つのIDE(統合開発環境)を使用する方針です。
すなわち、コードを編集してそれをビルドする時に使う「Eclipse」と、ターゲットへプログラムの書き込みを行い、それをデバッグするための「Microchip Studio」です。
したがって、それぞれの様式に沿った2つのプロジェクトを作成しなければなりません。
では、なぜ2つ使うのか?
Microsoftの「Visual Studio」ベースの「Microchip Studio」が、コーディングをする上で重すぎて使い難いからです。
とはいえ、デバッガの「Atmel-ICE」を使用するためには、どうしても「Microchip Studio」が必要というジレンマ…。
あくまで個人的な好みなので、このあたりの使い分けは自由に選択してください。
とにもかくにも、まずは「Eclipse」のプロジェクトを作りましょう。
これに関しては、以前Qiitaに投稿した「TOPPERS/ASP Arduino MEGA2560版」の記事が参考になります。
8Bitか32Bitかの違いはありますが、同じAVRマイコンですからね。
作業内容は同じです。
このページ(TOPPERS/ASP - Arduino Mega2560版 プロジェクトの作成(Eclipse編))を参考にしてください。
同様に「Microchip Studio」のプロジェクトもこのページ(TOPPERS/ASP - Arduino Mega2560版 プロジェクトの作成(Microchip Studio編))を参考にしてください。
デバッガとターゲットの配線
デバッガの「Atmel-ICE」とターゲットの「AT32UC3A3-XPLD」の間で、こんな感じの配線をします。
「Atmel-ICE」には2種類のケーブルが同梱されているはずです。
今回使用するのは、10ピンがバラバラに出てるやつです。
それをこのように配線しなければなりません。
表がこう。
信号の対応表は以下の通り。
まずは、「Atmel-ICE」側は以下の通り。
今回使うのはAVRポートの方ですよ!
結果、バラバラ10ピンケーブルの方は、7番と8番はノンコネクトで大丈夫です。
プログラムの転送とデバッグ
これからTOPPERS/ASPのサンプルプログラムを動かす際には、動作確認のためにどうしてもシリアルポートが必要です。
そこで、以下のような市販のUSB/シリアル通信変換ケーブルを用意します。
シリアル通信をするために必要なポートは、RXDとTXDとGNDの三本ですね。
ターゲット基板上の「J4」ヘッダから取りましょう。
評価ボードからこうやってGNDとRXDとTXDと、それぞれの線を出してやって…
USB/シリアル通信変換ケーブル側の配線は、上からTXD、RXD、GNDの順番でこんな感じ。
これでシリアルポートが使えるようになりました。
続いて、このUSB/シリアル通信変換ケーブルをパソコンに繋いでみましょう。
パソコン上でデバイスマネージャーを開きます。
ポート(COMとLPT)のサブカテゴリーとして「USB Serial Port」というポートが追加されているはずです。
(私のパソコンでは、「COM15」として認識されていますね。)
このポート番号、覚えておいて下さい。
ここで、デバッガとパソコン、そしてターゲットとパソコンをそれぞれUSBケーブルで繋げちゃいましょ。
面倒なことに、2種類のUSBケーブルが必要です。
デバッガは「Micro-B」、ターゲットは「Mini-B」と、似ているようで違うので要注意です。
ご覧の通り、通電します。
次に「TeraTerm」をご用意ください。
インストールしていない方は、このページ(TOPPERS/ASPのビルドからデバッグまで~サンプルプロジェクトのデバッグ)の「TeraTermの導入」の項目を参考にしてください。
もちろん、シリアル通信のターミナルであれば、他のものもお使いいただけます。
今回のTOPPERS/ASPのサンプルプログラムは、シリアル通信のメッセージを出力しますので、先程「USB Serial Port」として認識されたシリアルポート番号でターミナルを立ち上げておきましょう。
設定は、こんな感じです。
ボーレートは「9600」です。
(私のパソコンは、USB/シリアル通信変換ケーブルをCOM15として認識していました。)
さて、「Microchip Studio」に戻りましょう。
「Microchip Studio」でプロジェクトを作成した状況から始めます。
以下の画面が表示されたら、上部にある「AT32UC3A3256」というタブをクリックしてください。
すると、以下の表示に切り替わりますので、すかさず左のリストから「Tool」をクリックしてください。
以下のような画面に切り替わります。
「Selected debugger/programmer」のコンボボックスに接続中の「Atmel-ICE」がID番号付きで表示されていますか?
(「J41800113804」というIDは私のですね。)
表示されていない場合は、コンボボックスをクリックして、あなたの「Atmel-ICE」(「J41800113804」以外のもの)を選択してください。
加えて「Interface」は「JTAG」のままで結構です。
(ていうか、それ以外選べないはず。)
この設定を保存しましょう。
画面上部の保存アイコンをクリックしてください。
次に、プログラムのビルドと実行を行います。
画面上部の「▶」ボタンをクリックします。
しばらくすると、立ち上げておいたターミナルに以下のような表示が出ていると思います。
TOPPERS/ASPカーネルとそのサンプルプログラムの転送と実行に成功です。
ブレークポイントを試してみましょう。
動作中のプログラムを停止します。
画面上部の「■」ボタンをクリックします。
ブレークポイントを仕掛けましょう。
画面右の「Solution Explorer」のソースコードリストの中から「sample1.c」をダブルクリックし、ソースコードを表示します。
このソースコードの丁度中盤くらい、メインタスクの始めに仕掛けましょうか。
ブレークポイントは、ソースコードビューの左端をクリックすると赤丸が表示され、セットされていることを表します。
仮に、これを再びクリックするとブレークポイントが解除され赤丸も消えます。
では、ブレークポイントを仕掛けた状態で、プログラムを再び実行してみます。
上手く引っかかってくれるでしょうか…。
以下のようにプログラムが停止すれば成功です!
ここからは、「F10」キーでステップオーバー、「F11」キーでステップインなど、おなじみの操作が使用できます。
因みに、ステップオーバーやステップインなどを行っている時に命令が飛んでしまったり前後したりする場合は、最適化のせいです。
デバッグ時は、このページ(TOPPERS/ASPのビルドからデバッグまで~サンプルプロジェクトのデバッグ)の「サンプルプログラムのデバッグ」の項目を参考に最適化を解除しましょう。
サンプルプロジェクトの説明
興味のある方は、このページ(TOPPERS/ASPのビルドからデバッグまで~サンプルプロジェクトで遊ぼう)を参照してください。
AVR32版カーネルについて
以下、このカーネルにおける備考です。
割り込み優先度
このカーネルでは、-1(優先度最低)から-4(優先度最高)の4段階の優先度設定が可能です。
マイコンというのは、割り込みが起こるとアプリケーションで使っていたレジスタの値をスタックという専用のメモリへ退避させます。
更に割り込み処理が終わると、処理がアプリケーションへ戻る前にスタックへ退避させた値をレジスタに復帰させなければなりません。
したがって、これらの一時退避するレジスタの数が多いと処理自体がオーバーヘッドになり、反応性が悪くなります。
レジスタの退避と復帰は、割り込みルーチンの冒頭と終盤一命令ずつ書いていかなきゃならない(仮に一時退避するレジスタの数が8個なら、退避と復帰で計16ステップ必要)からです。
そういうマイコンが多数派ですが、AVR32(正確には「AVR32 UC3」)の場合はレジスタの一時退避をハードウェアで自動的にやってくれます。
ハードウェアによる一時退避の処理は非常に速いため、このことは割り込みの反応性を大きく向上させます。
つまり、割り込みを多用するアプリケーションの性能が良いということです。
大変優れたアーキテクチャです!
例外ハンドラ
例外ハンドラとしては「..\target\at32uc3a3_xpld_gcc\target_vector.S」の冒頭のコメントに記されたものを使用することができます。
番号は飛び飛びになっちゃっているのは注意です。
特に20番以降はヒドイ…。
...
/*
* ターゲット依存ベクターテーブル(AT32UC3A3-XPLD用)
*/
#include <avr32/io.h>
/*
* CPU例外番号
*
*
* 0 - Unrecoverable exception
* 1 - TLB multiple hit
* 2 - Bus error data fetch
* 3 - Bus error instruction fetch
* 4 - NMI
* 5 - Instruction Address
* 6 - ITLB Protection
* 7 - Breakpoint
* 8 - Illegal Opcode
* 9 - Unimplemented instruction
* 10 - Privilege violation
* 12 - Coprocessor absent
* 13 - Data Address (Read)
* 14 - Data Address (Write)
* 15 - DTLB Protection (Read)
* 16 - DTLB Protection (Write)
* 20 - ITLB Miss
* 24 - DTLB Miss (Read)
* 28 - DTLB Miss (Write)
* 64 - Supervisor call
*/
...
例外ハンドラの動作は、サンプルプログラムで確認できます。
サンプルプログラム実行中に「z」か「Z」をターミナルで入力すると、CPU例外番号「14」の「Data Address (Write)」が引き起こされる仕掛けになっています。
この設定は「..\arch\avr32uc3_gcc\prc_test.h」の以下の記述で設定されています。
...
#define CPUEXC1 14 /* Data Address (Write) */
#define RAISE_CPU_EXCEPTION *(volatile int*)(0x1) = 0x11;
...
すなわち「CPUEXC1」に「14(Data Address (Write))」を定義し、サンプルプログラムから「RAISE_CPU_EXCEPTION」というマクロを呼び出すと「(volatile int)(0x1) = 0x11」という非常に行儀の悪いコードが実行されるようになっています。
(「0x1」という奇数番地を32ビットのポインターのアドレスとして扱い、更に、それに対して値を書き込んでいる!)
このイタズラにより、データを書き込むメモリのアドレスのアラインメントの不正が検出され、その名の通りの「14(Data Address (Write))」CPU例外が引き起こされます。
小文字の「z」と大文字の「Z」の違いは、CPU例外が小文字の場合はカーネル管轄内で、大文字の場合はカーネル管轄外でそれぞれ実行されるということだけです。
各CPU例外の詳細については、AVR32のデータシートを熟読していただく必要がありますが、これらが引き起こされた時点で致命的な状況が多く「4(NMI)」以外は、デバッグでの用途以外、あまり使い道はないでしょう。
一部サービスコールは未対応
割り込みIDを指定して、これを有効/無効化するための「ena_int()」と「dis_int()」サービスコールはサポートしていません。
これはAVR32に搭載されている割り込みコントローラーがシンプルな設計であり、割り込み要因ごとに有効/無効化するためのフラグを設けていないためです。
どうしても一時的に割り込みを有効/無効化したい場合は、各ペリフェラルのレジスタを設定するか、CPU全体の割り込みを一括で設定しても良いのであれば、以下のような関数を呼び出すことで代用してください。
なお、以下の関数を使用するためには、これを使用するソースに「#include <avr32/io.h>」を一行加えてあげてください。
Disable_global_interrupt(); /* すべての割込みの禁止 */
Enable_global_interrupt(); /* すべての割込みの許可 */
また、性能評価用システム時刻取得のための「get_utm()」サービスコールは未実装です。
ライセンスについて
このカーネルは「TOPPERSライセンス」で配布しております。
無償ですが、使用に関しては自己責任です。
万が一、このカーネルを商用利用する方は、このリンク先の条項に従ってください…って、いらっしゃる訳ないですよね。
シリーズ自体がディスコンですから!
この可哀想なAVR32、TOPPERSカーネルもしばらくは頑張ってメンテナンスしていきますので、市場にある内にどうか使ってやって下さい!