TOPPERS/ASP - Arduino Mega2560版

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

# 概要
皆様おなじみの「<font color="Red">Arduino</font>」。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/fb1ea394-c59d-5498-c716-c87c3c32cc59.jpeg">

「Arduino IDE」という優れた開発環境を使って、手軽に組み込みソフトを作って動かせる安くて便利なボードとして、愛用されている方も多いのではないでしょうか。
私も長年、仕事で原理試作品をパパッと開発するために愛用しています。
でも、モノによってはどうしてもマルチタスクを使いたい案件もあり、Arduinoの本来の使い方では解決できないケースもあります。
そこで、「<font color="Red">Arduino Mega 2560</font>」に「μITRON4.0」準拠のRTOS（リアルタイムOS）である[TOPPERS/ASP](https://www.toppers.jp/asp-kernel.html)を移植してみました。
普通Arduinoといえば、「Arduino UNO」という代表機種を指しますが、今回使うのはその上位版の「Arduino Mega 2560」です。
「Arduino UNO」に搭載されているCPUは、ATmega328P(ROM：32KB／RAM：2KB)というもの。
ROMはともかく、さすがにこのRAM容量ではOSが載りません。
一方の「Arduino Mega 2560」に搭載されているCPUは、ATmega2560(ROM：256KB／RAM：8KB)ですので、十分とは言えないまでも何とかなるかな～？と思いました。
さて、このATmega2560、なんと8ビットCPUです。
<font color="Red">今どき8ビットってあ～た…。</font>
しかしながら、レジスタの数が多くてアセンブラのニーモニックもRISCらしくキレイで、そのせいもあってか8ビットCPUとしては例外的にGCCコンパイラが提供されています。
クロックも16MHzで動作しますので、ちょっとしたIoT機器なら十分に開発できそうです。

# 必要なもの
まずは、今回のターゲットとなる「Arduino Mega 2560」です。
<font color="Red">7,000円以上したら高い</font>と思ってください。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/c48151a0-2272-73af-1ee2-97cc473e635c.jpeg">

次に、デバッガです。
「<font color="Red">Atmel-ICE</font>」っていいます。
[秋月電子さん](https://akizukidenshi.com/catalog/g/gM-08285/)で16,800円ですね。
高い！…と思われるかもしれませんが、これ一台あるとAtmel系は今回のAVRやSAM（ARM）シリーズのデバッグも出来ちゃうので、今回の「Arduino Mega 2560」に限らずArduinoシリーズを普段良くお使いの方は買っておいて損はないですよ。
<font color="Red">まあ、安くはないわな…。</font>
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/9e7d18a9-e4d2-b2c9-c748-db989779fbac.jpeg">

# ダウンロード／GitHub
ソースコードの入手は、[こちら](https://github.com/RyutaroMorita/asp_arduino_mega2560_gcc)からどうぞ。
なるべく定期的にメンテナンスするようにしていますので、動きがおかしいな？という場合は最新版に更新をお願いします。
それでもダメな場合はコメントください。

# 開発環境の構築（Microchip Studio編）
Arduino Mega2560版のTOPPERS/ASPを使って開発を行っていく上では、以下の方針を採ります。

１．コーディングとビルドは「<font color="Red">Eclipse</font>」を使う。
２．デバッガを使う場合のみ「<font color="Red">Microchip Studio</font>」を使う。

…面倒くさいですね。
何で2つのIDEを使い分けなきゃならんのか？
それは、以下の理由からです。

<font color="Red">１．「Microchip Studio」はMicrosoftの「Visual Studio」をベースにしているため動作が重くて使いにくい。</font>
<font color="Red">２．TOPPERS/ASPはビルドに独自のMakefileを使うため「Microchip Studio」のGUIによるソースコード管理の利点が少ない。</font>

もちろん、これは個人的な好みです。
パソコンのスペックの問題はさておき、「Microchip Studio」だけで全てを賄う方法もあるに違いありません。
（私は上手くいかなかったのですが。）
しかしながら、ここでは上記の方針に則り説明していきます。

では、まずは以下のページで「Microchip Studio」のダウンロードをしましょう。

https://www.microchip.com/en-us/tools-resources/develop/microchip-studio

<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/b15474ae-34b3-4ce9-e044-a63b22fefb67.png">

「<font color="Red">Offline Installer</font>」と「<font color="Red">Web Installer</font>」という2つの種類のインストーラーがあるかもしれません。
ここでは「<font color="Red">Offline Installer</font>」を例とします。
ダウンロードが完了すると「<font color="Red">as-installer-x.x.xxxx-full.exe</font>」のようなファイルが落とせます。
これをダブルクリックしてみましょう。
以下のようにインストーラーが起動します。
ここでは「<font color="Red">I agree to the license terms and conditions.</font>」のチェックボックスをクリックして、「Next」ボタンをクリックして先に進みましょう。
<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/3ca07a65-d2d9-175d-5023-97e6adbdb8ff.png">

次は、開発ターゲットのアーキテクチャを選択します。
今回のArduino Mega2560は「<font color="Red">AVR</font>」というアーキテクチャですので、ディスク容量に余裕がない方は最悪「<font color="Red">AVR</font>」だけチェックすれば良いでしょう。
「Next」ボタンをクリックして先に進みましょう。
<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/dac4c641-3b2b-f5e1-fa71-a8590bcddeb1.png">

サンプルプログラムをインストールするかどうかを選択します。
こちらもディスク容量に余裕がない方はチェックしなくて良いです。
「Next」ボタンをクリックして先に進みましょう。
<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/84b210b9-5c30-555e-6c76-5715668455ac.png">

以下、特に何もせずに「Next」ボタンをクリックして先に進みましょう。
<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/4197497e-d2a6-1cdf-1e5b-cac945cfba46.png">

<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/dca6bd55-54eb-e469-d45a-dea6e5feb7df.png">

ようやくインストールが開始されました。
<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/2995e892-af27-480b-ceaf-715b26ed7dec.png">

…と思って安心したのも束の間、「MPLAB XC8」というソフトウェアのセットアップが始まります。
この「XC8」というのは「PIC」というMicrochip社の看板マイコンのためのコンパイラなのですが、前の画面で特に選択してませんよね？
<font color="Red">なんででしょう？</font>
まあ、害にはならないと思いますのでインストールしてあげましょう。
「Next」ボタンをクリックして先に進みましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/0f39ad84-8f0c-b71a-ab35-1c5be828711f.png">

お約束のライセンス画面です。
「<font color="Red">I accept the agreement</font>」のラジオボタンを選択して、「Next」ボタンをクリックして先に進みましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/1a9a03b3-8965-9052-6e6b-cd905babc75f.png">

以下、特に何もせずにひたすら「Next」ボタンをクリックして先に進みましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/20d124a1-8d9e-4c25-55b8-f1de06151b72.png">

<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/98ecfa67-8560-7677-3f03-16d3c87ab2ef.png">

<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/c2d06841-40b9-3082-d11d-ecc3c70dfc3f.png">

<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/6dc0dada-130f-ff77-0aed-c36d58bc8dff.png">

ようやく「XC8」のインストールが開始されました。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/027b6c0c-0cc9-9ab0-d6c0-a9869ce1edbc.png">

「XC8」のインストールが終了すると、以下のように「<font color="Red">Your Host ID is:</font>」という記述の後にパスワードらしきものが表示されています。
「XC8」を使用する際にはアクティベーションが必要であり、その登録のために必要なIDなのだそうです。
今回のAVRだけではなく、将来的にPICも使いたいよ～という方は、メモしておいた方が良いでしょう。
メモしたら「Next」ボタンをクリックして先に進みましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/4b4c2aed-ae39-b94f-a9da-a0f0ea369e35.png">

「XC8」のインストールはこれで終了のようです。
「Finish」ボタンをクリックして先に進みましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/143f5ba0-874e-8b9f-0815-d15ac310270b.png">

「Microchip Studio」のインストーラー画面に戻ってしばらくすると、お待ちかね（？）の「Visual Studio」のインストールが始まります。
このフェーズは今までのように色々聞いてこないので楽ちんです。
…なまら時間が掛かりますが。
「Visual Studio」のインストールが終了すると、自動的に消えて再び「Microchip Studio」のインストーラー画面に戻ります。
<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/fba5e96d-2d8b-d3d8-417f-09121ca44805.png">

この後のインストールの過程で、以下の画面が表示されることがあります（<font color="Red">3回位</font>）。
これは、各種デバッガのデバイスドライバのインストールの許可を求めています。
その中には、今回使用する「<font color="Red">Atmel-ICE</font>」のデバイスドライバもあるはずです。
「インストール」ボタンをクリックしましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/342e08f1-b37a-a19b-42c5-c681858ac098.png">

かなりの時間が掛かりますが、以下の画面が表示されると全てのインストール作業は終了となります。
「Close」ボタンをクリックします。
<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/217faf89-f2be-7178-0b53-ca89335be003.png">

「Microchip Studio」が起動するはずです。
以下のような画面が見られれば「Microchip Studio」のインストールは成功です。
お疲れ様でした！
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/6e7b9179-0e94-3138-b098-54785792a448.png">

# 開発環境の構築（Eclipse編）
さて、<font color="Red">デバッガを使うための「Microchip Studio」</font>のインストールに続き、<font color="Red">コーディングとビルドを行うための「Eclipse」</font>をインストールします。
まずは、今回使う「AVR」用のツールチェーンの環境変数の設定を行います。
ツールチェーンは、「Microchip Studio」のインストールにより既に以下のディレクトリにセットアップされているはずです。

**C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin**

普通にGCCを含むGNUツールチェーンですね。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/a2959587-9e63-f84e-f628-575c936b0f2b.png">

ディレクトリの名前で「<font color="Red">Atmel</font>」って何？と思われた方もいらっしゃるでしょう。
Atmel社は、かつてはAVRマイコンを始めとする半導体メーカーでした。
ホビー用途に使える手軽なマイコンとして、AVRマイコンは、PICマイコンと人気を二分するライバルでした。
だからかどうかは知りませんが、PICマイコンのメーカーであるMicrochip社が、あろうことかAtmel社を買収しちゃったんですね。
というわけで、ちょっと前まで「Microchip Studio」は「Atmel Studio」という名前であり、このディレクトリの名前はその名残りでしょう。
さて、話を戻して…。
環境変数の設定方法は他のページで調べていただくか、あるいは手前味噌で恐縮ですが、私のブログのページ（[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\avr8\avr8-gnu-toolchain\bin**

に置き換えてください。
こんな感じ…。
<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/504e5805-8ad8-dabd-cedd-3b553d7055bc.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/7fc75333-584a-9843-460e-94976fb07eb9.png">

続きまして「<font color="Red">Cygwin</font>」のインストールを行います。
基本的には「gcc-core」、「make」、「diffutils」、「perl」と「git」の5つのパッケージを含むようなCygwin環境を構築すれば良いです。
もしよろしければ、私のブログのページ（[TOPPERS/ASPのビルドからデバッグまで～Cygwinの導入](https://www.madogiwakoubou.com/p/toppersaspcygwin.html)）を参考にしてください。
「Cygwin」がインストールできたら、ここまでの作業が上手くいっているかどうか確認しておきましょう。
次のページ（[TOPPERS/ASPのビルドからデバッグまで～サンプルプロジェクトのビルド](https://www.madogiwakoubou.com/p/toppersasptoppers.html)）を参照してください。
ただし、今回使用するソースコードはこのページの冒頭の<font color="Red">「NUCLEO-F401RE STM32 Nucleo-64」開発ボード用のTOPPERS/ASPカーネル簡易パッケージではなく、「Arudino MEGA2560」用のものを使います。</font>
以下のコマンドでソースコードのクローンを行います。

**$ git clone https://github.com/RyutaroMorita/asp_arduino_mega2560_gcc.git**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/a6c7cec8-3672-b402-32b4-9fbff8b13403.png">

「asp_arduino_mega2560_gcc」というディレクトリの名前を「asp_1.9.2」などと改名すると、上記のページと同じ状況になります。
また、今回は<font color="Red">「OBJ」ディレクトリを作成する必要はありません。</font>
これは既に用意されていますので、そのまま「OBJ」ディレクトリに移動し「make～」コマンドを実行してください。

コマンドライン環境で正しくビルドができることを確認したら、いよいよ「Eclipse」のインストールを行います。
あまりにも古すぎるものを除けば、好きなバージョンの「Eclipse」をインストールしてください。
よろしければ、このページ（[TOPPERS/ASPのビルドからデバッグまで～Eclipseの導入](https://www.madogiwakoubou.com/p/toppersaspeclipse.html)）を参考にしてください。

# プロジェクトの作成（Eclipse編）
これまでの作業で、開発環境をインストールし、Arduino Mega2560版TOPPERS/ASPのソースコードをダウンロードし、それをコマンドラインでビルドするまでを行いました。
このままずっとコマンドラインで作業するのもシンドいので、Eclipse上でビルドが行えるようにプロジェクトを作成しましょう。
このページ（[TOPPERS/ASPのビルドからデバッグまで～サンプルプロジェクトのデバッグ](https://www.madogiwakoubou.com/p/toppersasp_21.html)）の「[プロジェクトの作成](https://www.madogiwakoubou.com/p/toppersasp_21.html#create)」および「[プロジェクトのクリーンとビルド](https://www.madogiwakoubou.com/p/toppersasp_21.html#clean_build)」の項目を参考にプロジェクトを作成してください。
「[デバッガの登録](https://www.madogiwakoubou.com/p/toppersasp_21.html#registration)」の項目は読み飛ばしてください。
今回はデバッグ作業をこのEclipse上で行わず、次にプロジェクトを作成する「Microchip Studio」上で行う方針なので、この作業は必要ありません。
Eclipseの画面右側に以下のようなアイコンが表示されて、これらをダブルクリックすることによりビルドができるまでを確認してください。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/c01fb683-6da1-d2ed-2a5c-8207c4375051.png">

これでEclipse上でのプロジェクトの作成は完了です。
Eclipseを閉じる前に、次の作業のために「realclean」を実行しておいてください。

# プロジェクトの作成（Microchip Studio編）
さて、もう一方のIDEである「Microchip Studio」用のプロジェクトも作りましょう。
とはいえ、既にこのプロジェクトはソースコードの「OBJ」ディレクトリ内に用意してあります。
（いやいや、ちゃんと自分で一から作りたい！という方は下記＜[補足](#補足)＞を参照のこと。）
「<font color="Red">asp.atsln</font>」というファイルがそれです。
これをダブルクリックすると「Microchip Studio」が起動します。
（初回は<font color="Red">信じられないくらい起動が遅い</font>です。
これだから極力使いたくないんですよね…。）
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/61dde8af-0207-6b5b-7b06-583ca9fd45d5.png">

起動の途中に以下のようなダイアログが表示されるかもしれません。
開こうとしている「Microchip Studio」のバージョンが、このプロジェクトファイルが作られた時と違うじゃないか！って怒って（？）ます。
問題ないので「Yes」をクリックします。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/c4b52d8f-e72d-b7c4-3e89-f220b2a9877f.png">

さらにしばらく待つと、ようやく以下のようにIDEが起動します。
画面右上の「VA Outline」というウィンドウの下の「<font color="Red">Solution Explorer</font>」タブをクリックしてください。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/a95350c0-2c7f-5f9c-bf0f-d4e82a090667.png">

「<font color="Red">Solution Explorer</font>」タブにTOPPERS/ASPのソースコードが表示されているのを確認してください。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/c4b9df9e-16a4-cc75-5950-b7e492885c2c.png">

さて、この「Microchip Studio」でもTOPPERS/ASPをビルドしてみましょう。
画面上部の「Build」メニューから「<font color="Red">Build Solution</font>」の項目をクリックします。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/8f5b1eb0-b7db-4cac-9805-c0264398f10b.png">

ビルドが開始され、今までコマンドラインやEclipdeで見たようなビルドメッセージが画面下部に表示されれば、「Microchip Studio」上でのプロジェクトの作成は完了です。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/b5b6fb70-11b3-cc69-bea6-6ce158483b98.png">

# 補足
TOPPERS/ASPは独自のMakefileを使用してビルドします。
「Microchip Studio」で普通にプロジェクトを作成した際に自動的に生成されるMakefileではビルドができません。
したがって、TOPPERS/ASP用のプロジェクトを「Microchip Studio」で作成する場合は、TOPPERS/ASP用の既存のMakefileを指定してプロジェクトを作成する必要があります。
「Microchip Studio」でこれを行う場合は、プラグインをインストールする必要があります。
画面上部の「Tools」メニューから「<font color="Red">Extentions and Updates...</font>」の項目をクリックします。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/2ace7170-56d0-eec6-32fd-4e3dd5389eb6.png">

以下のようなウィンドウが表示されたら、左のリストから「<font color="Red">Online</font>」をクリックします。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/57a9c442-4823-e661-612d-e16df88c5145.png">

以下のようなウィンドウが表示されます。
多くのプラグインがあります。
既存のMakefileからプロジェクトを作成するためのプラグインは「<font color="Red">Create Project from Makefile</font>」という名前なので、このウィンドウの右上の検索ボックスに入力しましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/78daa2be-aece-a336-f74a-4129fd117733.png">

あった、これだ！
「<font color="Red">Download</font>」ボタンをクリックしてプラグインをインストールします。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/c01bc4ac-f121-f215-7ba9-94ed81b8d9e3.png">

お約束のライセンス画面。
「<font color="Red">Install<font>」をクリック。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/79f6e1f0-1def-710e-fa2d-cb79b276422c.png">

インストールが完了したプラグインを使用するためには、「Microchip Studio」を再起動する必要があるみたいです。
「<font color="Red">Restart Now</font>」をクリックします。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/a80106ec-765f-dbc0-0063-e02ba3e119db.png">

再起動後に画面上部の「Tools」メニューを見てみると、「<font color="Red">Create Project from Makefile</font>」が追加されているのが確認できるはずです。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/99683348-4fe4-fa39-0f88-a58c1ca88067.png">

これを実行するとウィザード形式で既存のMakefileから「Microchip Studio」のプロジェクトが作成できます。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/14340703-eab9-2c55-a0f9-912bfba08ff8.png">

最初から入っている「OBJ」ディレクトリの中の「asp.atsln」も、こうやって作りました。
一からプロジェクトを作るときの参考にしてください。

# デバッガとArduinoの配線
結論から言いましょう。
<font color="Red">なまら面倒くさいです！</font>
デバッガの「Atmel-ICE」と「Arduino Mega 2560」の間で、こんな感じの配線をしなければなりません。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/ef0d117c-c870-d308-ff96-c30df41b5208.jpeg">

「Atmel-ICE」には2種類のケーブルが同梱されているはずです。
そのうちの6ピンのものは、Arduinoの「ICSP」というピンにそのまま挿すだけです。
出っ張り部分をCPU側にして、こんな感じ。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/94d8f753-e93f-1db1-a516-d430d06ead21.jpeg">

問題はもう一方のケーブル、10ピンがバラバラに出てるやつです。
それをこのように配線しなければならないのが大変なんです。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/2f7bfb9a-12cc-bbee-0d75-69ab35e04902.jpeg">

ピン配は「<font color="Red">Arduino --- 10ピンケーブル・ピン番</font>」で以下の通り。


**RESET --- 8ピン**
**5V --- 4ピン**
**GND --- 2ピン**
**A4 --- 1ピン**
**A5 --- 5ピン**
**A6 --- 3ピン**
**A7 --- 9ピン**

以上、計7ピン。
面倒だけど仕方ない、繋ぐか～…と思った矢先に更なる試練が！
<font color="Red">どっちもメスじゃん！？</font>
こういうケースで私がよくやる手は以下の通りです。
まず、工具箱の底の方に転がっている、こんな感じのピンヘッダ。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/c4fa7af6-e53e-24c5-b6e2-fd40d539df21.jpeg">

この金属のピンの部分をラジオペンチで樹脂から引き抜きます。
そして、引き抜いたピンを以下のようにピンソケットに挿しておきます。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/1b9c5d52-f99f-9ad1-87c9-6a41ebb9b9e0.jpeg">

これで擬似的にオスーメスの状況を作れますが、嵌合は緩く接触不良の懸念がありますので、あまりオススメしません。
これをやる場合は、配線したらマスキングテープで留めておきましょう。

# AVRマイコンのヒューズ設定

「Arduino Mega 2560」に搭載されているAVRマイコン。
このシリーズには、ヒューズ設定というものがあります。
例えば、クロックは何処から取るのか？そのクロックの分周比はどのくらいか？ウォッチドッグを使うかどうか？…などといった、CPUの基本的な動作を設定するレジスタのようなものです。
その中の設定の一つに「JTAGを使うかどうか？」というものがあります。
今回、デバッガとして「Atmel-ICE」を使うことを前提に記事を書いていますが、この「Atmel-ICE」にはターゲットに対して２つの接続モードがあります。

**１つ目は、ヒューズの設定やプログラムの書き込みなど、比較的シンプルな操作を行うための<font color="Red">「ISP」モード</font>。**
**２つ目は、「ISP」モードの機能に加え、ブレークポイントを仕掛けてプログラムをデバッグするなどの高度な操作を行うための<font color="Red">「JTAG」モード</font>。**

配線の時に、2つケーブルを接続したでしょう？
6ピンの方は「ISP」モード用、バラバラ10ピンの方は「JTAG」モード用の配線なのです。
問題なのは「Arduino Mega 2560」（というかAVRマイコン全般）は<font color="Red">デフォルトのヒューズ設定では「JTAG」モードを使用できない</font>ということです。
但し「ISP」モードは使えますし、これでヒューズの設定を変えることもできます。
ですので、これを使って「JTAG」モードを使えるようにヒューズ設定を変更しましょう。
<font color="Red">「Atmel-ICE」高いんだから、</font>最大限に役に立ってもらわなければ！
早速、「ISP」モードでパソコンと「Atmel-ICE」をUSBで繋ぎましょう。
「Atmel-ICE」に接続するケーブルは、6ピンの方です。
バラバラ10ピンの方は、とりあえず放置。
同時に「Arduino Mega 2560」もUSBでパソコンに繋ぎます。
（「Atmel-ICE」側は「SAM」ではなくて「AVR」の方のコネクタに接続してください。）
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/258f001e-d382-fe4d-4756-39474e9d7095.jpeg">

次は、ソフトウェア側の操作です。
「Microchip Studio」でプロジェクトを作成した先程の状況から始めます。
以下の画面が表示されたら、上部にある「<font color="Red">ATmega2569</font>」というタブをクリックしてください。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/f7b82cef-2393-865d-f616-decba14846cb.png">

すると、以下の表示に切り替わりますので、すかさず左のリストから「Tool」をクリックしてください。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/4fdcca76-3abb-7f71-ed26-0cd957f26566.png">

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

この設定を保存しましょう。
画面上部の保存アイコンをクリックしてください。
（いいよね～フロッピーディスクのアイコン。）
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/c3d63903-45ec-e6fd-bb09-b053d8a54613.png">

次に、「Microchip Studio」のメニューから「Tools」->「<font color="Red">Device Programming</font>」をクリックします。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/8c530ae3-5b1c-f3cf-a1b0-58f18d236786.png">

以下のような画面が表示されたら、「Tool 」は Atmel-ICE、「Device」はATmega2560、「Interface」はISP、それぞれの設定を確認の上「<font color="Red">Apply</font>」をクリックしてください。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/6b04e53b-8b70-ab10-516c-65263add9686.png">

以下のような画面が表示されたら、左側のリストから「<font color="Red">Fuses</font>」をクリックします。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/3793c977-802d-d236-57f9-bebea072c99d.png">

以下のような画面が表示されれば、「ISP」モードにより正常にCPUからヒューズ設定を読み出せた証です。
これが現在のヒューズ設定です。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/a24b2bf0-b14e-55ee-92e3-021b2214d149.png">

ここから、以下のようにヒューズ設定を変更します。
これらを変更すると、画面下部の「<font color="Red">HIGH</font>」の値が変わります。
この値は、各々のヒューズ設定をビット化し、それをHEXで表したものだからです。
**・「HIGH.JTAGEN」のチェックを入れる**
**・「HIGH.EESAVE」のチェックを入れる**
**・「HIGH.BOOTRST」をチェックを外す**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/6e3f1d82-b7a1-898c-616b-7b41c20c2452.png">

画面下部の「<font color="Red">HIGH</font>」の値が「**0x91**」になればOKです。
「<font color="Red">Program</font>」ボタンをクリックして、新しいヒューズ設定をCPUに書き込みましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/ca7bf3c4-5a83-a2c0-a113-6ddd2a00c327.png">

以下の警告が出ます。
「JTAGEN」のチェックを外すとJTAG使えなくなるぞ！…って、知ってるし、今回チェックしたし、デフォルトで使わせてくれないからこうやって余計な作業をしているわけだが…。
「<font color="Red">Continue</font>」をクリックです！
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/8beb308a-a042-5143-74c6-520c176cae20.png">

以下のように、画面最下部に「<font color="Red">Verify registers ... OK</font>」の表示が出れば、無事ヒューズ設定の更新は完了です。
「<font color="Red">Close</font>」ボタンをクリックして、画面を閉じましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/2b205b72-69dd-865b-8467-358b0d082ffa.png">

これで「Atmel-ICE」で「JTAG」モードを使える設定になっているはずです。
確かめてみましょう。
「JTAG」モードでパソコンと「Atmel-ICE」をUSBで繋ぎましょう。
「Atmel-ICE」に接続するケーブルは、バラバラ10ピンの方です。
「ISP」モード用の6ピンのケーブルと繋ぎ替えてください。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/5857e015-9ce8-7ce3-2ca9-ef9345cf302c.jpeg">

「Microchip Studio」の方は、以下の画面に戻りましょう。
この画面の「<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/87a1eb8b-2ba1-7534-2b7d-082c991129db.png">

おっと、保存もお忘れなく！
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/c3d63903-45ec-e6fd-bb09-b053d8a54613.png">

「Microchip Studio」のメニューから「Tools」->「<font color="Red">Device Programming</font>」をクリックします。
今度は「<font color="Red">JTAG</font>」を選択して「<font color="Red">Apply</font>」！
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/67b1cd56-28df-49a0-646e-0f5c6623411a.png">

以下のように「JTAG」モードでも先程設定した通りのヒューズ設定が表示されれば大成功！
これでデバッガが使えるようになりました！
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/3d525822-8e15-a401-14c5-8cd269c1d67d.png">

# プログラムの転送とデバッグ
さて、JTAGが使えるようになったので、早速サンプルプログラムを転送して実行してみましょう。
その前に「<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)」の項目を参考にしてください。
もちろん、シリアル通信のターミナルであれば、他のものもお使いいただけます。
「Arduino Mega 2560」はパソコンにUSB接続すると、擬似的なシリアルポートとして認識されます。
今回のTOPPERS/ASPのサンプルプログラムは、シリアル通信のメッセージを出力しますので、認識されたシリアルポート番号でターミナルを立ち上げておきましょう。
設定は、こんな感じです。
ボーレートは「9600」です。
（私のパソコンは、Arduinoをポート10として認識していますね。）
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/20304e3b-8ef0-6a2f-493d-f9656c2b4f42.png">

さて、「Microchip Studio」に戻りましょう。
プログラムのビルドと実行を行います。
画面上部の「<font color="Red">▶</font>」ボタンをクリックします。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/478cf0ca-41cc-9a90-16c8-fd297b1c0e1d.png">

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

ブレークポイントを試してみましょう。
動作中のプログラムを停止します。
画面上部の「<font color="Red">■</font>」ボタンをクリックします。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/4edbd424-0cea-ea41-afe6-74c95077589c.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/8f698acc-c8db-8a90-297e-72e460b8e3ee.png">

では、ブレークポイントを仕掛けた状態で、プログラムを再び実行してみます。
上手く引っかかってくれるでしょうか…。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/478cf0ca-41cc-9a90-16c8-fd297b1c0e1d.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/a360f94d-ccfc-2aec-80ab-3a3f1f0bcf3a.png">

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

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

## ArduinoIDEやライブラリは使用不可
このカーネルを使った時点で、ArduinoはArduinoでなくなります。
当然、便利なArduinoIDEや、それに付随する豊富なライブラリは使用できなくなります。
但し、「ATMega2560」チップのペリフェラル用のデバイスドライバなどは「Microchip Studio」導入時にサンプルプログラムのインストールを選択していれば、豊富なサンプルコードが手に入るはずです。
少々手間ですが、これらをカーネル上で動くように移植することは難しくないと思います。
また、TOPPERS/ASPカーネルで動作しながらArduinoのライブラリを使えるような「[TOPPERS/R2CA](http://dev.toppers.jp/trac_user/contrib/wiki/rtos_arduino)」（凄い！）という実装も存在します。
この場合はターゲットが「Arduino Mega2560」ではなく、ARMコアの「Arduino M0」になりますが、極めて有意義な実装です。

## 割り込み優先度の設定不可
このカーネルでは、割り込み優先度の設定はできません。
コンフィグレーションファイルなどにおいて、他のアーキテクチャからの移植性を考慮して、<font color="Red">-1（優先度最低）から-6（優先度最高）</font>を設定してもエラーが起きないようになっていますが、実際の動作に反映しません。
これは「ATMega2560」チップに搭載されている割り込みコントローラーがシンプルな設計であり、割り込み優先度を変更する機能が存在しないためです。
「ATMega2560」チップにおける割り込み優先度は、<font color="Red">割り込み番号が若いほど優先度が高くなる</font>ように固定されています。

## 多重割り込みには未対応
デフォルトでは、割り込みハンドラやタスクコンテキスト以外のプログラムのための（非タスクコンテキスト用）スタック領域は、<font color="red">0x200（512バイト）</font>としています。
これは「..\target\arduino_mega2560_gcc\target_config.h」の以下の箇所で「DEFAULT_ISTKSZ」という名前で定義されています。
```
/*
 *  デフォルトの非タスクコンテキスト用のスタック領域の定義
 */
#define DEFAULT_ISTKSZ          0x200U
#define DEFAULT_ISTK            (void *)(0x00002200U - DEFAULT_ISTKSZ - 1)
```

このスタックサイズは、Arduino Mega2560に搭載されている「ATMega2560」チップのRAMのサイズがわずか8KBであることを考えれば、妥当と考えています。
しかし、これにより多重割り込みのサポートを諦めています。
0x200（512バイト）というスタックサイズでは、割り込みをネストするのには十分ではなく、あっという間に暴走してしまう危険性が高くなりますので、そのリスクを避けました。
もっとも、多重割り込みが必要なほどの処理がシビアなアプリケーションには、このターゲットは使われないだろうと判断した結果です。

## 例外ハンドラは未対応
コンフィグレーションファイルなどにおいて、他のアーキテクチャからの移植性を考慮して、例外ハンドラの作成はできるようになっているものの動作はしません。
理由は「ATMega2560」チップに例外処理が存在しないためです。

## 一部サービスコールは未対応
割り込みIDを指定して、これを有効／無効化するための「<font color="Red">ena_int()</font>」と「<font color="Red">dis_int()</font>」サービスコールはサポートしていません。
これは「ATMega2560」チップに搭載されている割り込みコントローラーがシンプルな設計であり、割り込み要因ごとに有効／無効化するためのフラグを設けていないためです。
どうしても一時的に割り込みを有効／無効化したい場合は、各ペリフェラルのレジスタを設定するか、CPU全体の割り込みを一括で設定しても良いのであれば、以下のような処理で代用してください。
```
/* すべての割込みの許可 */
Asm("sei");
```
```
/* すべての割込みの禁止 */
Asm("cli");
```

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

# 参考資料
Arduino Mega2560に搭載されている「ATMega2560」チップに関する詳細な情報は、メーカーであるMicrochip社のWebページはもちろんのこと、「<font color="Red">ＡＶＲ日本語情報サイト</font>」をご覧頂くことをお勧めします。
特に後者のページは、ディスパッチャやデバイスドライバの実装の際に大変にお世話になりました。
こんな場で恐縮ですが、心より感謝を申し上げたい。
<font color="Red">ありがとうございました！</font>
このページは、日本におけるAVRマイコンのシェアを大きく伸ばしたものと思います。
但し、条項が厳しいため（相当イヤな目に遭ったみたい…）、<font color="Red">こちらのサイトへの直接リンクを張ることはできません</font>ので、お手数ですが検索してお読みください。

# ライセンスについて
このカーネルは「[TOPPERSライセンス](https://www.toppers.jp/license.html)」で配布しております。
無償ですが、使用に関しては自己責任です。
まず居ないとは思いますが…万が一、このカーネルを商用利用するような無茶をやる場合は、このリンク先の条項に従ってください。