TOPPERS/ASP - AVR32版

※この記事は、[筆者自身のブログ](https://www.madogiwakoubou.com/)に連載していたものを読みやすく1ページにまとめたダイジェスト版です。無断転載などではありませんのでご了承ください。

# 概要
ちょっとしたデバイス作成に、業務に趣味にと大人気のMicrochip社の8bitマイコン「AVR」。
そのAVRマイコンに32bit版があったなんてご存知でしたか？
今回取り上げるのは、その「<font color="red">AVR32</font>」です。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/a2a062cc-a01a-65e9-c046-1b44def1b289.jpeg">


詳細は英語にはなりますが、[このページ](https://en.wikipedia.org/wiki/AVR32)を御覧ください。
かつては「AP7」と「UC3」の二種類のコアを販売していました。
「AP7」は、いわゆるアプリケーション・プロセッサーというべきもので、Linuxも動作するほどの高い性能を持っていました。
一方の「UC3」は、マイクロプロセッサー、いわゆるマイコンと呼ばれるカテゴリーに属します。
今回取り上げるのもこの「UC3」の方です。
ARMでいうところの「Cortex-A」コアが「AP7」に、「Cortex-M」コアが「UC3」に相当すると思えばイメージし易いですかね？
共にAtmel社の独自設計、8bitのAVRとは全く異なる設計思想の32bitRISCコアとなります。
このAtmel社が辿った運命、[この記事](https://qiita.com/RyutaroMorita/items/0591ca188e82b96352da#%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%81%AE%E6%A7%8B%E7%AF%89eclipse%E7%B7%A8)でも触れましたが、PICマイコン擁するライバルのMicrochip社に買収されてしまいます。
Microchip社もPIC32（このカーネルもそのうち公開予定）などの32bitマイコンを販売しており、この統合によってこのAVR32は淘汰されてしまいました。
現在Microchip社では、新規設計非推奨の扱いとなっています。
[どっかで似たような話](https://qiita.com/RyutaroMorita/items/9b532bd7bcd53f53d299)を最近書いたような…？
結局、Microchip社のPIC32も思うように販売が伸ばせず、ARMコアの製品ラインを展開することとなります。
歴史の闇に沈んでいったAVR32。
あまり市場に受け入れられなかったのは事実ですが、実際に扱ってみると相当に優れた設計であることが分かりました。
このまま埋もれさせるのは惜しい…。
そこで、この不幸なAVR32に「μITRON4.0」準拠のRTOS（リアルタイムOS）である[TOPPERS/ASP](https://www.toppers.jp/asp-kernel.html)を移植してみました。
せめてもの供養…。
もしかしたら、RTOSがあれば使ってくれる人もいるかもしれない！…そんな思いです。
新規設計非推奨の扱いではありますが、それは仕事で使う上での問題。
市場在庫分を購入して、趣味で使う分には、まだまだ有力なマイコンであると言えます。
その証拠に、秋月電子通商さんでは、AVR32は3種類も！在庫が豊富な状態で販売されています。

[●ＡＶＲマイコン　ＡＴ３２ＵＣ３Ｂ０５１２](https://akizukidenshi.com/catalog/g/gI-07023/)
[●ＡＶＲマイコン　ＡＴ３２ＵＣ３Ｂ０６４](https://akizukidenshi.com/catalog/g/gI-07022/)
[●ＡＶＲマイコン　ＡＴ３２ＵＣ３Ｌ０６４](https://akizukidenshi.com/catalog/g/gI-07021/)

値段を見ていただければ分かると思いますが、高い性能に見合わずとても安いです。
<font color="red">もはや投げ売りです！</font>
特に「AT32UC3B0512」の場合は、同じような性能のSTM32だったら多分1,000円くらいしちゃうと思います。
…まあ、パッケージがQFPなのでハンダ付けは難しいですが。
昨今の半導体不足で入手困難なARM系マイコンの代打として、悲劇のマイコンAVR32の無念を晴らすため（<font color="red">そして僕らの強い味方、秋月電子通商さんの不良在庫処分のため！</font>）、このマイコンで電子工作はいかがですか？

# 必要なもの
まずは、今回のターゲットとなる「<font color="red">AT32UC3A3-XPLD</font>」です。
[こちら](https://www.digikey.jp/en/products/detail/microchip-technology/AT32UC3A3-XPLD/2522717)では、まだまだ入手可能です！
6,000円くらいです。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/fa37c639-34b5-001a-443a-b3f6f0f89715.jpeg">

次に、デバッガです。
「<font color="red">Atmel-ICE</font>」っていいます。
[秋月電子さん](https://akizukidenshi.com/catalog/g/gM-08285/)で16,800円ですね。
高い！…と思われるかもしれませんが、これ一台あるとAtmel系は今回のAVR32やAVRの8bitのシリーズ、SAM（ARM）シリーズのデバッグも出来ちゃいます。
Microchip社のマイコンの中でもAtmel系のシリーズを普段お使いの方は買っておいて損はないですよ。
<font color="red">とはいえ、躊躇する値段ですよね…。</font>
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/30fefa67-f1dc-8ee0-f307-9ef525ac85ef.jpeg">

# ダウンロード／GitHub
ソースコードの入手は、[こちら](https://github.com/RyutaroMorita/asp_avr32_gcc)からどうぞ。
とは言っても、このソースコードをダウンロード、もしくは「git clone」しても、<font color="red">絶対にビルドが通りません。</font>
このソースコードは未完成です。
なぜなら、Microchip社のドライバを後から付け加える必要があるんです。
そのMicrochip社のドライバのライセンスの条項が理解に難しく、公開、および再配布しない方が無難と判断したためです。
ですので、今後この記事では、それらのソースコードの入手方法やコピーする場所などを事細かに書いていくつもりです。
すご～く面倒ですが、お付き合いしていただけると嬉しいです。
<font color="red">ビルドは、まだやっちゃダメですよ～。</font>

# 開発環境の構築（Microchip Studio編）
早速、開発環境を構築していきます。
まずは、Microchip社の純正の統合開発環境(IDE)である「Microchip Studio」のインストールからです。
詳しい手順については、同じMicrochip社のAVRを使用した「TOPPERS/ASP Arduino Mega2560版」の時に書いた記事が参考になります。
このページ（[TOPPERS/ASP - Arduino Mega2560版 開発環境の構築（Microchip Studio編）](https://qiita.com/RyutaroMorita/items/0591ca188e82b96352da#%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%81%AE%E6%A7%8B%E7%AF%89microchip-studio%E7%B7%A8)）をそのまま参考にして作業して下さい。
ただし、インストーラーで開発ターゲットのアーキテクチャを選択する部分には要注意！
以下のような画面が表示されたら、必ず「<font color="red">UC3</font>」のチェックを忘れずに！
<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/162422a4-789b-e22f-8222-796715608c8a.png">

今回の「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**

普通にGCCを含むGNUツールチェーンですね。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/74d13bed-bb03-751d-09fd-5c72dc1b69e1.png">

環境変数の設定方法は他のページで調べていただくか、あるいは手前味噌で恐縮ですが、私のブログのページ（[TOPPERS/ASPのビルドからデバッグまで～GNUツールチェーンの導入](https://www.madogiwakoubou.com/p/toppersaspgnu.html)）の「[環境変数の設定](https://www.madogiwakoubou.com/p/toppersaspgnu.html#path)」の項目を御覧ください。
ただし、パスは…

**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**

に置き換えてください。
こんな感じ…。
<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/a863e300-8b96-9455-0888-1261b3665273.png">

また、このページの「[パスの確認](https://www.madogiwakoubou.com/p/toppersaspgnu.html#check)」の項目で打ち込むコマンドも、以下のように変わります。

**＞ avr-gcc --version**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/c05379f0-7816-4372-8d1a-491bb84232ec.png">

続きまして「<font color="red">Cygwin</font>」のインストールを行います。
基本的には「gcc-core」、「make」、「diffutils」、「perl」と「git」の5つのパッケージを含むようなCygwin環境を構築すれば良いです。
もしよろしければ、私のブログのページ（[TOPPERS/ASPのビルドからデバッグまで～Cygwinの導入](https://www.madogiwakoubou.com/p/toppersaspcygwin.html)）を参考にしてください。

次に、ソースコードをゲットしちゃいましょう。
以下のコマンドでソースコードのクローンを行います。

**$ git clone https://github.com/RyutaroMorita/asp_avr32_gcc.git**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/dceca404-0423-7887-ef7a-6a7151a070bd.png">

ダウンロードとGithub、いずれの場合も「asp_avr32_gcc」というディレクトリの名前を「asp_1.9.2」などと改名すると、上記のページと同じ状況になります。

さて、コンパイラーをインストールして、ソースコードもダウンロードしました。
早速ビルドを～！って思う気持ちはわかりますが、やめておきましょう。
<font color="red">どうせ、必ずビルドは失敗します。</font>
なぜならば、ソースコードに色々加えなければならないからです。
その手順も追って説明いたしますので、ここはグッと我慢。

それよりも先に「<font color="red">Eclipse</font>」のインストールを行います。
あまりにも古すぎるものを除けば、好きなバージョンの「Eclipse」をインストールしてください。
よろしければ、このページ（[TOPPERS/ASPのビルドからデバッグまで～Eclipseの導入](https://www.madogiwakoubou.com/p/toppersaspeclipse.html)）を参考にしてください。

# Atmel Software Framework (ASF)とは？
<font color="red">ASF</font>とは、ドライバ、プロトコル、スタック、コーディングユーティリティ、ビルドシステムなどを開発者に提供するソースコードのライブラリです。
いわゆる純正のライブラリパッケージであり、これを使用するとCPUに内蔵されているペリフェラル（周辺機器）を簡単に利用することができるというものです。
今回の「TOPPERS/ASP AVR32版」のカーネル内でも、割り込み、タイマーやシリアル通信ドライバなどは、このASFのドライバを使用しています。
ところが、このASFのソースコードのライセンスの条項が不明瞭なために再配布できません。
そのため「TOPPERS/ASP AVR32版」のソースコードが不完全なものとなり、そのままではビルドが通らず、通すためには手動で不足分のソースコードをコピーしていただくという手間を強いることになってしまいました。
<font color="red">面目無いです…。</font>
では、そのASFのソースコードを何処から入手すれば良いのか？

そのためには、<font color="red">インストールした「Microchip Studio」上で雛形となるプロジェクトを作って、そこで生成されたASFのソースコードを「TOPPERS/ASP AVR32版」のソースツリーにコピーする</font>という方法を採ります。

# 雛形プロジェクトの作成
まずは「Microchip Studio」を起動して下さい。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/db527b71-f1de-1980-ad9c-c87d61be3852.png">

画面上部の「File」、「New」、「<font color="red">Project...</font>」メニューを順にクリックしていきます。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/5b2cee5e-38fa-8a83-a4c2-558674ce36f3.png">

以下のようなダイアログが表示されます。
ここでは「<font color="red">GCC ASF Board Project</font>」を選択し、ダイアログ右下の「<font color="red">OK</font>」ボタンをクリックしましょう。
これで「<font color="red">GccBoardProject1</font>」という名前のプロジェクトを作成したことになります。
このプロジェクト名、覚えておいてください。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/fbbad6f7-12ae-c6e2-94d0-47a6c9c6dd8a.png">

続いて、以下のようなダイアログが表示されます。
まずは「<font color="red">Extensions</font>」コンボボックスに注目してください。
デフォルトでは「<font color="red">Atmel ASF(x.xx.x)</font>」と言った具合に、「Microchip Studio」をインストールした時点での最新版のASFを使用するように選択されています。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/a20b1b34-dfc9-a586-bd9a-0dce9afb540b.png">

今回の場合、デフォルトの最新版でも多分大丈夫なのでしょうが、検証をしていないので「<font color="red">Atmel ASF(3.49.1)</font>」に設定してください。
これで動くことを確認してから、最新版を試すことをオススメします。
気持ち悪いから最新版で試したい！って方は、<font color="red">貴殿のご武運をお祈りします！</font>
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/345c59f6-bf2a-72ec-f51d-96cbeaffd089.png">

使用するASFのバージョンを設定したら、そのコンボボックスのすぐ左、「<font color="red">Select By Board</font>」のラジオボタンをクリックします。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/2d252805-2809-07b6-bf80-b66c7698d30e.png">

このASFのバージョンでサポートされている多くの評価ボードがリストアップされています。
その中から、今回使用する「<font color="red">UC3-A3 Xplained - AT32UC3A3256</font>」を選択し、ダイアログ右下の「<font color="red">OK</font>」ボタンをクリックします。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/96214d07-6f71-aabe-18f7-e056cb45143f.png">

すると、以下のようにダイアログが消えて、元の「Microchip Studio」の画面に戻ります。
ただし「ASF Wizard」というタブが表示されていますね。
このタブの左上、「<font color="red">Project:</font>」という表示のコンボボックスに注目してください。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/a91302f0-c8b4-cc4d-dc6a-aaef4c066e35.png">

このコンボボックスをクリックすると、作成した「<font color="red">GccBoardProject1</font>」というプロジェクト名が選択できるようになっているので、これをクリック！
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/8113599f-b502-4125-d250-247d63cdb427.png">

すると「ASF Wizard」というタブは、以下のような表示に切り替わります。
この画面の見方なのですが、左側のリストには、このプロジェクトで指定したデバイスである「AT32UC3A3256」で使用できるASFのライブラリが表示されています。
右側のリストには、このプロジェクトで既に選択されている（使用する）ASFのライブラリが表示されています。
デフォルトで選択されているのは「GPIO」と「Generic board support」のみですね。
つまり、左側のリストから右側のリストに項目を移動させることにより、自由に使用するASFのライブラリをプロジェクトに付け加えることができる訳ですね。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/7d50b854-3b1c-1531-fcef-3dc915912c21.png">

今回の「TOPPERS/ASP AVR32版」に必要な最低限のASFライブラリは以下の４つです。

**●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」リストから「<font color="red">TC - Timer / Counter (driver)</font>」を選択して、「ASF Wizard」タブの下部にある「<font color="red">Add</font>」ボタンをクリックします。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/357b6165-dc45-ef7e-a5a4-2c4565ca1a9e.png">

すると、無事、右側の「Selected Modules」リストに「<font color="red">TC - Timer / Counter (driver)</font>」が追加されたでしょうか？
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/297b7a8b-3fb8-fbd7-8a08-ceea36aa4e8e.png">

同じ要領で「USART - Serial interface」も追加しちゃいましょう。
左側の「Available Modules」リストから「<font color="red">USART - Serial interface (service)</font>」を選択して、「ASF Wizard」タブの下部にある「<font color="red">Add</font>」ボタンをクリックします。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/dab88091-5048-e710-7ffc-914e7bf38959.png">

すると、右側の「Selected Modules」リストに「<font color="red">USART - Serial interface (service)</font>」が追加されるはずです。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/7d843dc3-1bb7-0b25-0e21-8862b60d6995.png">

以上で、必要なASFライブラリの設定は終わりました。
次は、この設定通りにASFライブラリのソースコードをプロジェクトに吐き出させる作業です。
なんてことはないです。
ただ「ASF Wizard」タブの下部にある「<font color="red">Apply</font>」ボタンをクリックするだけです。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/33a92323-b3bc-8742-84b4-ccba8956356b.png">

以下のダイアログが表示されます。
特にやることもなく「<font color="red">OK</font>」ボタンをクリックします。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/61868077-fae4-32c8-43a8-c6fa1177d2b7.png">


以下のように、派手な表示の変化もなく作業は終了します。
ちょっと不安ですね？
ちゃんとソースコードが吐き出されているかどうか、後で確認しましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/37a84682-4369-8ee5-641d-9f3781644314.png">

さて、必要なソースコードを雛形プロジェクトへ吐き出させたようなので「Microchip Studio」を一旦終了させましょうか。
左上のバッテン（X）をクリックすると以下のダイアログが表示されています。
この雛形プロジェクトを保存するかどうかを問われます。
<font color="red">保存しておいた方が良い</font>でしょう。
（「<font color="red">Yes</font>」ボタンをクリックです。）
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/47374289-9478-43c1-3e65-5e1b580d2c70.png">

もしこの先、無事に「TOPPERS/ASP」の起動に成功して、イザ何かを作ろう！となった場合、今回追加したASFライブラリだけでは絶対に足らなくなることでしょう。
評価ボードにセンサーを繋げて、そのセンサーとSPIで通信するとか、AD変換を使いたいだとか…。
その際には、再び今回の手順で必要になったASFライブラリを追加して、ソースコードを吐き出させて、更にそれを「TOPPERS/ASP」のソースツリーにコピーしなければなりません。
そういう意味では、この雛形プロジェクト、結構使用頻度が高くなるかもしれませんよ？
大切に取っておきましょう！

さて、一連の作業で吐き出されたASFライブラリのソースコードがどうなっているのか？確認しておきましょう。
特に変わったことをしていないのであれば、雛形プロジェクト「<font color="red">GccBoardProject1</font>」は以下のディレクトリに保存されているはずです。

**C:\Users\＜ユーザー名＞\Documents\Atmel Studio\7.0\GccBoardProject1**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/f072e5ca-86c4-b58a-c7a4-436225044594.png">

さらに、このディレクトリの中にある、これまた「<font color="red">GccBoardProject1</font>」というディレクトリの中は以下のようになっています。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/f3fcb90c-a858-8739-589a-94e164c17081.png">

さらにさらに、このディレクトリの中にある「<font color="red">src</font>」というディレクトリの中は以下のようになっていますでしょうか？
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/1ac1e6c7-4dbd-d0d7-d93d-8e1b4a8d6669.png">

ここで現れる「<font color="red">ASF</font>」と「<font color="red">config</font>」（さらに「<font color="red">asf.h</font>」）こそが、欲しかったモノです！
これらが見つかれば、作業は成功です！

# Atmel Software Framework (ASF)のコピー
先程作成した雛形プロジェクトのディレクトリと、「TOPPERS/ASP AVR32版」のソースツリーのディレクトリを同時に2つエクスプローラーで開いておきましょう。
記事通りに作業すると、雛形プロジェクトは以下のディレクトリに保存されているはずです。

**C:\Users\＜ユーザー名＞\Documents\Atmel Studio\7.0\GccBoardProject1**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/0cca30eb-4aeb-af97-f57f-e1739ff86cf7.png">

同じく、TOPPERS/ASPのソースツリーは以下のディレクトリに保存されているはずです。
（<font color="red">「asp_avr32_gcc」や「asp_avr32_gcc_master」を「asp_1.9.2」に改名した場合。</font>）

**C:\cygwin64\home\＜ユーザー名＞\asp_1.9.2**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/82ef9355-3537-6db2-f4fa-945492112045.png">

さて、2つ開いたエクスプローラーでそれぞれ以下の場所を表示するようにします。
まず、<font color="red">雛形プロジェクトの方</font>は、以下のディレクトリへ移動させます。

**C:\Users\＜ユーザー名＞\Documents\Atmel Studio\7.0\GccBoardProject1\GccBoardProject1\src**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/9597ce2a-0eaa-1e6f-6f58-ff78e5156634.png">

次に、<font color="red">TOPPERS/ASPのソースツリーの方</font>は、以下のディレクトリへ移動させます。

**C:\cygwin64\home\＜ユーザー名＞\asp_1.9.2\target\at32uc3a3_xpld_gcc**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/b99c298a-767d-b17a-25da-11342598a6bc.png">

<font color="red">雛形プロジェクトの方</font>のディレクトリに注目！
以下の3つのディレクトリとヘッダーファイルを確認して下さい。

**●ASF**
**●config**
**●asf.h**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/0c811caa-dc42-15c3-27a0-08714d3d3631.png">

この3つを開いてあるもう一方のエクスプローラー、<font color="red">TOPPERS/ASPのソースツリーの方</font>にコピーします。
結果、<font color="red">TOPPERS/ASPのソースツリーの方</font>は、以下のようになりましたか？
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/7efbe7dc-736a-cb74-c289-e0816f121202.png">

これで、ASF関連のソースコードの回収は完了です。
<font color="red">雛形プロジェクトの方</font>のエクスプローラーは閉じちゃって構いません。

# ヘッダーファイルのコピー
TOPPERS/ASPをビルドするにあたり、AVR32の様々な定義を記述したヘッダーファイルが必要となります。
それを一から自分で書いていたら大変ですので「Microchip Studio」からいただいちゃいましょう。
新たに、以下のパスを表示するエクスプローラーを開きましょう。

**C:\Program Files (x86)\Atmel\Studio\7.0\packs\atmel**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/d672fe35-3340-65a0-20bb-86b39dc85701.png">

次に、<font color="red">TOPPERS/ASPのソースツリーの方</font>のエクスプローラーは、以下のディレクトリへ移動させます。

**C:\cygwin64\home\＜ユーザー名＞\asp_1.9.2\arch\avr32uc3_gcc**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/04ac67f4-540b-be01-ed34-1b47c9a29786.png">

<font color="red">ヘッダーファイルの方</font>のディレクトリに注目！
以下のディレクトリを確認して下さい。

**●UC3A_DFP**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/7eea8a36-230a-5607-e394-5a677f6a5342.png">

このディレクトリを開いてあるもう一方のエクスプローラー、<font color="red">TOPPERS/ASPのソースツリーの方</font>にコピーします。
結果、<font color="red">TOPPERS/ASPのソースツリーの方</font>は、以下のようになりましたか？
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/75f54d1d-89e7-2bc2-e252-98f77718685a.png">

ここで、コピーしたヘッダーファイルのバージョンを調べておきます。
<font color="red">TOPPERS/ASPのソースツリーの方</font>のエクスプローラーでコピーした「<font color="red">UC3A_DFP</font>」ディレクトリをダブルクリックしてください。
そこで新たに現れたディレクトリの名前がヘッダーファイルのバージョンを示します。
以下の例では「<font color="red">1.0.80</font>」となっていますね？
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/01f76945-d8ee-46c4-3ecb-38f01d9a18f3.png">

このバージョンは「Microchip Studio」をインストールした時期によって異なります。
そのため、TOPPERS/ASPのMakefileに対し、このバージョン通りのディレクトリ名を教えてあげないといけません。
それを行うには、以下のディレクトリにある「<font color="red">Makefile.prc</font>」を修正する必要があります。

**C:\cygwin64\home\＜ユーザー名＞\asp_1.9.2\arch\avr32uc3_gcc**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/cedd3e14-9c87-cd73-2f81-2bb15e43d912.png">

そこで「<font color="red">Makefile.prc</font>」をテキストエディターなどで開き、以下の部分を修正します。
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)
...
```

<font color="red">おわかりいただけただろうか？</font>
「INCLUDES :=」の定義の2行目において「<font color="red">1.0.53</font>」などとなっている古いバージョンの表記を今回使用する「<font color="red">1.0.80</font>」に修正しています。
もちろん、前述した方法でヘッダーファイルのバージョンを調べた結果「<font color="red">1.0.80</font>」でなかった場合は、それに合わせたバージョン番号をディレクトリ名として修正すれば良いです。
修正が終わったら、忘れずに「<font color="red">Makefile.prc</font>」を保存してください。
これで、ヘッダーファイルの回収は完了です。
<font color="red">ヘッダーファイルの方</font>のエクスプローラーは閉じちゃって構いません。

# スタートアップファイル「start.S」のコピーと修正
ターゲットに電源が入った後、いの一番に実行されるアセンブラのソースコード「<font color="red">start.S</font>」を作成します。
一から書くのは大変なので、既に用意されているものをベースに作成しましょう。
元となるソースコードは、「<font color="red">startup_uc3.S</font>」という名前で以下のパスに配置されています。

**C:\cygwin64\home\＜ユーザー名＞\asp_1.9.2\target\at32uc3a3_xpld_gcc\ASF\avr32\utils\startup**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/ca5cad83-3c5b-13d8-e1a5-272a24b22243.png">

この「<font color="red">startup_uc3.S</font>」を以下のディレクトリにコピーします。

**C:\cygwin64\home\morita\asp_1.9.2\arch\avr32uc3_gcc**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/c8fd245e-bebc-336e-126d-11bd43d18206.png">

ついでに、今コピーした「<font color="red">startup_uc3.S</font>」を「<font color="red">start.S</font>」に改名しておきましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/b985e297-0e5f-fe83-5383-50ca4d4a66b7.png">

続きまして、改名した「<font color="red">start.S</font>」をテキストエディターなどで開き、以下の部分を修正します。
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]             // 追記！
...
```

<font color="red">もう一箇所！</font>
103行面付近からの…
```
...
  // Start the show.
  lda.w   pc, main
...
```

…という部分を以下のように修正します。
```
...
  // Start the show.
  //lda.w   pc, main            // コメントアウト！
  lda.w   pc, sta_ker           // 追記！
...
```

修正が終わったら、忘れずに「<font color="red">start.S</font>」を保存してください。

# リンカスクリプト「at32uc3a3_xpld.ld」のコピーと修正
ソースコードをビルドした後に、どのようにメモリに配置すればよいのか？をリンカに指示するためのリンカスクリプト「<font color="red">at32uc3a3_xpld.ld</font>」を作成します。
こちらも一から書くのは大変なので、既に用意されているものをベースに作成しましょう。
元となるリンカスクリプトは、「<font color="red">link_uc3a3256.lds</font>」という名前で以下のパスに配置されています。

**C:\cygwin64\home\＜ユーザー名＞\asp_1.9.2\target\at32uc3a3_xpld_gcc\ASF\avr32\utils\linker_scripts\at32uc3a3\256\gcc**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/2d73ceca-5397-6a7d-895e-aeb5b319b144.png">

この「<font color="red">link_uc3a3256.lds</font>」を以下のディレクトリにコピーします。

**C:\cygwin64\home\＜ユーザー名＞\asp_1.9.2\target\at32uc3a3_xpld_gcc**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/dc91930e-23e5-6d88-56de-34cd0c01e401.png">

ついでに、今コピーした「<font color="red">link_uc3a3256.lds</font>」を「<font color="red">at32uc3a3_xpld.ld</font>」に改名しておきましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/1651c23e-9a9a-3504-9753-c0d8b6680cd1.png">

続きまして、改名した「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) ;  /* 追記！ */
...
```

修正が終わったら、忘れずに「<font color="red">at32uc3a3_xpld.ld</font>」を保存してください。

# クロック設定の変更
デフォルトのままではパフォーマンスが悪いのでCPUのクロック設定を変更します。
これを行うには、ASFのクロック設定ファイル「<font color="red">conf_clock.h</font>」の内容を変更する必要があります。
この「<font color="red">conf_clock.h</font>」は、以下のパスに配置されています。

**C:\cygwin64\home\＜ユーザー名＞\asp_1.9.2\target\at32uc3a3_xpld_gcc\config**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/387bc19f-5162-9f5e-791d-ccb5818a586c.png">

「<font color="red">conf_clock.h</font>」をテキストエディターなどで開き、以下の部分を修正します。
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	// アンコメント！
...
```

<font color="red">もう一箇所！</font>
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	                            // アンコメント！
...
```

修正が終わったら、忘れずに「<font color="red">conf_clock.h</font>」を保存してください。

# コマンドラインでのビルド
さて、これで全ての準備は整いました。
<font color="red">お疲れ様でした～！！</font>
早速ビルドしてみましょう。
Cygwinを開いて、TOPPERS/ASPソースツリーの場所まで移動しましょう。

**$ cd asp_1.9.2/**

次にその直下の「OBJ」ディレクトリに移動します。

**$ cd OBJ/**

コンフィギュレーターのパーミッションを実行可能に設定します。

**$ chmod 755 ../cfg/cfg/cfg.exe**

ここまで、大丈夫ですか？
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/e2c5eddf-a0c9-4e8e-26ff-d306c1c37709.png">

そうしたら、プロジェクトのコンフィグファイル（sample1.cfg）の情報を元に、OSに必要な定義を記したソースコード（「kernel_cfg.c」と「kernel_cfg.h」）を生成します。

**$ make depend**

以下のような表示にならずエラーが出力される場合は、残念ながらこれまでの作業に誤りがあります。
お手数ですが、最初からご確認を！
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/f3975337-04cb-bf53-2b86-44f9e5a74174.png">

ここまで上手くいったら、ホンチャンのビルド。
以下のコマンドを実行します。

**$ make all**

以下のように無事にビルドが通ったでしょうか？
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/77a487b9-4b10-9309-f33f-42bf7f83741e.png">

# プロジェクトの作成
この「TOPPERS/ASP AVR32版」では、2つのIDE（統合開発環境）を使用する方針です。
すなわち、<font color="red">コードを編集してそれをビルドする時に使う「Eclipse」と、ターゲットへプログラムの書き込みを行い、それをデバッグするための「Microchip Studio」</font>です。
したがって、それぞれの様式に沿った2つのプロジェクトを作成しなければなりません。
では、なぜ2つ使うのか？
Microsoftの「Visual Studio」ベースの「Microchip Studio」が、コーディングをする上で重すぎて使い難いからです。
とはいえ、デバッガの「Atmel-ICE」を使用するためには、どうしても「Microchip Studio」が必要というジレンマ…。
あくまで個人的な好みなので、このあたりの使い分けは自由に選択してください。

とにもかくにも、まずは「Eclipse」のプロジェクトを作りましょう。
これに関しては、以前Qiitaに投稿した「[TOPPERS/ASP Arduino MEGA2560版](https://qiita.com/RyutaroMorita/items/0591ca188e82b96352da)」の記事が参考になります。
8Bitか32Bitかの違いはありますが、同じAVRマイコンですからね。
作業内容は同じです。
このページ（[TOPPERS/ASP - Arduino Mega2560版 プロジェクトの作成（Eclipse編）](https://qiita.com/RyutaroMorita/items/0591ca188e82b96352da#%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90eclipse%E7%B7%A8)）を参考にしてください。
同様に「Microchip Studio」のプロジェクトもこのページ（[TOPPERS/ASP - Arduino Mega2560版 プロジェクトの作成（Microchip Studio編）](https://qiita.com/RyutaroMorita/items/0591ca188e82b96352da#%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90microchip-studio%E7%B7%A8)）を参考にしてください。

# デバッガとターゲットの配線
デバッガの「Atmel-ICE」とターゲットの「AT32UC3A3-XPLD」の間で、こんな感じの配線をします。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/2881669e-763a-89e6-9556-72d37c8623bd.jpeg">

「Atmel-ICE」には2種類のケーブルが同梱されているはずです。
今回使用するのは、10ピンがバラバラに出てるやつです。
それをこのように配線しなければなりません。
表がこう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/33c708e0-7d50-be7d-0cec-f224b68d93dd.jpeg">

裏はこんな感じ。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/a12ef7a8-23b6-e676-1b3b-a213441e9d9e.jpeg">

信号の対応表は以下の通り。
まずは、「Atmel-ICE」側は以下の通り。
<font color="red">今回使うのはAVRポートの方ですよ！</font>
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/2080f2c9-133b-9526-4dea-d08f4243dda6.png">

次に「AT32UC3A3-XPLD」側は以下の通りです。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/3b931cdc-ddf2-685d-cb21-edae254f8724.png">

結果、バラバラ10ピンケーブルの方は、<font color="red">7番と8番はノンコネクト</font>で大丈夫です。

# プログラムの転送とデバッグ
これからTOPPERS/ASPのサンプルプログラムを動かす際には、動作確認のためにどうしてもシリアルポートが必要です。
そこで、以下のような市販のUSB／シリアル通信変換ケーブルを用意します。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/126a9700-3618-18c6-04b2-82169187d156.jpeg">

シリアル通信をするために必要なポートは、RXDとTXDとGNDの三本ですね。
ターゲット基板上の<font color="red">「J4」ヘッダ</font>から取りましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/3c85f53f-1422-f840-bbe9-1675dbacd163.jpeg">

以下の<font color="red">赤い四角</font>で囲った端子を使いましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/7f8383da-f645-1c54-0f84-1014998e86a1.png">

評価ボードからこうやって<font color="Gray">GND</font>と<font color="Blue">RXD</font>と<font color="Red">TXD</font>と、それぞれの線を出してやって…
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/f581c808-2b9f-1175-7799-e5adfc0dd803.jpeg">

USB／シリアル通信変換ケーブル側の配線は、上から<font color="Red">TXD</font>、<font color="Blue">RXD</font>、<font color="Gray">GND</font>の順番でこんな感じ。
これでシリアルポートが使えるようになりました。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/baae3697-d0e1-6333-67cc-78cc0df57b37.jpeg">

続いて、このUSB／シリアル通信変換ケーブルをパソコンに繋いでみましょう。
パソコン上でデバイスマネージャーを開きます。
ポート（COMとLPT）のサブカテゴリーとして「USB Serial Port」というポートが追加されているはずです。
（私のパソコンでは、「COM15」として認識されていますね。）
このポート番号、覚えておいて下さい。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/f07499fa-4db6-b364-d272-d296ad798653.png">

ここで、デバッガとパソコン、そしてターゲットとパソコンをそれぞれUSBケーブルで繋げちゃいましょ。
面倒なことに、2種類のUSBケーブルが必要です。
デバッガは「Micro-B」、ターゲットは「Mini-B」と、似ているようで違うので要注意です。
ご覧の通り、通電します。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/c4ecfa5e-2720-a89b-b799-0e2544346f9b.jpeg">

次に「<font color="Red">TeraTerm</font>」をご用意ください。
インストールしていない方は、このページ（[TOPPERS/ASPのビルドからデバッグまで～サンプルプロジェクトのデバッグ](https://www.madogiwakoubou.com/p/toppersasp_21.html)）の「[TeraTermの導入](https://www.madogiwakoubou.com/p/toppersasp_21.html#teraterm)」の項目を参考にしてください。
もちろん、シリアル通信のターミナルであれば、他のものもお使いいただけます。
今回のTOPPERS/ASPのサンプルプログラムは、シリアル通信のメッセージを出力しますので、先程「<font color="Red">USB Serial Port</font>」として認識されたシリアルポート番号でターミナルを立ち上げておきましょう。
設定は、こんな感じです。
ボーレートは「9600」です。
（私のパソコンは、USB／シリアル通信変換ケーブルをCOM15として認識していました。）
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/f2e00ba7-046f-e82e-53df-e166d29f7239.png">

さて、「Microchip Studio」に戻りましょう。
「Microchip Studio」でプロジェクトを作成した状況から始めます。
以下の画面が表示されたら、上部にある「<font color="Red">AT32UC3A3256</font>」というタブをクリックしてください。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/d6ea1ca1-2816-5b79-a047-dab7ddf07514.png">

すると、以下の表示に切り替わりますので、すかさず左のリストから「<font color="Red">Tool</font>」をクリックしてください。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/b6427208-86db-26e3-b93c-ef51ab52d919.png">

以下のような画面に切り替わります。
「<font color="Red">Selected debugger/programmer</font>」のコンボボックスに接続中の「Atmel-ICE」がID番号付きで表示されていますか？
（「J41800113804」というIDは私のですね。）
表示されていない場合は、コンボボックスをクリックして、あなたの「Atmel-ICE」（「J41800113804」以外のもの）を選択してください。
加えて「<font color="Red">Interface</font>」は「<font color="Red">JTAG</font>」のままで結構です。
（ていうか、それ以外選べないはず。）
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/dd2aa4bd-d8ef-a545-dc34-b1d24406fff4.png">

この設定を保存しましょう。
画面上部の保存アイコンをクリックしてください。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/60ada4d2-3c51-9dc9-d216-4e11f73b2397.png">

次に、プログラムのビルドと実行を行います。
画面上部の「<font color="Red">▶</font>」ボタンをクリックします。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/6bb2f6bb-a385-3ee0-bea8-92119e4dda81.png">

しばらくすると、立ち上げておいたターミナルに以下のような表示が出ていると思います。
TOPPERS/ASPカーネルとそのサンプルプログラムの転送と実行に成功です。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/d891cdbd-0bb0-d558-e6d2-5a201494a476.png">

ブレークポイントを試してみましょう。
動作中のプログラムを停止します。
画面上部の「<font color="Red">■</font>」ボタンをクリックします。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/3b1751f4-6389-d9ca-2fc3-a73437162f26.png">

ブレークポイントを仕掛けましょう。
画面右の「Solution Explorer」のソースコードリストの中から「<font color="Red">sample1.c</font>」をダブルクリックし、ソースコードを表示します。
このソースコードの丁度中盤くらい、メインタスクの始めに仕掛けましょうか。
ブレークポイントは、ソースコードビューの左端をクリックすると<font color="Red">赤丸</font>が表示され、セットされていることを表します。
仮に、これを再びクリックするとブレークポイントが解除され<font color="Red">赤丸</font>も消えます。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/a669d858-85e8-38e6-2834-f81f0dd6a485.png">

では、ブレークポイントを仕掛けた状態で、プログラムを再び実行してみます。
上手く引っかかってくれるでしょうか…。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/6bb2f6bb-a385-3ee0-bea8-92119e4dda81.png">

以下のようにプログラムが停止すれば成功です！
ここからは、「F10」キーでステップオーバー、「F11」キーでステップインなど、おなじみの操作が使用できます。
因みに、ステップオーバーやステップインなどを行っている時に命令が飛んでしまったり前後したりする場合は、最適化のせいです。
デバッグ時は、このページ（[TOPPERS/ASPのビルドからデバッグまで～サンプルプロジェクトのデバッグ](https://www.madogiwakoubou.com/p/toppersasp_21.html)）の「[サンプルプログラムのデバッグ](https://www.madogiwakoubou.com/p/toppersasp_21.html#debug)」の項目を参考に最適化を解除しましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/e68193d9-340f-7c86-5323-8475f3c4b24a.png">

# サンプルプロジェクトの説明
興味のある方は、このページ（[TOPPERS/ASPのビルドからデバッグまで～サンプルプロジェクトで遊ぼう](https://www.madogiwakoubou.com/p/toppersasp_16.html)）を参照してください。

# AVR32版カーネルについて
以下、このカーネルにおける備考です。

## 割り込み優先度
このカーネルでは、<font color="Red">-1（優先度最低）</font>から<font color="Red">-4（優先度最高）</font>の4段階の優先度設定が可能です。
マイコンというのは、割り込みが起こるとアプリケーションで使っていたレジスタの値をスタックという専用のメモリへ退避させます。
更に割り込み処理が終わると、処理がアプリケーションへ戻る前にスタックへ退避させた値をレジスタに復帰させなければなりません。
したがって、これらの一時退避するレジスタの数が多いと処理自体がオーバーヘッドになり、反応性が悪くなります。
レジスタの退避と復帰は、割り込みルーチンの冒頭と終盤一命令ずつ書いていかなきゃならない（仮に一時退避するレジスタの数が8個なら、退避と復帰で計16ステップ必要）からです。
そういうマイコンが多数派ですが、AVR32（正確には「AVR32 UC3」）の場合はレジスタの一時退避をハードウェアで自動的にやってくれます。
ハードウェアによる一時退避の処理は非常に速いため、このことは割り込みの反応性を大きく向上させます。
つまり、<font color="Red">割り込みを多用するアプリケーションの性能が良い</font>ということです。
大変優れたアーキテクチャです！

## 例外ハンドラ
例外ハンドラとしては「..\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例外番号「<font color="Red">14</font>」の「<font color="Red">Data Address (Write)</font>」が引き起こされる仕掛けになっています。
この設定は「..\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」という<font color="Red">非常に行儀の悪いコード</font>が実行されるようになっています。
（「0x1」という奇数番地を32ビットのポインターのアドレスとして扱い、更に、それに対して値を書き込んでいる！）
このイタズラにより、データを書き込むメモリのアドレスのアラインメントの不正が検出され、その名の通りの「14(Data Address (Write))」CPU例外が引き起こされます。
小文字の「z」と大文字の「Z」の違いは、CPU例外が小文字の場合はカーネル管轄内で、大文字の場合はカーネル管轄外でそれぞれ実行されるということだけです。
各CPU例外の詳細については、AVR32のデータシートを熟読していただく必要がありますが、これらが引き起こされた時点で致命的な状況が多く「4(NMI)」以外は、デバッグでの用途以外、あまり使い道はないでしょう。

## 一部サービスコールは未対応
割り込みIDを指定して、これを有効／無効化するための「<font color="Red">ena_int()</font>」と「<font color="Red">dis_int()</font>」サービスコールはサポートしていません。
これはAVR32に搭載されている割り込みコントローラーがシンプルな設計であり、割り込み要因ごとに有効／無効化するためのフラグを設けていないためです。
どうしても一時的に割り込みを有効／無効化したい場合は、各ペリフェラルのレジスタを設定するか、CPU全体の割り込みを一括で設定しても良いのであれば、以下のような関数を呼び出すことで代用してください。
なお、以下の関数を使用するためには、これを使用するソースに「#include \<avr32/io.h\>」を一行加えてあげてください。
```
Disable_global_interrupt();  /* すべての割込みの禁止 */
Enable_global_interrupt();   /* すべての割込みの許可 */
```

また、性能評価用システム時刻取得のための「<font color="Red">get_utm()</font>」サービスコールは未実装です。

# ライセンスについて
このカーネルは「[TOPPERSライセンス](https://www.toppers.jp/license.html)」で配布しております。
無償ですが、使用に関しては自己責任です。
万が一、このカーネルを商用利用する方は、このリンク先の条項に従ってください…って、いらっしゃる訳ないですよね。
シリーズ自体がディスコンですから！

この可哀想なAVR32、TOPPERSカーネルもしばらくは頑張ってメンテナンスしていきますので、市場にある内にどうか使ってやって下さい！