※この記事は、筆者自身のブログに連載していたものを読みやすく1ページにまとめたダイジェスト版です。無断転載などではありませんのでご了承ください。
概要
今回取り上げるのは、Microchip社のマイコン「PIC32MX」です。
「PIC」といえば、電子工作を趣味としている方々の強い味方。
5V動作の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のアーキテクチャは「MIPS」と呼ばれるものを採用しています。
この「MIPS」なるものを説明すると多くのページが必要となってしまいますので、興味のある方はWikiをご参照ください。
簡単に言えば、RISCという設計思想の正しさを証明するという学術的な理由から開発された、大学の研究室由来のアカデミックなアーキテクチャです。
こんな大学の教科書みたいな表紙のイメージ通り、アカデミックです!
この評価の結果、旧来のCISCに対するRISCの優位性が証明され、後のARMやPowerPCの設計に大きな影響を与えたわけですが、これについての蘊蓄はこの辺にして。
この「MIPS」、昔は結構流行っていました。
しかし、今となってはやや古いアーキテクチャであることは否めず、RTOSなどの移植の例も少ない寂しい現状…。
そこで、現在市場に流通している唯一のMIPSアーキテクチャのマイコンである「PIC32MX」に「μITRON4.0」準拠のRTOS(リアルタイムOS)であるTOPPERS/ASPを移植してみました。
直接の移植の動機は、なんと言っても秋月電子通商さんで販売されている以下の製品の存在ですね。
●PICマイコン PIC32MX270F256B-50I/SP
●PICマイコン PIC32MX250F128B-I/SP
MIPSアーキテクチャで動作周波数50MHz級の本格的なマイコンがDIPパッケージで売られているという事実。
DIPパッケージというところが肝心です。
私のようなボンクラソフトウェア技術者だと、ハンダ付けが下手ですので、QFPパッケージ(脚が四方に出ていて、めっちゃ細い形状)での実装は難しいのです。
なので、気軽に治具や簡単な計測器を作成する際に、これほど助かることはありません。
PIC32は8ビット系のシリーズとは異なり、5Vではなく3.3V駆動となってしまいますが、それでも十分にありがたい存在です。
必要なもの
今回のターゲットとなる「PIC32MX1/2/5 Starter Kit」です。
秋月電子通商さんで売ってます。
この記事の執筆時点の価格で、8,600円です。
デバッガー機能を内蔵していますので、これポッキリで開発が進められます。
これが高いか安いかの議論はさておき…。
他の型番への移植も可能ですが、TOPPERS/ASPを搭載して動作させるならROM:128KB/RAM:8KB以上の容量を持つ型番を選びましょう。
このブログでは「PIC32MX1/2/5 Starter Kit」を使用した場合の例を説明していきたいと思います。
ダウンロード/GitHub
ソースコードの入手は、こちらからどうぞ。
とは言っても、このソースコードをダウンロード、もしくは「git clone」しても、絶対にビルドが通りません。
このソースコードは未完成です。
なぜなら、Microchip社のドライバを後から付け加える必要があるんです。
そのMicrochip社のドライバのライセンスの条項が理解に難しく、公開、および再配布しない方が無難と判断したためです。
ですので、今後この記事では、それらのソースコードの入手方法やコピーする場所などを事細かに書いていくつもりです。
ちょっとだけ面倒ですが、お付き合いしていただけると嬉しいです。
ビルドは、まだやっちゃダメですよ~。
開発環境の構築(MPLAB X IDE編)
「MPLAB X IDE」とは、Microchip社の純正のIDEです。
PIC32MX版のTOPPERS/ASPを使って開発を行っていく上では、以下の方針を採ります。
1.コーディングとビルドは「Eclipse」を使う。
2.デバッガを使う場合のみ「MPLAB X IDE」を使う。
…面倒くさいですね。
何で2つのIDEを使い分けなきゃならんのか?
すいません、完全に個人的な趣味です!
コーディングは「Eclipse」の方が慣れているし、「MPLAB X IDE」はビルドやプロジェクト管理のやり方がイマイチ分かり難かったので、つい…。
もちろんコーディングを含めて「MPLAB X IDE」だけで全てを賄う方法もあるに違いありません。
(私は上手くいかなかったのですが。)
しかしながら、ここでは上記の方針に則り説明していきます。
では、まずは以下のページで「MPLAB X IDE」のダウンロードをしましょう。
上記のページのちょっと下の方に行ってもらって、「MPLAB X IDE」のロゴと「Learn More」というバナーが配置されている箇所がありますよね。
ここで「Learn More」バナーをクリックします。
新しいページに誘導されます。
ここで「Download MPLAB X IDE」のバナーをクリックです。
すると、以下のような場所に誘導されます。
ここで最新版の「MPLAB X IDE」をダウンロードしたくなりますが、それはダメです。
なぜならば、今回のターゲット「PIC32MX1/2/5 Starter Kit」は、新しめのバージョンではサポートが打ち切られ、最新版では「PIC32MX1/2/5 Starter Kit」用のプロジェクトの出力ができないからです。
それほど古い評価ボードではないと思うのですが、なんででしょうか?
大人の事情!?
ウ~ン、ちょっと気持ち悪いですが、とりあえず今はガマンして古いバージョンを探してみましょう。
なので、以下の通り「Go to Downloads Archive」バナーをクリックしましょう。
以下のような場所に誘導されます。
ちょっと下の方に行ってもらって、良さそうなバージョンを探しましょう。
以下のようなリストに辿り着いたら「Next >」というバナーをクリックしていきましょう。
ここでは動作確認ができている「MPLAB X v5.40」を探します。
(v6.0まで行かなければ、v5.45やv5.50でも大丈夫とは思います。)
あった!これだね。
「MPLAB X v5.40」という表記の部分をクリックして、ダウンロードを開始します。
ダウンロードが完了すると「MPLABX-v5.40-windows-installer.exe」というファイルが落とせます。
これをダブルクリックしてみましょう。
以下のようにインストーラーが起動します。
「Next >」ボタンをクリックして先に進みましょう。
ほいほい、ライセンスね。
分かりましたよ~ってことで、同意のラジオボタンをクリックし、「Next >」ボタンをクリックです。
かなり壮大な時間がかかりますが、インストール終了です。
「Finish」ボタンをクリックです。
勝手にブラウザが開いて、他のソフトウェアをダウンロードするように促されますが、何もしない閉じちゃって大丈夫です。
開発環境の構築(XC32コンパイラ編)
お次はPIC32MX用のコンパイラのインストールを行いましょう。
「XC32」っていうGCCベースのコンパイラです。
以下のページでダウンロードします。
3つ並んでいる内の一番右「Download an XC32 Compiler」というバナーをクリックして下さい。
以下のようなページに飛ばされますので、ここでは「MPLAB VC32 C-Compiler(Winodws)」をクリックです。
ダウンロードが始まります。
ダウンロードが完了すると「xc32-vx.xx-full-install-windows-x64-installer.exe」というファイルが生成されますので、これをダブルクリック!
以下のようにインストーラが起動します。
ここでは「Next>」ボタンをクリックです。
お次はお約束のライセンス承諾。
「I accept the agreement」のラジオボタン、「Next>」ボタンを順にクリックしましょう。
ようやくインストール作業が開始されたようです。
これがまた終わるまでにどえりゃ~時間がかかります。
コーヒー片手に、しばらくネットサーフィンでもしていてください。
インストールが終わると以下のような表示が…。
以下のように「Your Host ID is:」という記述の後にパスワードらしきものが表示されています。
「XC32」を最大限の最適化で使用する際にはアクティベーションが必要であり、その登録のために必要なIDなのだそうです。
趣味レベルではなく、仕事などで本格的にPIC32を使いたいよ~という方は、メモしておいた方が良いでしょう。
アクティベーションしなくても、普通の用途ならコンパイラは問題なく使えます。
一応メモしたら「Next>」ボタンをクリックして先に進みましょう。
コンパイラのインストールはこれで完了です。
「Finish」ボタンをクリックしてインストーラを終了させましょう。
開発環境の構築(Eclipse編)
さて、デバッガを使うための純正IDEである「MPLAB X IDE」と純正コンパイラの「XC32」のインストールに続き、コーディングとビルドを行うための「Eclipse」をインストールします。
まずは、今回使う「PIC32MX」用のツールチェーンの環境変数の設定を行います。
ツールチェーンは、「XC32」のインストールにより既に以下のディレクトリにセットアップされているはずです。
C:\Program Files\Microchip\xc32\v4.30\bin
(XC32のバージョンが「4.30」の場合)
XC…などと言っても、普通にGCCを含むGNUツールチェーンのように見えます。
環境変数の設定方法は他のページで調べていただくか、あるいは手前味噌で恐縮ですが、私のブログのページ(TOPPERS/ASPのビルドからデバッグまで~GNUツールチェーンの導入)の「環境変数の設定」の項目を御覧ください。
ただし、パスは…
C:\Program Files (x86)\GNU Tools ARM Embedded\7 2017-q4-major\bin
…となっているところを…
C:\Program Files\Microchip\xc32\v4.30\bin
また、このページの「パスの確認」の項目で打ち込むコマンドも、以下のように変わります。
続きまして「Cygwin」のインストールを行います。
基本的には「gcc-core」、「make」、「diffutils」、「perl」と「git」の5つのパッケージを含むようなCygwin環境を構築すれば良いです。
もしよろしければ、私のブログのページ(TOPPERS/ASPのビルドからデバッグまで~Cygwinの導入)を参考にしてください。
次に、ソースコードをゲットしちゃいましょう。
以下のコマンドでソースコードのクローンを行います。
$ git clone https://github.com/RyutaroMorita/asp_pic32mx_gcc.git
ダウンロードとGithub、いずれの場合も「asp_pic32mx_gcc」というディレクトリの名前を「asp_1.9.2」などと改名すると、上記のページと同じ状況になります。
さて、コンパイラーをインストールして、ソースコードもダウンロードしました。
早速ビルドを~!って思う気持ちはわかりますが、やめておきましょう。
どうせ、必ずビルドは失敗します。
なぜならば、ソースコードに色々加えなければならないからです。
その手順も追って説明いたしますので、ここはグッと我慢。
それよりも先に「Eclipse」のインストールを行います。
あまりにも古すぎるものを除けば、好きなバージョンの「Eclipse」をインストールしてください。
よろしければ、このページ(TOPPERS/ASPのビルドからデバッグまで~Eclipseの導入)を参考にしてください。
MPLAB Harmonyとは?
「MPLAB Harmony」とは、ドライバ、プロトコル、スタック、コーディングユーティリティ、ビルドシステムなどを開発者に提供するソースコードのライブラリです。
いわゆる純正のライブラリパッケージであり、これを使用するとCPUに内蔵されているペリフェラル(周辺機器)を簡単に利用することができるというものです。
今回の「TOPPERS/ASP PIC32MX版」のカーネル内でも、割り込み、タイマーやシリアル通信ドライバなどは、この「MPLAB Harmony」のドライバを使用しています。
ところが、この「MPLAB Harmony」のソースコードのライセンスの条項が不明瞭なために再配布できません。
そのため「TOPPERS/ASP PIC32MX版」のソースコードが不完全なものとなり、そのままではビルドが通らず、通すためには手動で不足分のソースコードをコピーしていただくという手間を強いることになってしまいました。
申し訳ありません…。
では、その「MPLAB Harmony」のソースコードを何処から入手すれば良いのか?
そのためには、インストールした「MPLAB X IDE」上で雛形となるプロジェクトを作って、そこで生成された「MPLAB Harmony」のソースコードを「TOPPERS/ASP PIC32MX版」のソースツリーにコピーするという方法を採ります。
ちなみに、この「MPLAB Harmony」は、すでにインストール済の「MPLAB X IDE」には付随しておらず、別途ダウンロードとインストールが必要になります。
今回はやたらとダウンロード/インストールするものが多いですね。
こらえてつかぁさい…。
MPLAB Harmonyのインストール
「MPLAB Harmony」は、以下のページでダウンロードします。
「MPLAB Harmony Integrated Software Framework v2.06 Windows」という表記の右側の「Download」という表示をクリックします。
ダウンロードが完了すると「harmony_v2_06_windows_installer.exe」というファイルが生成されますので、これをダブルクリック!
以下のようにインストーラが起動します。
ここでは「Next>」ボタンをクリックです。
同意せざるを得んでしょう…。
ラジオボタンを「I accept the agreement」に選択してから「Next>」ボタンをクリックしましょう。
ようやくインストール作業が開始されたようです。
これも、そこそこ時間がかかります。
終わるまでTVでも観ていてください。
終了すると以下のような表示となります。
「Finish」ボタンをクリックしてインストーラを終了させましょう。
これで「MPLAB Harmony」のインストールは終了です。
しかし、これを使うにはまだまだ作業が必要です!
MPLAB HarmonyのIDEへの登録
すでにインストール済みの「MPLAB X IDE」は、先程インストールしたばかりの「MPLAB Harmony」の存在を知りません。
(大体、この時点で「MPLAB X IDE」は一回も起動させていませんしねぇ。)
ですので「MPLAB X IDE」に「MPLAB Harmony」の存在を知らせて、それを使えるようにする作業が必要です。
そこで、まずは「MPLAB X IDE」を起動します。
普通にインストールした場合、PCのデスクトップに「MPLAB X IDE」のショートカットがあるはずですので、それをダブルクリックします。
すると、以下のようなスプラッシュスクリーンが表示されます。
しばらくすると、まっさらな状態のIDEが立ち上がります。
キレイでシッカリ作られていそうなIDEですね!
次に「MPLAB X IDE」上部の「Tools」メニューから「Plugins」をクリックします。
以下のようなダイアログが現れます。
このダイアログの「Download」タグをクリックしましょう。
以下のように表示が切り替わりましたか?
次は、ダイアログの左上の「Add Plugins...」ボタンをクリックです。
新たに開いたダイアログで「MPLAB Harmony」のプラグイン・ファイル(.nbm)を選択します。
つまり、このプラグインをインストールすることで「MPLAB X IDE」が「MPLAB Harmony」を認識し、協調して働くことができるようになるという寸法です。
では、そのプラグイン・ファイルが何処にあるかっていうと、以下のパスです。
C:\microchip\harmony\v2_06\utilities\mhc
「MPLAB Harmony」は、ここにインストールされていたのですね。
そこで、以下のダイアログで上記のパスまで移動し「com-microchip-mplab-modules-mhc.nbm」という長ったらしい名前のファイルを選択し、右下の「開く」ボタンをクリック!
以下のような表示になったでしょうか?
それでは満を持してダイアログ左下の「Install」ボタンをクリックです!
すると、以下のように「Plugin Installer」なるものが立ち上がります。
「Next>」ボタンをクリックしましょう。
ああ、いつものアレだ…。
同意のチェックボタン、「Install」ボタンの順にクリックです。
プラグインのインストールが終わると、以下の表示となります。
「Finish」ボタンをクリックしてください。
その後「MPLAB X IDE」は自動的に終了しますが、ビックリしないでください。
しばらく待っていると再起動します。
これで無事「MPLAB Harmony」のIDEへの登録は完了です!
雛形プロジェクトの作成
まずは「MPLAB X IDE」画面上部の「File」、「New Project...」メニューを順にクリックしていきます。
以下のような「New Project」ダイアログが表示されます。
ここから「Categories」リストから「Microchip Embedded」を、「Projects」のリストから「32-bit MPLAB Harmony Project」をそれぞれ選択して、ダイアログ下方の「Next >」ボタンをクリックしてください。
すると、以下のような表示に切り替わります。
ここでは「Harmony Path:」のテキストボックスの右側のディレクトリボタンをクリックしましょう。
ディレクトリの選択ダイアログが表示されたはずです。
ここでは、先程インストールした「MPLAB Harmony」の場所を選択しましょう。
特に変わった操作をしていなければ、その場所は以下のパスになります。
このパスを指定したあとは「開く」ボタンをクリックです。
元の「New Project」ダイアログに戻ります。
ここで思い出してください。
現在は、TOPPERS/ASPのプロジェクトを作成するのではなく、そのために必要な「MPLAB Harmony」のソースコードを出力させるための雛形プロジェクトを作成する作業をしています。
したがって、今回作成するプロジェクト名、すなわち「Project Name:」のテキストボックスには「Hinagata」とでも入力しておきましょう。
続いて「Target Board」のコンボボックスでは、今回使用する評価ボードの「PIC32MX1/2/5 Starter Kit」を選択します。
以下のように正しく設定できたら、ダイアログ下方の「Finish」ボタンをクリック!
なにか「MPLAB X IDE」でワチャワチャ始まりました!
画面下方の「Output」エリアでは、次々とメッセージが表示されていますね。
「仕事してます」感バリバリ。
この処理の終盤に、以下のようなダイアログが表示されたら「Save」ボタンをクリックしましょう。
さて、処理が終了すると、メインの画面は以下のような表示になっていると思います。
ここで「Harmony Framework Configurarion」の項目をクリックしてください。
「Harmony Framework Configurarion」の項目が展開されて、更に色々な項目が出てきましたね。
その中で「Drivers」という項目があるので、これをクリックして展開します。
TOPPERS/ASPは、外部のハードウェアとしてOSタイマーである「Timer」と、デバッグシリアルに使用する「USART」の2つが必要です。
(正確には、「割り込み」もそうですが、ここでは特に意識する必要はありません。)
では、まずOSタイマーに使用する「Timer」の設定からいきましょう。
展開された「Drivers」という項目の中に「Timer」という項目がありますので、これをクリックして展開します。
すると、なにやら細々した項目が展開されましたね?
これを以下の通りに設定してください。
間違えると、後々面倒になりますのでここは慎重に!
次にデバッグシリアルに使用する「USART」の設定にいきましょう。
展開された「Drivers」という項目の中に「USART」という項目がありますので、これをクリックして展開します。
またまた細々した項目が展開されました。
これを以下の通りに設定してください。
こちらも間違えないよう慎重にお願いします!
まだまだ、作業は続きます。
次は、PIC32MXマイコンのピンの設定です。
メインの画面のタブを現在の「Options」から「Pin Disgram」に切り替えてください。
すると以下のようにマイコンの絵が出てきましたね。
この中で74番ピン「RC14」と73番ピン「RC13」に注目してください。
これらのピンは、現在のデフォルト状態では何も機能が割り振られていない(GPIO入力?)ので、これらをUSART、いわゆるシリアル通信のためのRX(受信)とTX(送信)として使えるように設定します。
まずは、74番ピン「RC14」をUSARTのRX(受信)に設定します。
ピンの部分をクリックすると、ドロップダウンリストが表示されます。
ここでは、このピンに割り当て可能な機能が列挙されます。
今回はUSARTのRX(受信)、すなわち「U1RX」を選択します。
次は、73番ピン「RC13」をUSARTのTX(送信)に設定します。
同じ要領でUSARTのTX(送信)、すなわち「U1TX」を選択します。
以下のように、74番ピンに「U1RX」、73番ピンに「U1TX」と、それぞれ表示が変わったでしょうか?
ここはミスるとシリアル通信ができなくなるなど、後々非常に厄介なので必ずご確認を!
さて、以上で全ての設定が終了です。
メインの画面の左上のフロッピーディスクのマークをクリックして設定を保存しましょう。
以下のようなダイアログが表示されたら「Save」ボタンをクリックして、この雛形プロジェクトを保存しましょう。
もしこの先、無事に「TOPPERS/ASP」の起動に成功して、イザ何かを作ろう!となった場合、今回追加した「MPLAB Harmony」ライブラリだけでは絶対に足らなくなることでしょう。
評価ボードにセンサーを繋げて、そのセンサーとSPIで通信するとか、AD変換を使いたいだとか…。
その際には、再び今回の手順で必要になった「MPLAB Harmony」ライブラリを追加して、ソースコードを吐き出させて、更にそれを「TOPPERS/ASP」のソースツリーにコピーしなければなりません。
そういう意味では、この雛形プロジェクト、結構使用頻度が高くなるかもしれませんよ?
大切に取っておきましょう!
ではいよいよ、この雛形プロジェクトからソースコードを吐き出させてみましょう。
先程のフロッピーディスクのマークの右側、「歯車→Code」というアイコンのボタンをクリックします。
以下のような「Generate Project」ダイアログが表示されるので「Generate」ボタンをクリック!
以下のように雛形プロジェクトからソースコードが生成されていきます。
ソースコードの生成が終わると「Generate Project」ダイアログは自動的に消えます。
これで雛形プロジェクトから必要なソースコードを抽出できました。
雛形プロジェクトのソースコードは、以下のディレクトリに出力されています。
C:\microchip\harmony\v2_06\apps\Hinagata
どんなものが出力されているのか?
ちょっと見てみるのも良いでしょう。
Harmony Frameworkのコピー
既にインストール済みの「MPLAB Harmony」のディレクトリと、「TOPPERS/ASP PIC32MX版」のソースツリーのディレクトリを同時に2つエクスプローラーで開いておきましょう。
記事通りに作業すると、「MPLAB Harmony」は以下のディレクトリに保存されているはずです。
同じく、TOPPERS/ASPのソースツリーは以下のディレクトリに保存されているはずです。
(「asp_pic32mx_gcc」や「asp_pic32mx_gcc_master」を「asp_1.9.2」に改名した場合。)
C:\cygwin64\home\<ユーザー名>\asp_1.9.2
さて、2つ開いたエクスプローラーでそれぞれ以下の場所を表示するようにします。
まず、「MPLAB Harmony」の方は、以下のディレクトリへ移動させます。
次に、TOPPERS/ASPのソースツリーの方は、以下のディレクトリへ移動させます。
C:\cygwin64\home\<ユーザー名>\asp_1.9.2\arch\pic32mx_gcc
「MPLAB Harmony」の方のディレクトリに注目!
以下のディレクトリを確認して下さい。
この「framework」ディレクトリの中には「MPLAB Harmony」で使用できる様々な周辺機器のデバイスドライバのソースコードやヘッダーファイルが大量に入っています。
「TOPPERS/ASP PIC32MX版」で使用するタイマーやシリアル通信のデバイスドライバもこの中に含まれています。
この「framework」ディレクトリを開いてあるもう一方のエクスプローラー、TOPPERS/ASPのソースツリーの方にコピーします。
結果、TOPPERS/ASPのソースツリーの方は、以下のようになりましたか?
これで、HarmonyのFrameworkのソースコードの回収は完了です。
雛形プロジェクトで生成したソースコードのコピー
現在、2つ開いているエクスプローラーでそれぞれ以下の場所を表示するようにします。
「MPLAB Harmony」の方は、以下のディレクトリへ移動させます。
ここは、既に作成した雛形プロジェクトのソースが格納されている場所です。
C:\microchip\harmony\v2_06\apps\Hinagata\firmware\src
次に、TOPPERS/ASPのソースツリーの方は、以下のディレクトリへ移動させます。
C:\cygwin64\home\<ユーザー名>\asp_1.9.2\target\1_2_5_starterkit_gcc
「MPLAB Harmony」の方(ていうか、雛形プロジェクトの方)のディレクトリに注目!
以下の3つのディレクトリとソース/ヘッダーファイルを確認して下さい。
雛型プロジェクトは、今回使用する「PIC32MX1/2/5 Starter Kit」評価ボードで動作する基本的な設定や定義を行うソースコードを生成させるために作成しました。
これらのディレクトリやファイルは、まさにその生成されたソースコードというわけです。
この3つを開いてあるもう一方のエクスプローラー、TOPPERS/ASPのソースツリーの方にコピーします。
結果、TOPPERS/ASPのソースツリーの方は、以下のようになりましたか?
これで、雛形プロジェクトによって生成されたソースコードの回収は完了です。
コマンドラインでのビルド
さて、これで全ての準備は整いました。
早速ビルドしてみましょう。
ここまで長かったですね!
お疲れ様です。
Cygwinを開いて、TOPPERS/ASPソースツリーの場所まで移動しましょう。
$ cd asp_1.9.2/
次にその直下の「OBJ」ディレクトリに移動します。
$ cd OBJ/
コンフィギュレーターのパーミッションを実行可能に設定します。
$ chmod 755 ../cfg/cfg/cfg.exe
そうしたら、プロジェクトのコンフィグファイル(sample1.cfg)の情報を元に、OSに必要な定義を記したソースコード(「kernel_cfg.c」と「kernel_cfg.h」)を生成します。
$ make depend
以下のような表示にならずエラーが出力される場合は、残念ながらこれまでの作業に誤りがあります。
お手数ですが、最初からご確認を!
ここまで上手くいったら、本番のビルド。
以下のコマンドを実行します。
$ make all
プロジェクトの作成(Eclipse編)
これまでの作業で、開発環境をインストールし、PIC32MX版TOPPERS/ASPのソースコードをダウンロードし、それをコマンドラインでビルドするまでを行いました。
このままずっとコマンドラインで作業するのもシンドいので、Eclipse上でビルドが行えるようにプロジェクトを作成しましょう。
このページ(TOPPERS/ASPのビルドからデバッグまで~サンプルプロジェクトのデバッグ)の「プロジェクトの作成」および「プロジェクトのクリーンとビルド」の項目を参考にプロジェクトを作成してください。
「デバッガの登録」の項目は読み飛ばしてください。
今回はデバッグ作業をこのEclipse上で行わず、次にプロジェクトを作成する「MPLAB X IDE」上で行う方針なので、この作業は必要ありません。
Eclipseの画面右側に以下のようなアイコンが表示されて、これらをダブルクリックすることによりビルドができるまでを確認してください。
プロジェクトの作成(MPLAB X IDE編)
さて、もう一方のIDEである「MPLAB X IDE」用のプロジェクトも作りましょう。
とはいえ、既にこのプロジェクトは「TOPPERS/ASP PIC32MX版」のソースツリーのディレクトリの中に既に用意してあります。
「OBJ.X」というディレクトリがそれです。
(「asp_pic32mx_gcc」や「asp_pic32mx_gcc_master」を「asp_1.9.2」に改名した場合。)
C:\cygwin64\home\<ユーザー名>\asp_1.9.2
それでは「MPLAB X IDE」を起動させましょう!
起動させた場合、画面左上の「Projects」タブには、以前作成した雛形プロジェクトを示す「Hinagata」のみが登録されていることを確認してください。
件の「OBJ.X」プロジェクトをここに登録したいと思います。
画面左上の「File」メニューから「Open Project...」項目をクリックしてください。
以下のようなダイアログが表示されますので「OBJ.X」のディレクトリを選択してやってから「Open Project」ボタンをクリックします。
すると、画面左上の「Projects」タブには、新たに「OBJ」というディレクトリが追加されていることが確認できるはずです。
ここで注意していただきたいことがあります。
このプロジェクトのビルド対象は「OBJ.X」ではなく、同じディレクトリにある「OBJ」ディレクトリ以下のソースコードです。
なので、以下のように「Source Files」をクリックすると「OBJ」ディレクトリ以下のソースコードのリストが展開されると思うでしょう?
しかしながら、今回用いた方法ではそのようにはなりません。
「Source Files」をクリックしても何も起こりません。
その上の「Header Files」も同様です。
その理由は、今回の方法は、雛形プロジェクトの時とは異なり「MPLAB X IDE」にとっては通常のプロジェクト作成手順ではないためです。
今回の場合「MPLAB X IDE」を使うのは、単にデバッガを操作するためであり、ソースコードの編集などはEclipseの方で行う方針なので、ソースコードの閲覧はEclipseの方で行ってください。
でも、デバッガのみを使う場合でも、ブレークポイントを仕掛ける際にソースコードを表示しなければなりませんよね。
では、どうするか?
その場合は、以下の方法が簡単です。
たとえば、サンプルプログラムのメインのソースコードである「sample.c」を「MPLAB IDE」で表示したい場合、以下のように「OBJ」ディレクトリの中にある「sample.c」をドラッグして「Start Page」タブにドロップしてみてください。
すると、新たに「sample.c」タブが作成され、「sample.c」の内容が表示されます。
この方法で「OBJ」ディレクトリ内のソースコードを閲覧することも出来ますし、ソースコードの中の任意の行にブレークポイントを仕掛けることもできます。
同じ操作を繰り返せば、複数のソースコードの表示も可能です。
ちょっと不便かもしれませんけど…。
申し訳ないです。
ともあれ、これで「MPLAB X IDE」の方のプロジェクトも準備ができました。
シリアル通信用の配線の引き出し
さて、いよいよパソコンと「PIC32MX1/2/5 Starter Kit」評価ボードを接続します。
接続した結果は以下のような感じになりますが…。
まず、USBの方はデバッガと接続するためのものですが、問題はそれ以外の電線。
これらは「TOPPERS/ASP PIC32MX版」のサンプルプログラムで使用するデバッグメッセージ用のシリアル通信線です。
しかし「PIC32MX1/2/5 Starter Kit」評価ボードには、既に最初からD-SUBコネクタが実装されていますよね。
実は、これはシリアル通信のためのものではなく、CANのためのD-SUBコネクタなのです。
では、シリアル通信のためのコネクタが何処にあるかというと、実は、この評価ボードでは用意されていないのです。
そのため、シリアル通信を使用するには必要な信号線を評価ボードから引き出してあげる必要があるのです。
さて、どこから引き出しましょうか?
以下の「PIC32MX1/2/5 Starter Kit」評価ボードの回路図を御覧ください。
74ピンの「SOSC0/T1CK/RC14」と73ピンの「SOSC1/RC13」に注目してください。
これらのピンは「Y2」というクリスタルに接続されていますね?
しかしながら「DNP」とあるように、どうやらこのクリスタルは実装されていないようです。
そして、74ピンの「SOSC0/T1CK/RC14」と73ピンの「SOSC1/RC13」は、レジスタの設定により、それぞれシリアル通信の受信(RXD)と送信(TXD)端子として使用することができるようです。
では早速、そのレジスタの設定をしなくちゃ!
…って、実はもう設定できているんです。
思い出してください。
「雛形プロジェクトの作成」の章の下の方で既にやっています。
こんな感じで雛形プロジェクトで設定しましたよね?
この設定により、74ピンの「SOSC0/T1CK/RC14」と73ピンの「SOSC1/RC13」は、それぞれシリアル通信の受信(RXD)と送信(TXD)端子として使用することになります。
そして、この雛形プロジェクトから吐き出されたソースコードを前回「TOPPERS/ASP PIC32MX版の」ソースツリーにコピーしたため、これから動かすサンプルプログラムは、この設定通りに動くことになるのです。
では、シリアル通信に必要な信号線を評価ボードから引き出しましょう。
必要な信号線は、受信(RXD)、送信(TXD)、そしてGNDの計3本ですね。
受信(RXD)、送信(TXD)は、基板下方の未実装の「Y2」クリスタルのホール(穴のことね)をそのまま使いましょうか。
GNDは、基板上方にパッドがあります。
未実装の「Y2」クリスタルのホールから受信(RXD)と送信(TXD)を引き出しましょう。
こんな感じ。
これで、必要な信号線の引き出しは完了です。
プログラムの転送とデバッグ
引き出した線は、パソコンのシリアルポートに接続します。
しかしながら、今どきシリアルポートが備えられているパソコンは稀でしょう。
そこで、以下のような市販のUSB/シリアル通信変換ケーブルを用意します。
USB/シリアル通信変換ケーブルのコネクタの形状によりますが、引き出した信号線は圧着端子などで加工する必要があるかもしれません。
USB/シリアル通信変換ケーブル側の配線は、上からTXD、RXD、GNDの順番でこんな感じ。
これでシリアルポートが使えるようになりました。
続いて、このUSB/シリアル通信変換ケーブルをパソコンに繋いでみましょう。
パソコン上でデバイスマネージャーを開きます。
ポート(COMとLPT)のサブカテゴリーとして「USB Serial Port」というポートが追加されているはずです。
(私のパソコンでは、「COM15」として認識されていますね。)
このポート番号、覚えておいて下さい。
ここで、ターゲットとパソコンもUSBケーブルで繋げちゃいましょ。
ご覧の通り、通電します。
次に「TeraTerm」をご用意ください。
インストールしていない方は、このページ(TOPPERS/ASPのビルドからデバッグまで~サンプルプロジェクトのデバッグ)の「TeraTermの導入」の項目を参考にしてください。
もちろん、シリアル通信のターミナルであれば、他のものもお使いいただけます。
今回のTOPPERS/ASPのサンプルプログラムは、シリアル通信のメッセージを出力しますので、先程「USB Serial Port」として認識されたシリアルポート番号でターミナルを立ち上げておきましょう。
設定は、こんな感じです。
ボーレートは「9600」です。
(私のパソコンは、USB/シリアル通信変換ケーブルをCOM15として認識していました。)
さて、「MPLAB X IDE」に戻りましょう。
「MPLAB X IDE」でプロジェクトを作成した状況から始めます。
画面左上の「Projects」リストにおいて「OBJ」プロジェクトが選択されていることを確認してください。
次に、プログラムの実行を行います。
画面上部のデバッグボタンをクリックします。
デバッガの起動には、意外と時間がかかります。
もしこの時、以下のようなエラーが表示されてしまったら、それはサンプルプログラムがビルドされていない証拠です。
「Eclipse」の方で「Makeターゲット」タブから「depend」、「all」の順にダブルクリックして、ビルドを終わらせましょう。
無事にデバッガが起動すると、立ち上げておいたターミナルに以下のような表示が出ていると思います。
TOPPERS/ASPカーネルとそのサンプルプログラムの転送と実行に成功です。
ブレークポイントを試してみましょう。
動作中のプログラムを停止します。
画面上部の「■」ボタンをクリックします。
ブレークポイントを仕掛けましょう。
エクスプローラーで「TOPPERS/ASP PIC32MX版」のソースツリーの「OBJ」ディレクトリの中にある「sample1.c」をドラッグし「MPLAB X IDE」にドロップして、ソースコードを表示します。
このソースコードの丁度中盤くらい、メインタスクの始めに仕掛けましょうか。
ブレークポイントは、ソースコードビューの左端をクリックすると■が表示され、セットされていることを表します。
仮に、これを再びクリックするとブレークポイントが解除され■も消えます。
では、ブレークポイントを仕掛けた状態で、プログラムを再び実行してみます。
上手く引っかかってくれるでしょうか…。
以下のようにプログラムが停止すれば成功です!
ここからは、「F8」キーでステップオーバー、「F7」キーでステップインなど、おなじみの操作が使用できます。
因みに、ステップオーバーやステップインなどを行っている時に命令が飛んでしまったり前後したりする場合は、最適化のせいです。
デバッグ時は、このページ(TOPPERS/ASPのビルドからデバッグまで~サンプルプロジェクトのデバッグ)の「サンプルプログラムのデバッグ」の項目を参考に最適化を解除しましょう。
サンプルプロジェクトの説明
興味のある方は、このページ(TOPPERS/ASPのビルドからデバッグまで~サンプルプロジェクトで遊ぼう)を参照してください。
PIC32MX版カーネルについて
以下、このカーネルにおける備考です。
割り込み優先度
このカーネルでは、-1(優先度最低)から-7(優先度最高)の7段階の優先度設定が可能です。
PIC32MXは、実は64段階までの割り込み優先度をサポートしています。
でも…そんなに要らんでしょ?
ということで、私の実装では7段階までに抑えています。
7段階の根拠は、元祖TOPPERS/ASPの「m68k」版と合わせただけで深い意味はありません。
実用レベルでは十分かと…。
割り込み番号の指定方法
このマイコンは、割り込み番号と、割り込みベクタ番号が一致しないタイプです。
ちょっと小さいので、クリックしてご覧いただきたいのですが、以下は、データシートからの一覧表です。
割り込み番号を意味する「IRQ#」と、割り込みベクタ番号を意味する「Vector#」の不一致がお分かりいただけるかと。
例えば、デバッグシリアルの割り込み設定例を見てみましょう。
「..\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 /* 割込み属性 */
...
この定義において、シリアル通信の受信割り込みの割り込み番号が「INT_SOURCE_USART_1_RECEIVE」、送信割り込みの割り込み番号が「INT_SOURCE_USART_1_TRANSMIT」、更に両方の割り込みのベクタ番号は「_UART_1_VECTOR」と設定されていることが分かります。
この設定は「make depend」実行時に「..\target\1_2_5_starterlit_gcc\target_serial.cfg」によってコンフィグレータに渡されます。
では「INT_SOURCE_USART_1_RECEIVE」や「INT_SOURCE_USART_1_TRANSMIT」の実際の割り込み番号の値がどこに定義されているのか?
分かりにくい場所にあるのですが、今回の評価ボード「PIC32MX1/2/5 Starter Kit」に搭載されているマイコンの型番が「PIC32MX570F512L」ですので、「..\arch\pic32mx_gcc\framework\peripheral\int\processor\int_p32mx570f512l.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;
...
これによると「INT_SOURCE_USART_1_RECEIVE」は「39」、「INT_SOURCE_USART_1_TRANSMIT」は「40」となっています。
上記のデータシートからの表と照らし合わせてください。
一致しますよね?
次に、割り込みのベクタ番号についてですが、割り込み番号と同様、「..\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\p32mx570f512l.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
...
これによると「_UART_1_VECTOR」は「31」となっています。
こちらも、上記のデータシートからの表と一致しますね!
このように、もし新たな割り込みを実装する場合には、割り込みの設定は割り込み番号と割り込みベクタ番号をそれぞれ調べて設定するようにしてください。
面倒だけども…。
例外ハンドラ
今回のサンプルプロジェクトでターミナルから「z」や「Z」を入力して起こる例外は、13番の「Trap exception」例外です。
この設定は「..\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のデータシートを熟読していただく必要がありますが、これらが引き起こされた時点で致命的な状況が多く、デバッグでの用途以外、あまり使い道はないでしょう。
一部サービスコールは未対応
性能評価用システム時刻取得のための「get_utm()」サービスコールは未実装です。
ライセンスについて
このカーネルは「TOPPERSライセンス」で配布しております。
無償ですが、使用に関しては自己責任です。
万が一、このカーネルを商用利用する方は、このリンク先の条項に従ってください。
今回取り上げた「PIC32MX」マイコンは「MIPS」アーキテクチャによる「M系」型番です。
先ごろ「ARM」アーキテクチャによる「C系」型番が発表されました。
「PIC32CM」とか「PIC32CX」などです。
ですので余程の理由がない限りは、新規の開発では「C系」型番を使うべきなんでしょうね。
でも…
世の中何でもかんでもARM一辺倒になって、ホントにいいんでしょうかね?