TOPPERS/ASP - PIC32MX版

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

# 概要
今回取り上げるのは、Microchip社のマイコン「<font color="red">PIC32MX</font>」です。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/bee61980-9d60-932e-7d7d-649baf653249.jpeg">

「[PIC](https://ja.wikipedia.org/wiki/PIC_(%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9))」といえば、電子工作を趣味としている方々の強い味方。
５V動作のDIPパッケージ（ゲジゲジの脚が太い形状）で手軽に扱えるマイコンとして、AVRマイコンと並び、あまりにも有名な存在ですね。
通常「PIC」といえば、このようなローエンドの8ビットマイコンを指すことが多いのですが、実は、16ビットや32ビットなどのバリエーションもあります。
一般的に、
**PIC10,12,16,18系が8ビット、**
**PIC24,dsPIC系が16ビット、**
**PIC32系が32ビットと**
かなりの大所帯なシリーズ展開となっております。
しかしながら、ここで厄介な問題が…。
それは、各ビットのシリーズ間で丸っきりCPUのアーキテクチャが異なることです。
つまり、8ビットのPICのアーキテクチャと32ビットのPICのそれとは全く違うということです。
8および16ビットのPICのアーキテクチャは、それぞれ異なるMicrochip社独自のものです。
32ビットのPICのアーキテクチャは「<font color="red">MIPS</font>」と呼ばれるものを採用しています。
この「MIPS」なるものを説明すると多くのページが必要となってしまいますので、興味のある方は[Wiki](https://ja.wikipedia.org/wiki/MIPS%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3)をご参照ください。
簡単に言えば、RISCという設計思想の正しさを証明するという学術的な理由から開発された、大学の研究室由来のアカデミックなアーキテクチャです。
こんな大学の教科書みたいな表紙のイメージ通り、アカデミックです！
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/8a2d6fc5-05ac-1ba3-9f2c-f66f8f4698a1.jpeg">

この評価の結果、旧来のCISCに対するRISCの優位性が証明され、後のARMやPowerPCの設計に大きな影響を与えたわけですが、これについての蘊蓄はこの辺にして。
この「MIPS」、昔は結構流行っていました。
しかし、今となってはやや古いアーキテクチャであることは否めず、RTOSなどの移植の例も少ない寂しい現状…。
そこで、現在市場に流通している唯一のMIPSアーキテクチャのマイコンである「PIC32MX」に「μITRON4.0」準拠のRTOS（リアルタイムOS）である[TOPPERS/ASP](https://www.toppers.jp/asp-kernel.html)を移植してみました。
直接の移植の動機は、なんと言っても秋月電子通商さんで販売されている以下の製品の存在ですね。

[●ＰＩＣマイコン　ＰＩＣ３２ＭＸ２７０Ｆ２５６Ｂ－５０Ｉ／ＳＰ](https://akizukidenshi.com/catalog/g/gI-10894/)
[●ＰＩＣマイコン　ＰＩＣ３２ＭＸ２５０Ｆ１２８Ｂ－Ｉ／ＳＰ](https://akizukidenshi.com/catalog/g/gI-07644/)

MIPSアーキテクチャで動作周波数50MHz級の本格的なマイコンがDIPパッケージで売られているという事実。
<font color="red">DIPパッケージというところが肝心です。</font>
私のような~~ボンクラ~~ソフトウェア技術者だと、ハンダ付けが下手ですので、QFPパッケージ（脚が四方に出ていて、めっちゃ細い形状）での実装は難しいのです。
なので、気軽に治具や簡単な計測器を作成する際に、これほど助かることはありません。
<font color="red">PIC32は8ビット系のシリーズとは異なり、5Vではなく3.3V駆動</font>となってしまいますが、それでも十分にありがたい存在です。

# 必要なもの
今回のターゲットとなる「<font color="red">PIC32MX1/2/5 Starter Kit</font>」です。
[秋月電子通商さん](https://akizukidenshi.com/catalog/g/gM-12065/)で売ってます。
この記事の執筆時点の価格で、8,600円です。
デバッガー機能を内蔵していますので、これポッキリで開発が進められます。
これが高いか安いかの議論はさておき…。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/32760688-d252-efb0-7afa-f91209f5d797.jpeg">

他の型番への移植も可能ですが、TOPPERS/ASPを搭載して動作させるならROM：128KB／RAM：8KB以上の容量を持つ型番を選びましょう。
このブログでは「<font color="red">PIC32MX1/2/5 Starter Kit</font>」を使用した場合の例を説明していきたいと思います。

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

# 開発環境の構築（MPLAB X IDE編）
「<font color="red">MPLAB X IDE</font>」とは、Microchip社の純正のIDEです。
PIC32MX版のTOPPERS/ASPを使って開発を行っていく上では、以下の方針を採ります。

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

…面倒くさいですね。
何で2つのIDEを使い分けなきゃならんのか？

<font color="red">すいません、完全に個人的な趣味です！</font>

コーディングは「Eclipse」の方が慣れているし、「MPLAB X IDE」はビルドやプロジェクト管理のやり方がイマイチ分かり難かったので、つい…。
もちろんコーディングを含めて「MPLAB X IDE」だけで全てを賄う方法もあるに違いありません。
（私は上手くいかなかったのですが。）
しかしながら、ここでは上記の方針に則り説明していきます。

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

https://www.microchip.com/en-us/products/microcontrollers-and-microprocessors/32-bit-mcus

<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/68337618-fd91-3265-ac7b-12b393885b45.png">

上記のページのちょっと下の方に行ってもらって、「MPLAB X IDE」のロゴと「<font color="red">Learn More</font>」というバナーが配置されている箇所がありますよね。
ここで「<font color="red">Learn More</font>」バナーをクリックします。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/88530b24-0544-8f54-5e94-bea6a9e12894.png">

新しいページに誘導されます。
ここで「<font color="red">Download MPLAB X IDE</font>」のバナーをクリックです。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/c2838215-e5df-d8c1-16ae-b1ce38361d54.png">

すると、以下のような場所に誘導されます。
ここで最新版の「MPLAB X IDE」をダウンロードしたくなりますが、<font color="red">それはダメです。</font>
なぜならば、今回のターゲット「PIC32MX1/2/5 Starter Kit」は、新しめのバージョンではサポートが打ち切られ、最新版では「PIC32MX1/2/5 Starter Kit」用のプロジェクトの出力ができないからです。
それほど古い評価ボードではないと思うのですが、なんででしょうか？
大人の事情！？
ウ～ン、ちょっと気持ち悪いですが、とりあえず今はガマンして古いバージョンを探してみましょう。
なので、以下の通り「<font color="red">Go to Downloads Archive</font>」バナーをクリックしましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/56731db1-5dfd-e5fb-03d2-d55a0352d94e.png">

以下のような場所に誘導されます。
ちょっと下の方に行ってもらって、良さそうなバージョンを探しましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/6bfe2ebb-4bb1-434f-4100-f0988f271ef0.png">

以下のようなリストに辿り着いたら「<font color="red">Next ></font>」というバナーをクリックしていきましょう。
ここでは動作確認ができている「<font color="red">MPLAB X v5.40</font>」を探します。
（v6.0まで行かなければ、v5.45やv5.50でも大丈夫とは思います。）
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/00223444-53fe-b7dd-e0d6-dc30466c9f18.png">

あった！これだね。
「<font color="red">MPLAB X v5.40</font>」という表記の部分をクリックして、ダウンロードを開始します。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/83a669c7-4374-da63-cdbc-955902ae7737.png">

ダウンロードが完了すると「<font color="red">MPLABX-v5.40-windows-installer.exe</font>」というファイルが落とせます。
これをダブルクリックしてみましょう。
以下のようにインストーラーが起動します。
「<font color="red">Next ></font>」ボタンをクリックして先に進みましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/03e1366a-72a5-9c6b-8932-1555cb0966f7.png">

ほいほい、ライセンスね。
分かりましたよ～ってことで、同意のラジオボタンをクリックし、「<font color="red">Next ></font>」ボタンをクリックです。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/1e26e6d1-fff7-e8cc-4bd8-593c2e200a38.png">

その後は、しばらく「<font color="red">Next ></font>」ボタン連打！
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/675f29b4-7675-b2dd-fecf-9be1466bddea.png">

<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/5ae1d2d9-0202-38d2-fa05-ecffc9d9111a.png">

<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/70c8ba2a-8247-e4fb-556c-53a140e25dc1.png">

ようやくインストールが開始されました。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/ae7e698b-1ad6-15d7-6797-e31cb5c01c0d.png">

<font color="red">かなり壮大な時間がかかります</font>が、インストール終了です。
「<font color="red">Finish</font>」ボタンをクリックです。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/f21cc9bf-9bc3-72c3-9f3d-ecf13690bbe8.png">

勝手にブラウザが開いて、他のソフトウェアをダウンロードするように促されますが、何もしない閉じちゃって大丈夫です。

# 開発環境の構築（XC32コンパイラ編）
お次はPIC32MX用のコンパイラのインストールを行いましょう。
「<font color="red">XC32</font>」っていうGCCベースのコンパイラです。
以下のページでダウンロードします。

https://www.microchip.com/en-us/tools-resources/develop/mplab-xc-compilers

このページのほんのちょっと下へ行ってもらって…。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/3ece72b2-8791-5135-b90a-a0e83a36ef98.png">

３つ並んでいる内の一番右「<font color="red">Download an XC32 Compiler</font>」というバナーをクリックして下さい。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/cfacc4fa-df11-a42d-6ac2-3b427a998721.png">

以下のようなページに飛ばされますので、ここでは「<font color="red">MPLAB VC32 C-Compiler(Winodws)</font>」をクリックです。
ダウンロードが始まります。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/146857b3-d94b-489a-b058-f1db2c77b6bc.png">

ダウンロードが完了すると「<font color="red">xc32-vx.xx-full-install-windows-x64-installer.exe</font>」というファイルが生成されますので、これをダブルクリック！
以下のようにインストーラが起動します。
ここでは「<font color="red">Next></font>」ボタンをクリックです。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/57c0795c-d61b-2e9d-5d52-464518abfeca.png">

お次はお約束のライセンス承諾。
「<font color="red">I accept the agreement</font>」のラジオボタン、「<font color="red">Next></font>」ボタンを順にクリックしましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/0508d591-6a3a-9d0c-ca2b-940a9d37cdde.png">

しばらくは「<font color="red">Next></font>」ボタンを連打です。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/695e24aa-61bb-bb19-e65f-a2f17b31a35c.png">

<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/6a036487-cb8d-0748-314c-a2fbd39695a5.png">

<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/f118bc00-5bec-af33-c4f4-8c246f1dc36e.png">

<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/da9003d2-75eb-e12e-292c-07ba2ada8b2f.png">

ようやくインストール作業が開始されたようです。
これがまた終わるまでにどえりゃ～時間がかかります。
コーヒー片手に、しばらくネットサーフィンでもしていてください。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/639727d2-64aa-caa3-7a6d-2632bbb017fb.png">

インストールが終わると以下のような表示が…。
以下のように「<font color="red">Your Host ID is:</font>」という記述の後にパスワードらしきものが表示されています。
「XC32」を最大限の最適化で使用する際にはアクティベーションが必要であり、その登録のために必要なIDなのだそうです。
趣味レベルではなく、仕事などで本格的にPIC32を使いたいよ～という方は、メモしておいた方が良いでしょう。
アクティベーションしなくても、普通の用途ならコンパイラは問題なく使えます。
一応メモしたら「<font color="red">Next></font>」ボタンをクリックして先に進みましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/ebb6660b-d562-df0f-c647-a503c3ef9297.png">

コンパイラのインストールはこれで完了です。
「<font color="red">Finish</font>」ボタンをクリックしてインストーラを終了させましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/7cd23951-ee4d-6db9-f51b-d02aaead847e.png">

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

**C:\Program Files\Microchip\xc32\v4.30\bin**
（XC32のバージョンが「4.30」の場合）

XC…などと言っても、普通にGCCを含むGNUツールチェーンのように見えます。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/666b6fd1-c015-24b7-30c2-3cb63d795a7e.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\Microchip\xc32\v4.30\bin**

に置き換えてください。
こんな感じ…。
<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/653344e5-b54a-7204-483f-c78f8f0d8fbb.png">

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

**＞ xc32-gcc --version**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/55f0c811-5541-d1d1-15ff-a30ff22282d5.png">

続きまして「Cygwin」のインストールを行います。
基本的には「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_pic32mx_gcc.git**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/46f0fbf2-6176-671a-2e2d-148cf3d0153a.png">

ダウンロードとGithub、いずれの場合も「asp_pic32mx_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)）を参考にしてください。

# MPLAB Harmonyとは？
「[MPLAB Harmony](https://www.microchip.com/en-us/tools-resources/configure/mplab-harmony)」とは、ドライバ、プロトコル、スタック、コーディングユーティリティ、ビルドシステムなどを開発者に提供するソースコードのライブラリです。
いわゆる純正のライブラリパッケージであり、これを使用するとCPUに内蔵されているペリフェラル（周辺機器）を簡単に利用することができるというものです。
今回の「TOPPERS/ASP PIC32MX版」のカーネル内でも、割り込み、タイマーやシリアル通信ドライバなどは、この「MPLAB Harmony」のドライバを使用しています。
ところが、この「MPLAB Harmony」のソースコードのライセンスの条項が不明瞭なために再配布できません。
そのため「TOPPERS/ASP PIC32MX版」のソースコードが不完全なものとなり、そのままではビルドが通らず、通すためには手動で不足分のソースコードをコピーしていただくという手間を強いることになってしまいました。
<font color="red">申し訳ありません…。</font>
では、その「MPLAB Harmony」のソースコードを何処から入手すれば良いのか？
そのためには、<font color="red">インストールした「MPLAB X IDE」上で雛形となるプロジェクトを作って、そこで生成された「MPLAB Harmony」のソースコードを「TOPPERS/ASP PIC32MX版」のソースツリーにコピーする</font>という方法を採ります。
ちなみに、この「MPLAB Harmony」は、すでにインストール済の「MPLAB X IDE」には付随しておらず、別途ダウンロードとインストールが必要になります。
今回はやたらとダウンロード／インストールするものが多いですね。
こらえてつかぁさい…。

MPLAB Harmonyのインストール
「MPLAB Harmony」は、以下のページでダウンロードします。

https://www.microchip.com/en-us/tools-resources/configure/mplab-harmony/version-2

このページの下の方に行ってもらって…。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/810e2502-d7c6-fbb9-ad0b-7e4a30481c13.png">

「MPLAB Harmony Integrated Software Framework v2.06 Windows」という表記の右側の「<font color="red">Download</font>」という表示をクリックします。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/98c44f28-0765-f2a0-dc8a-8ae873190551.png">

ダウンロードが完了すると「<font color="red">harmony_v2_06_windows_installer.exe</font>」というファイルが生成されますので、これをダブルクリック！
以下のようにインストーラが起動します。
ここでは「<font color="red">Next></font>」ボタンをクリックです。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/b2a00f31-2f12-2641-c56f-6819797bd04c.png">

同意せざるを得んでしょう…。
ラジオボタンを「<font color="red">I accept the agreement</font>」に選択してから「<font color="red">Next></font>」ボタンをクリックしましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/f10747c0-d8f5-6b95-9ad0-8e99dbfcce14.png">

しばらくは「<font color="red">Next></font>」ボタンを連打です。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/842e41c1-ae55-dc18-755f-45f0c881db6f.png">

<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/ca99d81f-f2e6-0e51-dd2a-fc70b13fdd8a.png">

<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/78fe7d8d-63e7-82fa-ffdd-15d0d6f8a935.png">

ようやくインストール作業が開始されたようです。
これも、そこそこ時間がかかります。
終わるまでTVでも観ていてください。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/de98c624-e543-19de-2ad5-d5f8a8e60828.png">

終了すると以下のような表示となります。
「<font color="red">Finish</font>」ボタンをクリックしてインストーラを終了させましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/c1e1fcfa-de02-65e6-51f5-a7ca85980581.png">

これで「MPLAB Harmony」のインストールは終了です。
しかし、これを使うにはまだまだ作業が必要です！

# MPLAB HarmonyのIDEへの登録
すでにインストール済みの「MPLAB X IDE」は、先程インストールしたばかりの「MPLAB Harmony」の存在を知りません。
（大体、この時点で「MPLAB X IDE」は一回も起動させていませんしねぇ。）
ですので<font color="red">「MPLAB X IDE」に「MPLAB Harmony」の存在を知らせて、それを使えるようにする作業</font>が必要です。
そこで、まずは「MPLAB X IDE」を起動します。
普通にインストールした場合、PCのデスクトップに「MPLAB X IDE」のショートカットがあるはずですので、それをダブルクリックします。
すると、以下のようなスプラッシュスクリーンが表示されます。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/a4a71978-8e0a-ff98-8f5f-e32ec7726491.png">

しばらくすると、まっさらな状態のIDEが立ち上がります。
キレイでシッカリ作られていそうなIDEですね！
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/c273dc76-0009-54b3-5698-0ee15e69ce7c.png">

次に「MPLAB X IDE」上部の「Tools」メニューから「<font color="red">Plugins</font>」をクリックします。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/0d8d0fcd-28aa-e7fc-01a3-45b0470e6db8.png">

以下のようなダイアログが現れます。
このダイアログの「<font color="red">Download</font>」タグをクリックしましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/b3dc18e2-0e14-5ac5-2b13-6c6d78dc9e14.png">

以下のように表示が切り替わりましたか？
次は、ダイアログの左上の「<font color="red">Add Plugins...</font>」ボタンをクリックです。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/d6c99789-e365-ea7a-b152-210e4ad0ded5.png">

新たに開いたダイアログで「MPLAB Harmony」のプラグイン・ファイル(.nbm)を選択します。
つまり、このプラグインをインストールすることで「MPLAB X IDE」が「MPLAB Harmony」を認識し、協調して働くことができるようになるという寸法です。
では、そのプラグイン・ファイルが何処にあるかっていうと、以下のパスです。

**C:\microchip\harmony\v2_06\utilities\mhc**

「MPLAB Harmony」は、ここにインストールされていたのですね。
そこで、以下のダイアログで上記のパスまで移動し「<font color="red">com-microchip-mplab-modules-mhc.nbm</font>」という長ったらしい名前のファイルを選択し、右下の「<font color="red">開く</font>」ボタンをクリック！
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/2e3fff67-b446-e579-1bc6-ebcbf86cdbe5.png">

以下のような表示になったでしょうか？
それでは満を持してダイアログ左下の「<font color="red">Install</font>」ボタンをクリックです！
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/14ac8b69-f01d-6b34-cd4d-b9b363419c02.png">

すると、以下のように「Plugin Installer」なるものが立ち上がります。
「<font color="red">Next></font>」ボタンをクリックしましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/928bbdeb-f697-cec8-2250-643b99a09061.png">

ああ、いつものアレだ…。
同意のチェックボタン、「<font color="red">Install</font>」ボタンの順にクリックです。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/94535c11-3b2c-d474-28f7-52a98d7ba451.png">

プラグインのインストールが終わると、以下の表示となります。
「<font color="red">Finish</font>」ボタンをクリックしてください。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/0c1538fd-f10c-dd2f-f291-5ee3abfe4e0e.png">

その後「MPLAB X IDE」は自動的に終了しますが、ビックリしないでください。
しばらく待っていると再起動します。
これで無事「MPLAB Harmony」のIDEへの登録は完了です！

# 雛形プロジェクトの作成
まずは「MPLAB X IDE」画面上部の「File」、「<font color="red">New Project...</font>」メニューを順にクリックしていきます。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/c5402d1e-60da-3b4f-fb9c-b54a38507d5f.png">

以下のような「New Project」ダイアログが表示されます。
ここから「Categories」リストから「<font color="red">Microchip Embedded</font>」を、「Projects」のリストから「<font color="red">32-bit MPLAB Harmony Project</font>」をそれぞれ選択して、ダイアログ下方の「<font color="red">Next ></font>」ボタンをクリックしてください。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/b9e99def-37d4-fc02-6a19-6709c73a04b1.png">

すると、以下のような表示に切り替わります。
ここでは「Harmony Path:」のテキストボックスの右側の<font color="red">ディレクトリボタン</font>をクリックしましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/69a42d23-aa47-a19d-e770-d44f05f93bc5.png">

ディレクトリの選択ダイアログが表示されたはずです。
ここでは、先程インストールした「MPLAB Harmony」の場所を選択しましょう。
特に変わった操作をしていなければ、その場所は以下のパスになります。
このパスを指定したあとは「<font color="red">開く</font>」ボタンをクリックです。

**C:\microchip\harmony\v2_06**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/3341b1d8-e1b3-8930-00ba-f16ae94cdf64.png">

元の「New Project」ダイアログに戻ります。
ここで思い出してください。
<font color="red">現在は、TOPPERS/ASPのプロジェクトを作成するのではなく、そのために必要な「MPLAB Harmony」のソースコードを出力させるための雛形プロジェクトを作成する作業をしています。</font>
したがって、今回作成するプロジェクト名、すなわち「Project Name:」のテキストボックスには「<font color="red">Hinagata</font>」とでも入力しておきましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/a740fa97-3b4a-dced-a1e4-773584ae964f.png">

続いて「Target Board」のコンボボックスでは、今回使用する評価ボードの「<font color="red">PIC32MX1/2/5 Starter Kit</font>」を選択します。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/53f034e6-d51f-4a66-09c0-e95c9101fbe6.png">

以下のように正しく設定できたら、ダイアログ下方の「<font color="red">Finish</font>」ボタンをクリック！
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/3c6a3aa6-ef92-6bdf-58e0-d3662b84bdc8.png">

なにか「MPLAB X IDE」でワチャワチャ始まりました！
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/715a6af5-1e76-4b5b-85f8-257338cd2d65.png">

画面下方の「Output」エリアでは、次々とメッセージが表示されていますね。
「仕事してます」感バリバリ。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/ec6a109c-9f49-57c8-1d71-e1070d70f568.png">

この処理の終盤に、以下のようなダイアログが表示されたら「<font color="red">Save</font>」ボタンをクリックしましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/ec76decd-c710-4d73-e2e0-ef8b68823bf9.png">

さて、処理が終了すると、メインの画面は以下のような表示になっていると思います。
ここで「<font color="red">Harmony Framework Configurarion</font>」の項目をクリックしてください。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/c15bb729-b0aa-04d6-8260-1f3999c5a07c.png">

「Harmony Framework Configurarion」の項目が展開されて、更に色々な項目が出てきましたね。
その中で「<font color="red">Drivers</font>」という項目があるので、これをクリックして展開します。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/bb0b6171-7f8a-d6bd-32a3-8ed7702c6fc9.png">

TOPPERS/ASPは、外部のハードウェアとしてOSタイマーである「<font color="red">Timer</font>」と、デバッグシリアルに使用する「<font color="red">USART</font>」の2つが必要です。
（正確には、「割り込み」もそうですが、ここでは特に意識する必要はありません。）
では、まずOSタイマーに使用する「Timer」の設定からいきましょう。
展開された「Drivers」という項目の中に「<font color="red">Timer</font>」という項目がありますので、これをクリックして展開します。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/362dc6fb-f71a-c50e-21d6-53c77b157098.png">

すると、なにやら細々した項目が展開されましたね？
これを<font color="red">以下の通り</font>に設定してください。
間違えると、後々面倒になりますのでここは慎重に！
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/e5e15107-8e9c-f919-1ca9-3f7aa710d94f.png">

次にデバッグシリアルに使用する「USART」の設定にいきましょう。
展開された「Drivers」という項目の中に「<font color="red">USART</font>」という項目がありますので、これをクリックして展開します。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/8119238b-8c74-e421-2de7-2f3274005d86.png">

またまた細々した項目が展開されました。
これを<font color="red">以下の通り</font>に設定してください。
こちらも間違えないよう慎重にお願いします！
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/c1677d01-461a-a7af-848f-c61a3e39f415.png">

まだまだ、作業は続きます。
次は、PIC32MXマイコンのピンの設定です。
メインの画面のタブを現在の「Options」から「<font color="red">Pin Disgram</font>」に切り替えてください。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/ec93710e-eee6-d614-73c3-0bd8573dbaac.png">

すると以下のようにマイコンの絵が出てきましたね。
この中で<font color="red">74番ピン「RC14」と73番ピン「RC13」</font>に注目してください。
これらのピンは、現在のデフォルト状態では何も機能が割り振られていない（GPIO入力？）ので、これらをUSART、いわゆるシリアル通信のためのRX（受信）とTX（送信）として使えるように設定します。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/12f38eb4-4e61-cc0b-d420-eaef1de6bca8.png">

まずは、<font color="red">74番ピン「RC14」をUSARTのRX（受信）</font>に設定します。
ピンの部分をクリックすると、ドロップダウンリストが表示されます。
ここでは、このピンに割り当て可能な機能が列挙されます。
今回はUSARTのRX（受信）、すなわち「<font color="red">U1RX</font>」を選択します。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/78ca4c5b-a00c-7b7a-3f5c-a95ce4c1a4ec.png">

次は、<font color="red">73番ピン「RC13」をUSARTのTX（送信）</font>に設定します。
同じ要領でUSARTのTX（送信）、すなわち「<font color="red">U1TX</font>」を選択します。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/03884fb5-607c-1839-886d-3c7fe2ff66af.png">

以下のように、<font color="red">74番ピンに「U1RX」、73番ピンに「U1TX」</font>と、それぞれ表示が変わったでしょうか？
ここはミスるとシリアル通信ができなくなるなど、後々非常に厄介なので必ずご確認を！
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/f1c43115-c1bc-e749-a2b8-eee30e37ff06.png">

さて、以上で全ての設定が終了です。
メインの画面の左上の<font color="red">フロッピーディスクのマーク</font>をクリックして設定を保存しましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/8cf22c25-2d3c-4c8b-bc1e-662ba7e0e94c.png">

以下のようなダイアログが表示されたら「<font color="red">Save</font>」ボタンをクリックして、この雛形プロジェクトを保存しましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/4db33f12-3ad7-01cf-4d89-6fac6a51334d.png">

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

ではいよいよ、この雛形プロジェクトからソースコードを吐き出させてみましょう。
先程のフロッピーディスクのマークの右側、「<font color="red">歯車→Code</font>」というアイコンのボタンをクリックします。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/a8c9540f-7cd4-8f1e-6155-3803065affbf.png">

以下のような「Generate Project」ダイアログが表示されるので「<font color="red">Generate</font>」ボタンをクリック！
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/e4677d92-bbbc-6088-d9ca-7ecb3af5feec.png">

以下のように雛形プロジェクトからソースコードが生成されていきます。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/8f49c555-330a-6044-db74-5cb1c4f884db.png">

ソースコードの生成が終わると「Generate Project」ダイアログは自動的に消えます。
これで雛形プロジェクトから必要なソースコードを抽出できました。
雛形プロジェクトのソースコードは、以下のディレクトリに出力されています。

**C:\microchip\harmony\v2_06\apps\Hinagata**

どんなものが出力されているのか？
ちょっと見てみるのも良いでしょう。

# Harmony Frameworkのコピー
既にインストール済みの「MPLAB Harmony」のディレクトリと、「TOPPERS/ASP PIC32MX版」のソースツリーのディレクトリを同時に2つエクスプローラーで開いておきましょう。
記事通りに作業すると、「MPLAB Harmony」は以下のディレクトリに保存されているはずです。

**C:\microchip\harmony**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/d46e75a9-7813-d364-483a-669d4af33f01.png">

同じく、TOPPERS/ASPのソースツリーは以下のディレクトリに保存されているはずです。
（<font color="red">「asp_pic32mx_gcc」や「asp_pic32mx_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/422c8614-7394-96f5-2ba2-223a0fbe84d1.png">

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

**C:\microchip\harmony\v2_06**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/9a5197a5-ab14-bbec-1ea9-83b30c19f13d.png">

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

**C:\cygwin64\home\＜ユーザー名＞\asp_1.9.2\arch\pic32mx_gcc**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/dcd8df45-8c40-354e-0e9e-aab32f57d596.png">

<font color="red">「MPLAB Harmony」の方</font>のディレクトリに注目！
以下のディレクトリを確認して下さい。

**●framework**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/6431d9cf-a045-95c4-9db3-7574bb04a900.png">

この「<font color="red">framework</font>」ディレクトリの中には「MPLAB Harmony」で使用できる様々な周辺機器のデバイスドライバのソースコードやヘッダーファイルが大量に入っています。
「TOPPERS/ASP PIC32MX版」で使用するタイマーやシリアル通信のデバイスドライバもこの中に含まれています。
この「<font color="red">framework</font>」ディレクトリを開いてあるもう一方のエクスプローラー、<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/330b5019-b56c-9f43-8b2e-cfa157bf7b44.png">

これで、HarmonyのFrameworkのソースコードの回収は完了です。

# 雛形プロジェクトで生成したソースコードのコピー
現在、2つ開いているエクスプローラーでそれぞれ以下の場所を表示するようにします。
<font color="red">「MPLAB Harmony」の方</font>は、以下のディレクトリへ移動させます。
ここは、既に作成した雛形プロジェクトのソースが格納されている場所です。

**C:\microchip\harmony\v2_06\apps\Hinagata\firmware\src**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/3802fa6c-3eac-8ffb-c6e5-1b1f712e7e02.png">

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

**C:\cygwin64\home\＜ユーザー名＞\asp_1.9.2\target\1_2_5_starterkit_gcc**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/665b18a2-7a53-e931-cd62-04eec379190d.png">

<font color="red">「MPLAB Harmony」の方（ていうか、雛形プロジェクトの方）</font>のディレクトリに注目！
以下の3つのディレクトリとソース／ヘッダーファイルを確認して下さい。

**●system_config**
**●app.c**
**●app.h**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/40ff4d1e-90ec-269d-94c3-cd0fec4af99c.png">

雛型プロジェクトは、今回使用する「PIC32MX1/2/5 Starter Kit」評価ボードで動作する基本的な設定や定義を行うソースコードを生成させるために作成しました。
これらのディレクトリやファイルは、まさにその生成されたソースコードというわけです。
この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/022a4c0c-39d1-2e04-b38c-5d2842a0ac32.png">

これで、雛形プロジェクトによって生成されたソースコードの回収は完了です。

# コマンドラインでのビルド
さて、これで全ての準備は整いました。
早速ビルドしてみましょう。
<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/638224cb-f028-54d8-45cd-cc7bf31bf1f4.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/d13edf85-887b-3703-d648-4ff72ff83f80.png">

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

**$ make all**

以下のように無事にビルドが通ったでしょうか？
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/3180b7df-7788-8305-a96f-42e9be2e228f.png">

# プロジェクトの作成（Eclipse編）
これまでの作業で、開発環境をインストールし、PIC32MX版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上で行わず、次にプロジェクトを作成する「MPLAB X IDE」上で行う方針なので、この作業は必要ありません。
Eclipseの画面右側に以下のようなアイコンが表示されて、これらをダブルクリックすることによりビルドができるまでを確認してください。
<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/71dfa122-6d2a-acf8-8b7f-389f76b60acc.png">

# プロジェクトの作成（MPLAB X IDE編）
さて、もう一方のIDEである「MPLAB X IDE」用のプロジェクトも作りましょう。
とはいえ、既にこのプロジェクトは「TOPPERS/ASP PIC32MX版」のソースツリーのディレクトリの中に既に用意してあります。
「<font color="red">OBJ.X</font>」というディレクトリがそれです。
（<font color="red">「asp_pic32mx_gcc」や「asp_pic32mx_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/7ac7d992-0b19-c704-e0e7-8401096439b3.png">

それでは「MPLAB X IDE」を起動させましょう！
起動させた場合、画面左上の「Projects」タブには、以前作成した雛形プロジェクトを示す「<font color="red">Hinagata</font>」のみが登録されていることを確認してください。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/b6e36c3b-4718-2b7e-fd10-079fb82288cc.png">

件の「OBJ.X」プロジェクトをここに登録したいと思います。
画面左上の「File」メニューから「<font color="red">Open Project...</font>」項目をクリックしてください。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/437768a9-6935-5112-dc69-74a2ec3a68c7.png">

以下のようなダイアログが表示されますので「<font color="red">OBJ.X</font>」のディレクトリを選択してやってから「<font color="red">Open Project</font>」ボタンをクリックします。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/3e62a69f-e3d1-4a70-0e3c-42d37a1cd650.png">

すると、画面左上の「Projects」タブには、新たに「<font color="red">OBJ</font>」というディレクトリが追加されていることが確認できるはずです。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/09d42f9c-20ab-a9f2-3bda-6da416e0b175.png">

ここで注意していただきたいことがあります。
<font color="red">このプロジェクトのビルド対象は「OBJ.X」ではなく、同じディレクトリにある「OBJ」ディレクトリ以下のソースコードです。</font>
なので、以下のように「<font color="red">Source Files</font>」をクリックすると「OBJ」ディレクトリ以下のソースコードのリストが展開されると思うでしょう？
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/62ce38f8-a54b-abd3-d76f-423c7e48c439.png">

しかしながら、今回用いた方法ではそのようにはなりません。
<font color="red">「Source Files」をクリックしても何も起こりません。</font>
その上の「Header Files」も同様です。
その理由は、今回の方法は、雛形プロジェクトの時とは異なり「MPLAB X IDE」にとっては通常のプロジェクト作成手順ではないためです。
今回の場合「MPLAB X IDE」を使うのは、単にデバッガを操作するためであり、ソースコードの編集などはEclipseの方で行う方針なので、ソースコードの閲覧はEclipseの方で行ってください。
でも、デバッガのみを使う場合でも、ブレークポイントを仕掛ける際にソースコードを表示しなければなりませんよね。
では、どうするか？
その場合は、以下の方法が簡単です。
たとえば、サンプルプログラムのメインのソースコードである「<font color="red">sample.c</font>」を「MPLAB IDE」で表示したい場合、以下のように「OBJ」ディレクトリの中にある「<font color="red">sample.c</font>」をドラッグして「Start Page」タブにドロップしてみてください。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/3953b3c2-c785-575a-eebc-f87dec107540.png">

すると、新たに「sample.c」タブが作成され、「sample.c」の内容が表示されます。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/3d81c24e-ffed-910b-85af-4a88fc1631c1.png">

この方法で「OBJ」ディレクトリ内のソースコードを閲覧することも出来ますし、ソースコードの中の任意の行にブレークポイントを仕掛けることもできます。
同じ操作を繰り返せば、複数のソースコードの表示も可能です。
ちょっと不便かもしれませんけど…。
<font color="red">申し訳ないです。</font>
ともあれ、これで「MPLAB X IDE」の方のプロジェクトも準備ができました。

# シリアル通信用の配線の引き出し
さて、いよいよパソコンと「PIC32MX1/2/5 Starter Kit」評価ボードを接続します。
接続した結果は以下のような感じになりますが…。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/1cd1d19f-8be8-d146-bcae-b354177c13c0.jpeg">

まず、USBの方はデバッガと接続するためのものですが、問題はそれ以外の電線。
これらは「TOPPERS/ASP PIC32MX版」のサンプルプログラムで使用するデバッグメッセージ用のシリアル通信線です。
しかし「PIC32MX1/2/5 Starter Kit」評価ボードには、既に最初からD-SUBコネクタが実装されていますよね。
実は、これはシリアル通信のためのものではなく、[CAN](https://ja.wikipedia.org/wiki/Controller_Area_Network)のためのD-SUBコネクタなのです。
では、シリアル通信のためのコネクタが何処にあるかというと、実は、この評価ボードでは用意されていないのです。
そのため、<font color="red">シリアル通信を使用するには必要な信号線を評価ボードから引き出してあげる必要がある</font>のです。
さて、どこから引き出しましょうか？
以下の「PIC32MX1/2/5 Starter Kit」評価ボードの回路図を御覧ください。
74ピンの「<font color="red">SOSC0/T1CK/RC14</font>」と73ピンの「<font color="red">SOSC1/RC13</font>」に注目してください。
これらのピンは「<font color="red">Y2</font>」というクリスタルに接続されていますね？
しかしながら「DNP」とあるように、どうやらこのクリスタルは実装されていないようです。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/d7582ebf-e9cb-638d-ae52-99d3ef989f8f.png">

そして、74ピンの「SOSC0/T1CK/RC14」と73ピンの「SOSC1/RC13」は、レジスタの設定により、それぞれシリアル通信の受信（RXD）と送信（TXD）端子として使用することができるようです。
では早速、そのレジスタの設定をしなくちゃ！
…って、実はもう設定できているんです。
思い出してください。
「[雛形プロジェクトの作成](#雛形プロジェクトの作成)」の章の下の方で既にやっています。
こんな感じで雛形プロジェクトで設定しましたよね？
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/74eea57f-c4ed-f447-3702-6ca07c49607b.png">

この設定により、<font color="red">74ピンの「SOSC0/T1CK/RC14」と73ピンの「SOSC1/RC13」は、それぞれシリアル通信の受信（RXD）と送信（TXD）端子として使用する</font>ことになります。
そして、この雛形プロジェクトから吐き出されたソースコードを前回「TOPPERS/ASP PIC32MX版の」ソースツリーにコピーしたため、これから動かすサンプルプログラムは、この設定通りに動くことになるのです。
では、シリアル通信に必要な信号線を評価ボードから引き出しましょう。
必要な信号線は、受信（RXD）、送信（TXD）、そしてGNDの計3本ですね。
受信（RXD）、送信（TXD）は、基板下方の未実装の<font color="red">「Y2」クリスタルのホール</font>（穴のことね）をそのまま使いましょうか。
GNDは、基板上方に<font color="red">パッド</font>があります。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/0722cba6-d575-a41c-be77-9dc8e0fdaebb.png">

未実装の「Y2」クリスタルのホールから受信（<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/ea7defe9-5da1-f6bc-c124-0db3c31faaeb.jpeg">

続いて、<font color="Gray">GND</font>も引き出します。
こんな感じ。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/1dd9baf3-2e6a-cb1b-0ffa-3f2eef1dee59.jpeg">

これで、必要な信号線の引き出しは完了です。

# プログラムの転送とデバッグ
引き出した線は、パソコンのシリアルポートに接続します。
しかしながら、今どきシリアルポートが備えられているパソコンは稀でしょう。
そこで、以下のような市販のUSB／シリアル通信変換ケーブルを用意します。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/0701bcdf-e3ac-84bd-c217-70c01739c0e2.jpeg">

USB／シリアル通信変換ケーブルのコネクタの形状によりますが、引き出した信号線は圧着端子などで加工する必要があるかもしれません。
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/cfb28dc4-c72f-8a2a-bc99-599b5ec431ff.jpeg">

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

ここで、ターゲットとパソコンもUSBケーブルで繋げちゃいましょ。
ご覧の通り、通電します。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/733c318d-d148-d415-bb1a-bbab413ddfc1.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/ce79358c-3bc8-110a-3dc0-a8d79902853e.png">

さて、「MPLAB X IDE」に戻りましょう。
「MPLAB X IDE」でプロジェクトを作成した状況から始めます。
画面左上の「Projects」リストにおいて「<font color="Red">OBJ</font>」プロジェクトが選択されていることを確認してください。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/a9ff2168-e7da-a3d1-74f4-161b6e569fcd.png">

次に、プログラムの実行を行います。
画面上部のデバッグボタンをクリックします。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/72cc4daf-c625-d41e-5f0e-9a482538fe87.png">

デバッガの起動には、意外と時間がかかります。
もしこの時、以下のようなエラーが表示されてしまったら、それはサンプルプログラムがビルドされていない証拠です。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/ea8a93c5-b7ad-5c1a-013f-3148386aebd5.png">

「Eclipse」の方で「Makeターゲット」タブから「<font color="Red">depend</font>」、「<font color="Red">all</font>」の順にダブルクリックして、ビルドを終わらせましょう。
<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/ce054529-ac96-7ef3-d50b-a687f96be7ba.png">

無事にデバッガが起動すると、立ち上げておいたターミナルに以下のような表示が出ていると思います。
TOPPERS/ASPカーネルとそのサンプルプログラムの転送と実行に成功です。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/c9f0f80c-ea47-3d28-effc-80457fc1705a.png">

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

ブレークポイントを仕掛けましょう。
エクスプローラーで「TOPPERS/ASP PIC32MX版」のソースツリーの「OBJ」ディレクトリの中にある「<font color="Red">sample1.c</font>」をドラッグし「MPLAB X IDE」にドロップして、ソースコードを表示します。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/d891ebe2-75e1-f751-d773-8ef6f8a8cb5d.png">

このソースコードの丁度中盤くらい、メインタスクの始めに仕掛けましょうか。
ブレークポイントは、ソースコードビューの左端をクリックすると<font color="Red">■</font>が表示され、セットされていることを表します。
仮に、これを再びクリックするとブレークポイントが解除され<font color="Red">■</font>も消えます。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/4351b0b3-46a9-123d-0ddd-b9bf78e7abba.png">

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

以下のようにプログラムが停止すれば成功です！
ここからは、「F8」キーでステップオーバー、「F7」キーでステップインなど、おなじみの操作が使用できます。
因みに、ステップオーバーやステップインなどを行っている時に命令が飛んでしまったり前後したりする場合は、最適化のせいです。
デバッグ時は、このページ（[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/55fb599c-ef09-0090-4a7c-d7d5ec3299be.png">

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

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

## 割り込み優先度
このカーネルでは、<font color="Red">-1（優先度最低）</font>から<font color="Red">-7（優先度最高）</font>の7段階の優先度設定が可能です。
PIC32MXは、実は64段階までの割り込み優先度をサポートしています。
でも…<font color="Red">そんなに要らんでしょ？</font>
ということで、私の実装では7段階までに抑えています。
7段階の根拠は、元祖TOPPERS/ASPの「m68k」版と合わせただけで深い意味はありません。
実用レベルでは十分かと…。

## 割り込み番号の指定方法
このマイコンは、<font color="Red">割り込み番号と、割り込みベクタ番号が一致しない</font>タイプです。
ちょっと小さいので、クリックしてご覧いただきたいのですが、以下は、データシートからの一覧表です。
割り込み番号を意味する「<font color="Red">IRQ#</font>」と、割り込みベクタ番号を意味する「<font color="Red">Vector#</font>」の不一致がお分かりいただけるかと。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/9caf8e36-4f00-5606-a656-d4f893321787.png">

例えば、デバッグシリアルの割り込み設定例を見てみましょう。
「..\target\1_2_5_starterlit_gcc\target_serial.h」において、以下のように定義しています。
```
...
/*
 *  SIOの割込み番号，優先度，属性の定義
 */
#define INTNO_SIO_RX    INT_SOURCE_USART_1_RECEIVE
#define INTNO_SIO_TX    INT_SOURCE_USART_1_TRANSMIT
#define INHNO_SIO       _UART_1_VECTOR
#define INTPRI_SIO      -6                          /* 割込み優先度 */
#define INTATR_SIO      TA_NULL                     /* 割込み属性 */
...
```

この定義において、シリアル通信の受信割り込みの割り込み番号が「<font color="Red">INT_SOURCE_USART_1_RECEIVE</font>」、送信割り込みの割り込み番号が「<font color="Red">INT_SOURCE_USART_1_TRANSMIT</font>」、更に両方の割り込みのベクタ番号は「<font color="Red">\_UART_1_VECTOR</font>」と設定されていることが分かります。
この設定は「make depend」実行時に「..\target\1_2_5_starterlit_gcc\target_serial.cfg」によってコンフィグレータに渡されます。
では「INT_SOURCE_USART_1_RECEIVE」や「INT_SOURCE_USART_1_TRANSMIT」の実際の<font color="Red">割り込み番号</font>の値がどこに定義されているのか？
分かりにくい場所にあるのですが、今回の評価ボード「PIC32MX1/2/5 Starter Kit」に搭載されているマイコンの型番が「<font color="Red">PIC32MX570F512L</font>」ですので、「..\arch\pic32mx_gcc\framework\peripheral\int\processor\int_<font color="Red">p32mx570f512l</font>.h」の中の以下の記述にあります。
```
...
typedef enum {

    INT_SOURCE_TIMER_CORE = 0,
    INT_SOURCE_SOFTWARE_0 = 1,
    INT_SOURCE_SOFTWARE_1 = 2,
    INT_SOURCE_EXTERNAL_0 = 3,
    INT_SOURCE_TIMER_1 = 4,
    INT_SOURCE_INPUT_CAPTURE_1_ERROR = 5,
    INT_SOURCE_INPUT_CAPTURE_1 = 6,
    INT_SOURCE_OUTPUT_COMPARE_1 = 7,
    INT_SOURCE_EXTERNAL_1 = 8,
    INT_SOURCE_TIMER_2 = 9,
    INT_SOURCE_INPUT_CAPTURE_2_ERROR = 10,
    INT_SOURCE_INPUT_CAPTURE_2 = 11,
    INT_SOURCE_OUTPUT_COMPARE_2 = 12,
    INT_SOURCE_EXTERNAL_2 = 13,
    INT_SOURCE_TIMER_3 = 14,
    INT_SOURCE_INPUT_CAPTURE_3_ERROR = 15,
    INT_SOURCE_INPUT_CAPTURE_3 = 16,
    INT_SOURCE_OUTPUT_COMPARE_3 = 17,
    INT_SOURCE_EXTERNAL_3 = 18,
    INT_SOURCE_TIMER_4 = 19,
    INT_SOURCE_INPUT_CAPTURE_4_ERROR = 20,
    INT_SOURCE_INPUT_CAPTURE_4 = 21,
    INT_SOURCE_OUTPUT_COMPARE_4 = 22,
    INT_SOURCE_EXTERNAL_4 = 23,
    INT_SOURCE_TIMER_5 = 24,
    INT_SOURCE_INPUT_CAPTURE_5_ERROR = 25,
    INT_SOURCE_INPUT_CAPTURE_5 = 26,
    INT_SOURCE_OUTPUT_COMPARE_5 = 27,
    INT_SOURCE_ADC_1 = 28,
    INT_SOURCE_SPI_1_ERROR = 35,
    INT_SOURCE_SPI_1_RECEIVE = 36,
    INT_SOURCE_SPI_1_TRANSMIT = 37,
    INT_SOURCE_USART_1_ERROR = 38,
    INT_SOURCE_USART_1_RECEIVE = 39,
    INT_SOURCE_USART_1_TRANSMIT = 40,
    INT_SOURCE_I2C_1_BUS = 41,
    INT_SOURCE_I2C_1_ERROR = 41,
    INT_SOURCE_I2C_1_SLAVE = 42,
    INT_SOURCE_I2C_1_MASTER = 43,
    INT_SOURCE_CHANGE_NOTICE_A = 44,
    INT_SOURCE_CHANGE_NOTICE_B = 45,
    INT_SOURCE_CHANGE_NOTICE_C = 46,
    INT_SOURCE_CHANGE_NOTICE_D = 47,
    INT_SOURCE_CHANGE_NOTICE_E = 48,
    INT_SOURCE_CHANGE_NOTICE_F = 49,
    INT_SOURCE_CHANGE_NOTICE_G = 50,
    INT_SOURCE_PARALLEL_PORT = 51,
    INT_SOURCE_PARALLEL_PORT_ERROR = 52,
    INT_SOURCE_COMPARATOR_1 = 32,
    INT_SOURCE_COMPARATOR_2 = 33,
    INT_SOURCE_USB_1 = 34,
    INT_SOURCE_DMA_0 = 72,
    INT_SOURCE_DMA_1 = 73,
    INT_SOURCE_DMA_2 = 74,
    INT_SOURCE_DMA_3 = 75,
    INT_SOURCE_SPI_2_ERROR = 53,
    INT_SOURCE_SPI_2_RECEIVE = 54,
    INT_SOURCE_SPI_2_TRANSMIT = 55,
    INT_SOURCE_USART_2_ERROR = 56,
    INT_SOURCE_USART_2_RECEIVE = 57,
    INT_SOURCE_USART_2_TRANSMIT = 58,
    INT_SOURCE_I2C_2_BUS = 59,
    INT_SOURCE_I2C_2_ERROR = 59,
    INT_SOURCE_I2C_2_SLAVE = 60,
    INT_SOURCE_I2C_2_MASTER = 61,
    INT_SOURCE_CAN_1 = 77,
    INT_SOURCE_SPI_3_ERROR = 78,
    INT_SOURCE_SPI_3_RECEIVE = 79,
    INT_SOURCE_SPI_3_TRANSMIT = 80,
    INT_SOURCE_USART_3_ERROR = 62,
    INT_SOURCE_USART_3_RECEIVE = 63,
    INT_SOURCE_USART_3_TRANSMIT = 64,
    INT_SOURCE_SPI_4_ERROR = 81,
    INT_SOURCE_SPI_4_RECEIVE = 82,
    INT_SOURCE_SPI_4_TRANSMIT = 83,
    INT_SOURCE_USART_4_ERROR = 65,
    INT_SOURCE_USART_4_RECEIVE = 66,
    INT_SOURCE_USART_4_TRANSMIT = 67,
    INT_SOURCE_USART_5_ERROR = 68,
    INT_SOURCE_USART_5_RECEIVE = 69,
    INT_SOURCE_USART_5_TRANSMIT = 70,
    INT_SOURCE_CLOCK_MONITOR = 29,
    INT_SOURCE_RTCC = 30,
    INT_SOURCE_FLASH_CONTROL = 31,
    INT_SOURCE_COMPARATOR_3 = 76,
    INT_SOURCE_CTMU = 71

} INT_SOURCE;
...
```

これによると「<font color="Red">INT_SOURCE_USART_1_RECEIVE</font>」は「<font color="Red">39</font>」、「<font color="Red">INT_SOURCE_USART_1_TRANSMIT</font>」は「<font color="Red">40</font>」となっています。
上記のデータシートからの表と照らし合わせてください。
一致しますよね？
次に、<font color="Red">割り込みのベクタ番号</font>についてですが、割り込み番号と同様、「..\arch\pic32mx_gcc\framework\peripheral\int\processor\int_p32mx570f512l.h」の中の以下の記述にあります。
```
...
typedef enum {

    INT_VECTOR_CT = _CORE_TIMER_VECTOR,
    INT_VECTOR_CS0 = _CORE_SOFTWARE_0_VECTOR,
    INT_VECTOR_CS1 = _CORE_SOFTWARE_1_VECTOR,
    INT_VECTOR_INT0 = _EXTERNAL_0_VECTOR,
    INT_VECTOR_T1 = _TIMER_1_VECTOR,
    INT_VECTOR_IC1 = _INPUT_CAPTURE_1_VECTOR,
    INT_VECTOR_IC1_ERROR = _INPUT_CAPTURE_1_VECTOR,
    INT_VECTOR_OC1 = _OUTPUT_COMPARE_1_VECTOR,
    INT_VECTOR_INT1 = _EXTERNAL_1_VECTOR,
    INT_VECTOR_T2 = _TIMER_2_VECTOR,
    INT_VECTOR_IC2 = _INPUT_CAPTURE_2_VECTOR,
    INT_VECTOR_IC2_ERROR = _INPUT_CAPTURE_2_VECTOR,
    INT_VECTOR_OC2 = _OUTPUT_COMPARE_2_VECTOR,
    INT_VECTOR_INT2 = _EXTERNAL_2_VECTOR,
    INT_VECTOR_T3 = _TIMER_3_VECTOR,
    INT_VECTOR_IC3 = _INPUT_CAPTURE_3_VECTOR,
    INT_VECTOR_IC3_ERROR = _INPUT_CAPTURE_3_VECTOR,
    INT_VECTOR_OC3 = _OUTPUT_COMPARE_3_VECTOR,
    INT_VECTOR_INT3 = _EXTERNAL_3_VECTOR,
    INT_VECTOR_T4 = _TIMER_4_VECTOR,
    INT_VECTOR_IC4 = _INPUT_CAPTURE_4_VECTOR,
    INT_VECTOR_IC4_ERROR = _INPUT_CAPTURE_4_VECTOR,
    INT_VECTOR_OC4 = _OUTPUT_COMPARE_4_VECTOR,
    INT_VECTOR_INT4 = _EXTERNAL_4_VECTOR,
    INT_VECTOR_T5 = _TIMER_5_VECTOR,
    INT_VECTOR_IC5 = _INPUT_CAPTURE_5_VECTOR,
    INT_VECTOR_IC5_ERROR = _INPUT_CAPTURE_5_VECTOR,
    INT_VECTOR_OC5 = _OUTPUT_COMPARE_5_VECTOR,
    INT_VECTOR_SPI1_FAULT = _SPI_1_VECTOR,
    INT_VECTOR_SPI1_RX = _SPI_1_VECTOR,
    INT_VECTOR_SPI1_TX = _SPI_1_VECTOR,
    INT_VECTOR_UART1_FAULT = _UART_1_VECTOR,
    INT_VECTOR_UART1_RX = _UART_1_VECTOR,
    INT_VECTOR_UART1_TX = _UART_1_VECTOR,
    INT_VECTOR_I2C1_BUS = _I2C_1_VECTOR,
    INT_VECTOR_I2C1_SLAVE = _I2C_1_VECTOR,
    INT_VECTOR_I2C1_MASTER = _I2C_1_VECTOR,
    INT_VECTOR_SPI2_FAULT = _SPI_2_VECTOR,
    INT_VECTOR_SPI2_RX = _SPI_2_VECTOR,
    INT_VECTOR_SPI2_TX = _SPI_2_VECTOR,
    INT_VECTOR_UART2_FAULT = _UART_2_VECTOR,
    INT_VECTOR_UART2_RX = _UART_2_VECTOR,
    INT_VECTOR_UART2_TX = _UART_2_VECTOR,
    INT_VECTOR_I2C2_BUS = _I2C_2_VECTOR,
    INT_VECTOR_I2C2_SLAVE = _I2C_2_VECTOR,
    INT_VECTOR_I2C2_MASTER = _I2C_2_VECTOR,
    INT_VECTOR_SPI3_FAULT = _SPI_3_VECTOR,
    INT_VECTOR_SPI3_RX = _SPI_3_VECTOR,
    INT_VECTOR_SPI3_TX = _SPI_3_VECTOR,
    INT_VECTOR_UART3_FAULT = _UART_3_VECTOR,
    INT_VECTOR_UART3_RX = _UART_3_VECTOR,
    INT_VECTOR_UART3_TX = _UART_3_VECTOR,
    INT_VECTOR_SPI4_FAULT = _SPI_4_VECTOR,
    INT_VECTOR_SPI4_RX = _SPI_4_VECTOR,
    INT_VECTOR_SPI4_TX = _SPI_4_VECTOR,
    INT_VECTOR_UART4_FAULT = _UART_4_VECTOR,
    INT_VECTOR_UART4_RX = _UART_4_VECTOR,
    INT_VECTOR_UART4_TX = _UART_4_VECTOR,
    INT_VECTOR_UART5_FAULT = _UART_5_VECTOR,
    INT_VECTOR_UART5_RX = _UART_5_VECTOR,
    INT_VECTOR_UART5_TX = _UART_5_VECTOR,
    INT_VECTOR_CHANGE_NOTICE_A = _CHANGE_NOTICE_VECTOR,
    INT_VECTOR_CHANGE_NOTICE_B = _CHANGE_NOTICE_VECTOR,
    INT_VECTOR_CHANGE_NOTICE_C = _CHANGE_NOTICE_VECTOR,
    INT_VECTOR_CHANGE_NOTICE_D = _CHANGE_NOTICE_VECTOR,
    INT_VECTOR_CHANGE_NOTICE_E = _CHANGE_NOTICE_VECTOR,
    INT_VECTOR_CHANGE_NOTICE_F = _CHANGE_NOTICE_VECTOR,
    INT_VECTOR_CHANGE_NOTICE_G = _CHANGE_NOTICE_VECTOR,
    INT_VECTOR_PMP = _PMP_VECTOR,
    INT_VECTOR_PMP_ERROR = _PMP_VECTOR,
    INT_VECTOR_USB1 = _USB_1_VECTOR,
    INT_VECTOR_RTCC = _RTCC_VECTOR,
    INT_VECTOR_FLASH = _FCE_VECTOR,
    INT_VECTOR_SPI1 = _SPI_1_VECTOR,
    INT_VECTOR_UART1 = _UART_1_VECTOR,
    INT_VECTOR_SPI3 = _SPI_3_VECTOR,
    INT_VECTOR_I2C1 = _I2C_1_VECTOR,
    INT_VECTOR_CN = _CHANGE_NOTICE_VECTOR,
    INT_VECTOR_AD1 = _ADC_VECTOR,
    INT_VECTOR_CMP1 = _COMPARATOR_1_VECTOR,
    INT_VECTOR_CMP2 = _COMPARATOR_2_VECTOR,
    INT_VECTOR_CMP3 = _COMPARATOR_3_VECTOR,
    INT_VECTOR_UART3 = _UART_3_VECTOR,
    INT_VECTOR_SPI2 = _SPI_2_VECTOR,
    INT_VECTOR_UART2 = _UART_2_VECTOR,
    INT_VECTOR_SPI4 = _SPI_4_VECTOR,
    INT_VECTOR_I2C2 = _I2C_2_VECTOR,
    INT_VECTOR_FSCM = _FAIL_SAFE_MONITOR_VECTOR,
    INT_VECTOR_CTMU = _CTMU_VECTOR,
    INT_VECTOR_DMA0 = _DMA_0_VECTOR,
    INT_VECTOR_DMA1 = _DMA_1_VECTOR,
    INT_VECTOR_DMA2 = _DMA_2_VECTOR,
    INT_VECTOR_DMA3 = _DMA_3_VECTOR,
    INT_VECTOR_FCE = _FCE_VECTOR,
    INT_VECTOR_CAN1 = _CAN_1_VECTOR,
    INT_VECTOR_UART4 = _UART_4_VECTOR,
    INT_VECTOR_UART5 = _UART_5_VECTOR

} INT_VECTOR;
...
```

これによると「INT_VECTOR_UART1_RX」や「INT_VECTOR_UART1_TX」は共に「_UART_1_VECTOR」という同じ値の割り込みベクタ番号に定義されています。
今回の場合、「..\target\1_2_5_starterlit_gcc\target_serial.h」において、割り込みベクタ番号を「INT_VECTOR_UART1_RX」や「INT_VECTOR_UART1_TX」とは書かずに「_UART_1_VECTOR」と直に記述しましたが、どちらでも結果は同じです。
ちなみに「_UART_1_VECTOR」の実際の割り込みベクタ番号の値は、これまた分かりにくい場所に…。
この記事の記述通り開発環境を作っていただいた場合は、
「C:\Program Files\Microchip\xc32\v4.30\pic32mx\include\proc\PIC32MX\\<font color="Red">p32mx570f512l</font>.h」の中の以下の記述にあります。
ここはもう、ツールチェーンのディレクトリですよね。
```
...
/* Vector Numbers */
#define _CORE_TIMER_VECTOR                       0
#define _CORE_SOFTWARE_0_VECTOR                  1
#define _CORE_SOFTWARE_1_VECTOR                  2
#define _EXTERNAL_0_VECTOR                       3
#define _TIMER_1_VECTOR                          4
#define _INPUT_CAPTURE_1_VECTOR                  5
#define _OUTPUT_COMPARE_1_VECTOR                 6
#define _EXTERNAL_1_VECTOR                       7
#define _TIMER_2_VECTOR                          8
#define _INPUT_CAPTURE_2_VECTOR                  9
#define _OUTPUT_COMPARE_2_VECTOR                 10
#define _EXTERNAL_2_VECTOR                       11
#define _TIMER_3_VECTOR                          12
#define _INPUT_CAPTURE_3_VECTOR                  13
#define _OUTPUT_COMPARE_3_VECTOR                 14
#define _EXTERNAL_3_VECTOR                       15
#define _TIMER_4_VECTOR                          16
#define _INPUT_CAPTURE_4_VECTOR                  17
#define _OUTPUT_COMPARE_4_VECTOR                 18
#define _EXTERNAL_4_VECTOR                       19
#define _TIMER_5_VECTOR                          20
#define _INPUT_CAPTURE_5_VECTOR                  21
#define _OUTPUT_COMPARE_5_VECTOR                 22
#define _ADC_VECTOR                              23
#define _FAIL_SAFE_MONITOR_VECTOR                24
#define _RTCC_VECTOR                             25
#define _FCE_VECTOR                              26
#define _COMPARATOR_1_VECTOR                     27
#define _COMPARATOR_2_VECTOR                     28
#define _USB_1_VECTOR                            29
#define _SPI_1_VECTOR                            30
#define _UART_1_VECTOR                           31
#define _I2C_1_VECTOR                            32
#define _CHANGE_NOTICE_VECTOR                    33
#define _PMP_VECTOR                              34
#define _SPI_2_VECTOR                            35
#define _UART_2_VECTOR                           36
#define _I2C_2_VECTOR                            37
#define _UART_3_VECTOR                           38
#define _UART_4_VECTOR                           39
#define _UART_5_VECTOR                           40
#define _CTMU_VECTOR                             41
#define _DMA_0_VECTOR                            42
#define _DMA_1_VECTOR                            43
#define _DMA_2_VECTOR                            44
#define _DMA_3_VECTOR                            45
#define _COMPARATOR_3_VECTOR                     46
#define _CAN_1_VECTOR                            47
#define _SPI_3_VECTOR                            48
#define _SPI_4_VECTOR                            49
...
```

これによると「<font color="Red">_UART_1_VECTOR</font>」は「<font color="Red">31</font>」となっています。
こちらも、上記のデータシートからの表と一致しますね！
このように、もし新たな割り込みを実装する場合には、割り込みの設定は割り込み番号と割り込みベクタ番号をそれぞれ調べて設定するようにしてください。
面倒だけども…。

## 例外ハンドラ
例外ハンドラは、以下の表のものが使用できます。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/ef8cea43-62c7-41af-6cd2-71335590e120.png">

今回のサンプルプロジェクトでターミナルから「z」や「Z」を入力して起こる例外は、<font color="Red">13番</font>の「<font color="Red">Trap exception</font>」例外です。
この設定は「..\arch\pic32mx_gcc\prc_test.h」の以下の記述で設定されています。
```
#define CPUEXC1					13		/* ゼロ除算例外 */
#define RAISE_CPU_EXCEPTION		syslog(LOG_NOTICE, "zerodiv = %d", 10 / 0)
```

ご覧の通り「Trap exception」は、ゼロ除算を行った結果引き起こされるものです。
小文字の「z」と大文字の「Z」の違いは、CPU例外が小文字の場合はカーネル管轄内で、大文字の場合はカーネル管轄外でそれぞれ実行されるということだけです。
各CPU例外の詳細については、PIC32MXのデータシートを熟読していただく必要がありますが、これらが引き起こされた時点で致命的な状況が多く、デバッグでの用途以外、あまり使い道はないでしょう。

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

# ライセンスについて
このカーネルは「[TOPPERSライセンス](https://www.toppers.jp/license.html)」で配布しております。
無償ですが、使用に関しては自己責任です。
万が一、このカーネルを商用利用する方は、このリンク先の条項に従ってください。
今回取り上げた「PIC32<font color="Red">M</font>X」マイコンは「MIPS」アーキテクチャによる「<font color="Red">M系</font>」型番です。
先ごろ「ARM」アーキテクチャによる「<font color="Red">C系</font>」型番が発表されました。
「PIC32<font color="Red">C</font>M」とか「PIC32<font color="Red">C</font>X」などです。
ですので余程の理由がない限りは、新規の開発では「C系」型番を使うべきなんでしょうね。

でも…

世の中何でもかんでもARM一辺倒になって、ホントにいいんでしょうかね？