2023年11月21日火曜日

「pcDuino3」でYocto Project その3

前回からの続きです。

このテーマを最初からご覧になる場合はこちらからどうぞ。


Ubuntuのダウンロード

前回インストールした「VMware Workstation Player」で仮想のパソコンを作成し、そこにLinuxをインストールしようと思います。

一口にLinuxと言っても、それこそ星の数ほど多くのディストリビューションがあります。

しかし「Yocto Project」の公式リファレンスマニュアルのページ「1 System Requirements」によると、サポートされているディストリビューションは、以下の通りです。


●Fedora

●openSUSE

●CentOS

●Debian

●Ubuntu


そのうちのどれを選択するか?

今回は、現在最もシェアが高い「Ubuntu」というディストリビューションを選びます。

シェアが高いディストリビューションということは、インターネット上の情報が最も豊富ということです。

このことは、必然的に「Ubuntu」で「Yocto Project」を使用している人が多く、トラブルに遭った場合に解決するための情報も得やすいことを意味します。

これは大きなメリットです!

早速、この「Ubuntu」を手に入れましょう!

以下のページにアクセスしてください。


https://jp.ubuntu.com/


ページ上部の「ダウンロード」の表示をクリックしてください。

「Ubuntu」ダウンロードページ - 1


ページが切り替わったら、少し下の方にスクロールしてもらって…

「Ubuntu」ダウンロードページ - 2


以下の通り「ダウンロード」の表示をクリックします。

「Ubuntu」ダウンロードページ - 3


ダウンロードが開始されるはずです。

「Ubuntu」ダウンロードページ - 4


ダウンロードが完了したら、早速そのファイルを見てみましょう。

ubuntu-xx.xx.x-desktop-amd64.iso」みたいなファイル名だと思います。

拡張子が必ず「.iso」であることを確認してください。

これで「Ubuntu」のインストールディスク・イメージのダウンロードは完了です。


「VMware Workstation Player」の仮想マシンの作成

さて「VMware Workstation Player」を起動させましょう。

以下の画面から「新規仮想マシンの作成」の表示をクリックしてください。

「VMware Workstation Player」 - 1


以下のダイアログが現れたら「インストール元:」のラジオボタンを「インストーラ ディスク イメージ ファイル」に設定します。

更に右側の「参照」ボタンをクリックして、先程ダウンロードした「ubuntu-xx.xx.x-desktop-amd64.iso」という名前のインストールディスク・イメージを指定します。

インストールディスク・イメージが認識されると、パスを表示しているテキストボックスの下に「Ubuntu 64 ビット xx.xx.xが検出されました…」という表示が出てきます。

それを確認してから、ダイアログ下方の「次へ」ボタンをクリックです。

「VMware Workstation Player」 - 2


続いて、以下のような表示が出てきます。

ここは面倒なんで4箇所全部「yocto」にしました。

もっと丁寧に設定したい方は、任意でどうぞ。

「VMware Workstation Player」 - 3


次の表示も、丁寧な方は任意で設定してください。

デフォルトでも構わない方は、そのまま「次へ」ボタンをクリックです。

「VMware Workstation Player」 - 4


次はちょっと悩みどころ…。

今作ろうとしている可能マシンに振り分ける仮想ハードディスクのサイズの設定です。

ハードディスクの容量は、一般的に「Yocto Project」を使うとなると100GB以上が必要と言われています。

これは、今この「VMware Workstation Player」を動かしているパソコンのハードディスクから割り当てることになるため、どれだけのサイズを設定するかは、パソコンの残りの空き容量次第となります。

サイズは大きい方が後々面倒がなくて良いので、ここでは余裕を持って「256GB」と設定します。

(パソコンのハードディスクの空き容量がそんなに無い方は「128GB」でも行けるかな?)

設定が終わったら「次へ」ボタンをクリック。

「VMware Workstation Player」 - 5


次の表示では「ハードウェアをカスタマイズ」ボタンをクリックしてください。

「VMware Workstation Player」 - 6


ここが最後の思案のしどころ…。

仮想ハードディスクの割当に続いて、今作ろうとしている可能マシンに振り分けるメモリのサイズの設定です。

「VMware Workstation Player」は、ホストマシンの上で仮想マシンを動かします。

すなわち、Windowsが動いている上で同時にLinuxを動かすことになります。

この時、Windowsのためのメモリを増やしてLinuxのためのメモリを減らすと、Windowsのアプリケーションの動作が速くなり、Linuxのアプリケーションの動作が遅くなります。

逆もまた然り。

しかし「Yocto Project」は、非常に重いフレームワークです。

ソースコードのダウンロードやコンパイル、多くのファイルのコピーを何百回何千回と繰り返します。

一つのディストリビューションを作るのに、大変な時間がかかります。

そのため、Linuxを動作させる仮想マシンのメモリは、やはり多いほど処理速度が向上し、作業時間は短縮されます。

そこで、以下のように「推奨最大メモリ」の印で示される容量を設定しました。

(下の画像の例では「13.4GB」ですね。)

ちなみに、メモリと同様に、プロセッサ・コア数もこの画面で設定可能です。

こちらもメモリの場合と同様の理屈で多いほど有利ですが、お使いのCPUの半分ほどを振り分ければ良いと思います。

上記は、パソコンのCPUが4コア持っているので、そのうちの半分の2コアを仮想マシンに割り当てた例です。

この画面で可能な設定は非常に悩みますが、後から設定変更も可能ですので、それほど気を揉まないでくださいね。

設定が終わったら「次へ」ボタンをクリックしましょう。

「VMware Workstation Player」 - 7


以下の表示に切り替わったら「完了」ボタンをクリックして、仮想マシン、いよいよ起動です!

「VMware Workstation Player」 - 8


仮想マシンへのUbuntuのインストール

仮想マシンが起動する冒頭、以下の表示が出てきますが、これは「OK」ボタンをクリックしてください。

大したことじゃないです。

Ubuntuのインストール - 1


しばらくすると、仮想マシン上で「Ubuntu」のインストールディスク・イメージが実行されます。

Linux起動中…。

Ubuntuのインストール - 2


クリスタルなクラゲ!?

なかなかにアーティスティックな壁紙!

Ubuntuのインストール - 3


さて、いよいよ「Ubuntu」のインストーラが開始されます。

まずはキーボードの設定です。

お使いの環境に合わせて設定し「Continue」ボタンをクリックします。

Ubuntuのインストール - 4


この後は、しばらく「Continue」ボタンを連打で良いです。

Ubuntuのインストール - 5


Ubuntuのインストール - 6


Ubuntuのインストール - 7


Ubuntuのインストール - 8


以下の画面になったら、手入力が必要です。

ここも横着して全部「yocto」と入力しました。

この「Ubuntu」は「Yocto Project」のための一時的な環境で、なにもサーバーを構築するわけでもないのだから、あまり神経質にならなくて良いと思いますよ。

入力が終わったら「Continue」ボタンをクリック。

Ubuntuのインストール - 9


ふぅ…ようやくインストールが始まりました。

インストールが終了するまで、ある程度の時間がかかります。

Ubuntuのインストール - 10


インストールが完了すると、ひっそりと味気なく…以下のポップアップが表示されます。

「再起動していいですか?」…

「良いですよ!」ってなわけで「Restart Now」ボタンをクリックしてください。

Ubuntuのインストール - 11


仮想マシンが再起動すると、以下のようにログイン画面が表示されます。

「yocto」というユーザー名が表示されていますね?

こちらをクリックします。

Ubuntuのインストール - 12


パスワード入力のためのテキストボックスが現れますので、パスワードを入力しましょう。

今回の場合、私が横着したのでここも「yocto」と…。

Ubuntuのインストール - 13


すると、以下の通り「Ubuntu」のデスクトップが表示されます。

クリスタル・クラゲに再会!

本当に最近のLinuxは、WinodwsやMacOSに劣らないくらいデスクトップの完成度が高くなっていますね。

これで仮想マシンへの「Ubuntu」のインストールは無事終了です。

Ubuntuのインストール - 14


さて、起動させたものは、いつかは終了させなきゃいけない…というわけで「Ubuntu」の終了の仕方を確認しておきましょう。

Linuxの正しい礼儀作法として、これはターミナル(コマンドプロンプト)で行います。

現在のデスクトップからターミナルを開くには、GUIのメニューから選択しても良いのですが、もっと楽な方法があります。

キーボードの「Ctrl」+「Alt」+「T」を同時に押してください。

以下のようにターミナルが開けましたか?

Ubuntuのインストール - 15


「Ubuntu」を正しく終了させるには、開いたターミナルで以下のコマンドを入力します。


$ sudo shutdown -h now


このコマンドは、管理者権限で(sudo)、シャットダウンせよ(shoutdown)、電源断(Halt)で(-h)、今すぐに!(now)…という意味です。

すると、以下のようにパスワードの入力を求められます。

これは、コマンドの頭に「sudo」を付けたからです。

サーバーなどの用途に用いられるLinuxでは、シャットダウンは特別な操作です。

ログインしている誰でも彼でもシャットダウンできてしまっては困ります。

なので、大抵の場合「shutdown」コマンドは管理者権限で実行されなければなりません。

したがって、そのためのパスワードが必要というわけになります。

では、パスワード(今回の場合「yocto」ですね)を入力して、リターンキーを押します。

Ubuntuのインストール - 16


しばらくすると「Ubuntu」はシャットダウンされて、仮想マシンの画面も消え去ります。

これで「Ubuntu」が正しく終了できました。

再び「Ubuntu」を起動したいときは「VMware Workstation Player」の画面で、左のリストから「Ubuntu 64 ビット」を選択状態にして「仮想マシンの再生」をクリックします。

Ubuntuのインストール - 17


すると、再び仮想マシンが起動し「Ubuntu」が立ち上がって、ログイン画面が表示されます。

これで「Ubuntu」の起動と終了は万全ですね!


以上で「Yocto Project」を動作させる土台は整いました。

次回から、このフレームワークの構築に移りましょう。

…ここまででも、けっこう手間がかかりましたよね。


<続く>

2023年11月14日火曜日

TOPPERS/ASP - Arduino UNO R4版 その2

前回からの続きです。


開発環境の構築

「Arduino UNO R4」に搭載されている「Renesas RA」マイコン用のIDEのインストールを行います。

IDEは、ルネサスエレクトロニクス社純正の「e2 studio」というものを使用します。

以下のページでダウンロードします。


https://www.renesas.com/jp/ja/software-tool/e-studio


開いたページをちょっと下へスクロールして…

「e2 studio」ダウンロードページ - 1


ここですね。

統合開発環境 e2 studio 2023-10 Windows用インストーラ」という項目をクリックすると…

「e2 studio」ダウンロードページ - 2


以下のようなポップアップが表示されます。

ここでは難しく考えずに「Confirm」をクリックします。

「e2 studio」ダウンロードページ - 3


すると以下のページが開きます。

「e2 studio」をダウンロードするためには、ユーザー登録が必要とのこと。

面倒ですが、登録しないと先に進めませんので「登録」をクリックして、アカウントの作成とログインをお願いします。

登録したからと言って、セールスのメールがバンバン来たりとか、そういう害はありませんのでご安心を!

「e2 studio」ダウンロードページ - 4


登録が終わって、一度ログインしてしまえばダウンロードできます。

トップページに戻って、再度「統合開発環境 e2 studio 2023-10 Windows用インストーラ」という項目をクリックです。

「e2 studio」ダウンロードページ - 5


以下のようなページが表示されますので「同意します」をクリック。

ダウンロードが始まります。

「e2 studio」ダウンロードページ - 6


ダウンロードが完了すると「setup_e2_studio_20xx-xx.zip」というファイルが生成されますので、これを解凍します。

解凍されて生成された「setup_e2_studio_20xx-xx.exe」というファイル、これがインストーラー本体ですので、ダブルクリック!

すぐに以下のポップアップが表示されますので、「All Users」をクリックします。

「e2 studio」インストーラー - 1


なにやら、準備中の様ですよ~。

「e2 studio」インストーラー - 2


以下の画面が現れます。

ここではインストールの方法の種類を問われます。

ここでは「Lite Install」を選択して(「Recommended=オススメ」って書いてあるし…)、画面下方の「Next>」ボタンをクリックしましょう。

「e2 studio」インストーラー - 3


続いて表示された以下の画面では「Next>」ボタンをクリック!

Next>」ボタンが有効化されるまで、ちょっと時間がかかるかもです。

「e2 studio」インストーラー - 4


次の表示ではお目当ての「RA」のみにチェックを入れて「Next>」をクリックします。

「e2 studio」インストーラー - 5


以下の表示…ゴチャゴチャしてますが、とりあえず「Next>」ボタンをクリック。

「e2 studio」インストーラー - 6


お約束の画面。

ソフトウェア契約の条件に同意します。」のチェックボックスを有効にしてから「Next>」ボタンをクリックしましょう。

「e2 studio」インストーラー - 7


ここも特に変更する必要はないですね。

Next>」ボタンをクリックして先に進みましょう!

「e2 studio」インストーラー - 8


事情聴取はこれで最後かな?

インストール」ボタンをクリックしてください。

「e2 studio」インストーラー - 9


インストールが始まった様ですが…

「e2 studio」インストーラー - 10


…間髪入れずVisual C++のランタイムのインストールが開始されます。

(しかも「x86 - 32bit」用と「x64 - 64bit」用の2発連続!)

これは、放っておけば勝手に終わります。

「e2 studio」インストーラー - 11


「e2 studio」インストーラー - 12


この後はしばらく時間がかかりますので、しばらくお待ちを。

でも、席を外さないでください。

なぜなら…

「e2 studio」インストーラー - 13


途中で以下ようなポップアップ表示されて、インストール作業が中断されてしまいますので…。

これはデバッガーのデバイスドライバのインストール許可なので、共に「インストール」ボタンをクリックしてインストールしましょう。

このポップアップはインストール中に計2~4回ほど表示されます。

「e2 studio」インストーラー - 14


さて、これでインストールが終わるまで離席を…と思いますが、まだまだです。

唐突に以下のダイアログが表示されます。

とにかく「OK」ボタンをクリックすると…

ARM GNUツールチェーンのインストーラ - 1


以下のようにツールチェーン(コンパイラなど)のインストーラが起動します。

次へ」ボタンをクリックしてください。

ARM GNUツールチェーンのインストーラ - 2


同意しましょう!

同意する」ボタンをクリック。

ARM GNUツールチェーンのインストーラ - 3


インストール先に特別な拘りがなければ、そのまま「インストール」ボタンをクリックしましょう。

ARM GNUツールチェーンのインストーラ - 4


インストール作業が開始されます。

ARM GNUツールチェーンのインストーラ - 5


インストール作業が終了すると、以下の表示となります。

インストール」ボタンをクリックして、ツールチェーンのインストーラを終了させましょう。

ARM GNUツールチェーンのインストーラ - 6


今回の「e2 studio」のインストールでは、デフォルトで以下の2つのバージョンのツールチェーンがインストールされるようです。


●ARM GNU Toolchain 12.2_m pacbti-rel1

●ARM GNU Toolchain 10.3-2021.10


今インストールが終わったのは「~12.2_m pacbti-rel1」の方です。

なので、引き続き「~10.3-2021.10」のインストーラが起動します。

作業としては、前回と一緒です。

ARM GNUツールチェーンのインストーラ - 7


さて、あれやこれやと付きっきりで手間をかけて、ようやく「e2 studio」のインストールが終了します。

OK」ボタンをクリックして、インストーラを終了させましょう。

「e2 studio」インストーラー - 15


次に、今回使う「Renesas RA」マイコン用のツールチェーンの環境変数の設定を行います。

ツールチェーンは2つのバージョンをインストールしましたよね?

さて、どちらを使いましょうか?

「~12.2_m pacbti-rel1」の方が新しいようですが、ツールチェーンに限らずソフトウェアは最新のものが最良とは限らない世界。

ましてや、信頼性が命の組み込み分野…。

ここは十分に枯れていると思われる「~10.3-2021.10」を選択したと仮定して説明します。

(多分、「~12.2_m pacbti-rel1」でも特段大きな問題はないと思いますので、新しいもの好きの方はどうぞ。)

ツールチェーンは、「e2 studio」のインストールにより既に以下のディレクトリにセットアップされているはずです。


C:\Program Files (x86)\GNU Arm Embedded Toolchain\10.2021.10\bin

GNUツールチェーンのディレクトリ


環境変数の設定方法は、このページ(TOPPERS/ASPのビルドからデバッグまで~GNUツールチェーンの導入)の「環境変数の設定」の項目を御覧ください。

ただし、パスは…


C:\Program Files (x86)\GNU Tools ARM Embedded\7 2017-q4-major\bin


…となっているところを…


C:\Program Files (x86)\GNU Arm Embedded Toolchain\10.2021.10\bin


に置き換えてください。

こんな感じ…。

「環境変数名の編集」ダイアログ


ツールチェーンのインストールと環境変数の設定が正しく行われているかを確認します。

コマンドプロンプトを起動し、以下のコマンドを入力します。


> arm-none-eabi-gcc --version


以下のような表示が出力されたら、GNUツールチェーンのインストールと環境変数の設定が正しく行われていることが確認できます。

コマンドプロンプト

これで準備ヨシ!

試しに、いよいよ「e2 studio」を起動させてみましょう!

Windowsメニューから「e2 studio」をクリックします。

以下のようなスプラッシュスクリーンが表示されます。

初回起動には、相当な時間がかかりますのでお覚悟を。

「e2 studio」のスプラッシュスクリーン


以下の表示が現れます。

特に理由がなければ、ここは、デフォルトのワークスペースの場所で「起動」をクリックしましょう。

e2 studioランチャー


やがて、以下の画面が表示されます。

これが「e2 studio」です!

「e2 studio」


以上で開発環境の構築は完了です。

次回は、実際にこの「e2 studio」を使っていきましょう!


<続く>

2023年11月10日金曜日

TOPPERS/ASP - PIC32MX版 その10

前回からの続きです。

このテーマを最初からご覧になる場合はこちらからどうぞ。


サンプルプロジェクトの説明

このページ(TOPPERS/ASPのビルドからデバッグまで~サンプルプロジェクトで遊ぼう)を参照してください。

PIC32MX


PIC32MX版カーネルについて

以下、このカーネルにおける備考です。


●割り込み優先度

このカーネルでは、-1(優先度最低)から-7(優先度最高)の7段階の優先度設定が可能です。

PIC32MXは、実は64段階までの割り込み優先度をサポートしています。

でも…そんなに要らんでしょ?

ということで、私の実装では7段階までに抑えています。

7段階の根拠は、元祖TOPPERS/ASPの「m68k」版と合わせただけで深い意味はありません。

実用レベルでは十分かと…。


●割り込み番号の指定方法

このマイコンは、割り込み番号と、割り込みベクタ番号が一致しないタイプです。

ちょっと小さいので、クリックしてご覧いただきたいのですが、以下は、データシートからの一覧表です。

割り込み番号を意味する「IRQ#」と、割り込みベクタ番号を意味する「Vector#」の不一致がお分かりいただけるかと。

割り込み番号/割り込みベクター番号


例えば、デバッグシリアルの割り込み設定例を見てみましょう。

「..\target\1_2_5_starterlit_gcc\target_serial.h」において、以下のように定義しています。

  1. ...
  2. /*
  3.  * SIOの割込み番号,優先度,属性の定義
  4.  */
  5. #define INTNO_SIO_RX INT_SOURCE_USART_1_RECEIVE
  6. #define INTNO_SIO_TX INT_SOURCE_USART_1_TRANSMIT
  7. #define INHNO_SIO _UART_1_VECTOR
  8. #define INTPRI_SIO -6       /* 割込み優先度 */
  9. #define INTATR_SIO TA_NULL  /* 割込み属性 */
  10. ...


この定義において、シリアル通信の受信割り込みの割り込み番号が「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」の中の以下の記述にあります。

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


これによると「INT_SOURCE_USART_1_RECEIVE」は「39」、「INT_SOURCE_USART_1_TRANSMIT」は「40」となっています。

上記のデータシートからの表と照らし合わせてください。

一致しますよね?

次に、割り込みのベクタ番号についてですが、割り込み番号と同様、「..\arch\pic32mx_gcc\framework\peripheral\int\processor\int_p32mx570f512l.h」の中の以下の記述にあります。

  1. ...
  2. typedef enum {
  3.     INT_VECTOR_CT = _CORE_TIMER_VECTOR,
  4.     INT_VECTOR_CS0 = _CORE_SOFTWARE_0_VECTOR,
  5.     INT_VECTOR_CS1 = _CORE_SOFTWARE_1_VECTOR,
  6.     INT_VECTOR_INT0 = _EXTERNAL_0_VECTOR,
  7.     INT_VECTOR_T1 = _TIMER_1_VECTOR,
  8.     INT_VECTOR_IC1 = _INPUT_CAPTURE_1_VECTOR,
  9.     INT_VECTOR_IC1_ERROR = _INPUT_CAPTURE_1_VECTOR,
  10.     INT_VECTOR_OC1 = _OUTPUT_COMPARE_1_VECTOR,
  11.     INT_VECTOR_INT1 = _EXTERNAL_1_VECTOR,
  12.     INT_VECTOR_T2 = _TIMER_2_VECTOR,
  13.     INT_VECTOR_IC2 = _INPUT_CAPTURE_2_VECTOR,
  14.     INT_VECTOR_IC2_ERROR = _INPUT_CAPTURE_2_VECTOR,
  15.     INT_VECTOR_OC2 = _OUTPUT_COMPARE_2_VECTOR,
  16.     INT_VECTOR_INT2 = _EXTERNAL_2_VECTOR,
  17.     INT_VECTOR_T3 = _TIMER_3_VECTOR,
  18.     INT_VECTOR_IC3 = _INPUT_CAPTURE_3_VECTOR,
  19.     INT_VECTOR_IC3_ERROR = _INPUT_CAPTURE_3_VECTOR,
  20.     INT_VECTOR_OC3 = _OUTPUT_COMPARE_3_VECTOR,
  21.     INT_VECTOR_INT3 = _EXTERNAL_3_VECTOR,
  22.     INT_VECTOR_T4 = _TIMER_4_VECTOR,
  23.     INT_VECTOR_IC4 = _INPUT_CAPTURE_4_VECTOR,
  24.     INT_VECTOR_IC4_ERROR = _INPUT_CAPTURE_4_VECTOR,
  25.     INT_VECTOR_OC4 = _OUTPUT_COMPARE_4_VECTOR,
  26.     INT_VECTOR_INT4 = _EXTERNAL_4_VECTOR,
  27.     INT_VECTOR_T5 = _TIMER_5_VECTOR,
  28.     INT_VECTOR_IC5 = _INPUT_CAPTURE_5_VECTOR,
  29.     INT_VECTOR_IC5_ERROR = _INPUT_CAPTURE_5_VECTOR,
  30.     INT_VECTOR_OC5 = _OUTPUT_COMPARE_5_VECTOR,
  31.     INT_VECTOR_SPI1_FAULT = _SPI_1_VECTOR,
  32.     INT_VECTOR_SPI1_RX = _SPI_1_VECTOR,
  33.     INT_VECTOR_SPI1_TX = _SPI_1_VECTOR,
  34.     INT_VECTOR_UART1_FAULT = _UART_1_VECTOR,
  35.     INT_VECTOR_UART1_RX = _UART_1_VECTOR,
  36.     INT_VECTOR_UART1_TX = _UART_1_VECTOR,
  37.     INT_VECTOR_I2C1_BUS = _I2C_1_VECTOR,
  38.     INT_VECTOR_I2C1_SLAVE = _I2C_1_VECTOR,
  39.     INT_VECTOR_I2C1_MASTER = _I2C_1_VECTOR,
  40.     INT_VECTOR_SPI2_FAULT = _SPI_2_VECTOR,
  41.     INT_VECTOR_SPI2_RX = _SPI_2_VECTOR,
  42.     INT_VECTOR_SPI2_TX = _SPI_2_VECTOR,
  43.     INT_VECTOR_UART2_FAULT = _UART_2_VECTOR,
  44.     INT_VECTOR_UART2_RX = _UART_2_VECTOR,
  45.     INT_VECTOR_UART2_TX = _UART_2_VECTOR,
  46.     INT_VECTOR_I2C2_BUS = _I2C_2_VECTOR,
  47.     INT_VECTOR_I2C2_SLAVE = _I2C_2_VECTOR,
  48.     INT_VECTOR_I2C2_MASTER = _I2C_2_VECTOR,
  49.     INT_VECTOR_SPI3_FAULT = _SPI_3_VECTOR,
  50.     INT_VECTOR_SPI3_RX = _SPI_3_VECTOR,
  51.     INT_VECTOR_SPI3_TX = _SPI_3_VECTOR,
  52.     INT_VECTOR_UART3_FAULT = _UART_3_VECTOR,
  53.     INT_VECTOR_UART3_RX = _UART_3_VECTOR,
  54.     INT_VECTOR_UART3_TX = _UART_3_VECTOR,
  55.     INT_VECTOR_SPI4_FAULT = _SPI_4_VECTOR,
  56.     INT_VECTOR_SPI4_RX = _SPI_4_VECTOR,
  57.     INT_VECTOR_SPI4_TX = _SPI_4_VECTOR,
  58.     INT_VECTOR_UART4_FAULT = _UART_4_VECTOR,
  59.     INT_VECTOR_UART4_RX = _UART_4_VECTOR,
  60.     INT_VECTOR_UART4_TX = _UART_4_VECTOR,
  61.     INT_VECTOR_UART5_FAULT = _UART_5_VECTOR,
  62.     INT_VECTOR_UART5_RX = _UART_5_VECTOR,
  63.     INT_VECTOR_UART5_TX = _UART_5_VECTOR,
  64.     INT_VECTOR_CHANGE_NOTICE_A = _CHANGE_NOTICE_VECTOR,
  65.     INT_VECTOR_CHANGE_NOTICE_B = _CHANGE_NOTICE_VECTOR,
  66.     INT_VECTOR_CHANGE_NOTICE_C = _CHANGE_NOTICE_VECTOR,
  67.     INT_VECTOR_CHANGE_NOTICE_D = _CHANGE_NOTICE_VECTOR,
  68.     INT_VECTOR_CHANGE_NOTICE_E = _CHANGE_NOTICE_VECTOR,
  69.     INT_VECTOR_CHANGE_NOTICE_F = _CHANGE_NOTICE_VECTOR,
  70.     INT_VECTOR_CHANGE_NOTICE_G = _CHANGE_NOTICE_VECTOR,
  71.     INT_VECTOR_PMP = _PMP_VECTOR,
  72.     INT_VECTOR_PMP_ERROR = _PMP_VECTOR,
  73.     INT_VECTOR_USB1 = _USB_1_VECTOR,
  74.     INT_VECTOR_RTCC = _RTCC_VECTOR,
  75.     INT_VECTOR_FLASH = _FCE_VECTOR,
  76.     INT_VECTOR_SPI1 = _SPI_1_VECTOR,
  77.     INT_VECTOR_UART1 = _UART_1_VECTOR,
  78.     INT_VECTOR_SPI3 = _SPI_3_VECTOR,
  79.     INT_VECTOR_I2C1 = _I2C_1_VECTOR,
  80.     INT_VECTOR_CN = _CHANGE_NOTICE_VECTOR,
  81.     INT_VECTOR_AD1 = _ADC_VECTOR,
  82.     INT_VECTOR_CMP1 = _COMPARATOR_1_VECTOR,
  83.     INT_VECTOR_CMP2 = _COMPARATOR_2_VECTOR,
  84.     INT_VECTOR_CMP3 = _COMPARATOR_3_VECTOR,
  85.     INT_VECTOR_UART3 = _UART_3_VECTOR,
  86.     INT_VECTOR_SPI2 = _SPI_2_VECTOR,
  87.     INT_VECTOR_UART2 = _UART_2_VECTOR,
  88.     INT_VECTOR_SPI4 = _SPI_4_VECTOR,
  89.     INT_VECTOR_I2C2 = _I2C_2_VECTOR,
  90.     INT_VECTOR_FSCM = _FAIL_SAFE_MONITOR_VECTOR,
  91.     INT_VECTOR_CTMU = _CTMU_VECTOR,
  92.     INT_VECTOR_DMA0 = _DMA_0_VECTOR,
  93.     INT_VECTOR_DMA1 = _DMA_1_VECTOR,
  94.     INT_VECTOR_DMA2 = _DMA_2_VECTOR,
  95.     INT_VECTOR_DMA3 = _DMA_3_VECTOR,
  96.     INT_VECTOR_FCE = _FCE_VECTOR,
  97.     INT_VECTOR_CAN1 = _CAN_1_VECTOR,
  98.     INT_VECTOR_UART4 = _UART_4_VECTOR,
  99.     INT_VECTOR_UART5 = _UART_5_VECTOR
  100. } INT_VECTOR;
  101. ...


これによると「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」の中の以下の記述にあります。

ここはもう、ツールチェーンのディレクトリですよね。

  1. ...
  2. /* Vector Numbers */
  3. #define _CORE_TIMER_VECTOR 0
  4. #define _CORE_SOFTWARE_0_VECTOR 1
  5. #define _CORE_SOFTWARE_1_VECTOR 2
  6. #define _EXTERNAL_0_VECTOR 3
  7. #define _TIMER_1_VECTOR 4
  8. #define _INPUT_CAPTURE_1_VECTOR 5
  9. #define _OUTPUT_COMPARE_1_VECTOR 6
  10. #define _EXTERNAL_1_VECTOR 7
  11. #define _TIMER_2_VECTOR 8
  12. #define _INPUT_CAPTURE_2_VECTOR 9
  13. #define _OUTPUT_COMPARE_2_VECTOR 10
  14. #define _EXTERNAL_2_VECTOR 11
  15. #define _TIMER_3_VECTOR 12
  16. #define _INPUT_CAPTURE_3_VECTOR 13
  17. #define _OUTPUT_COMPARE_3_VECTOR 14
  18. #define _EXTERNAL_3_VECTOR 15
  19. #define _TIMER_4_VECTOR 16
  20. #define _INPUT_CAPTURE_4_VECTOR 17
  21. #define _OUTPUT_COMPARE_4_VECTOR 18
  22. #define _EXTERNAL_4_VECTOR 19
  23. #define _TIMER_5_VECTOR 20
  24. #define _INPUT_CAPTURE_5_VECTOR 21
  25. #define _OUTPUT_COMPARE_5_VECTOR 22
  26. #define _ADC_VECTOR 23
  27. #define _FAIL_SAFE_MONITOR_VECTOR 24
  28. #define _RTCC_VECTOR 25
  29. #define _FCE_VECTOR 26
  30. #define _COMPARATOR_1_VECTOR 27
  31. #define _COMPARATOR_2_VECTOR 28
  32. #define _USB_1_VECTOR 29
  33. #define _SPI_1_VECTOR 30
  34. #define _UART_1_VECTOR 31
  35. #define _I2C_1_VECTOR 32
  36. #define _CHANGE_NOTICE_VECTOR 33
  37. #define _PMP_VECTOR 34
  38. #define _SPI_2_VECTOR 35
  39. #define _UART_2_VECTOR 36
  40. #define _I2C_2_VECTOR 37
  41. #define _UART_3_VECTOR 38
  42. #define _UART_4_VECTOR 39
  43. #define _UART_5_VECTOR 40
  44. #define _CTMU_VECTOR 41
  45. #define _DMA_0_VECTOR 42
  46. #define _DMA_1_VECTOR 43
  47. #define _DMA_2_VECTOR 44
  48. #define _DMA_3_VECTOR 45
  49. #define _COMPARATOR_3_VECTOR 46
  50. #define _CAN_1_VECTOR 47
  51. #define _SPI_3_VECTOR 48
  52. #define _SPI_4_VECTOR 49
  53. ...


これによると「_UART_1_VECTOR」は「31」となっています。

こちらも、上記のデータシートからの表と一致しますね!

このように、もし新たな割り込みを実装する場合には、割り込みの設定は割り込み番号と割り込みベクタ番号をそれぞれ調べて設定するようにしてください。

面倒だけども…。


●例外ハンドラ

例外ハンドラは、以下の表のものが使用できます。

例外ハンドラ一覧表


今回のサンプルプロジェクトでターミナルから「z」や「Z」を入力して起こる例外は、13番の「Trap exception」例外です。

この設定は「..\arch\pic32mx_gcc\prc_test.h」の以下の記述で設定されています。

  1. ...
  2. #define CPUEXC1                    13        /* ゼロ除算例外 */
  3. #define RAISE_CPU_EXCEPTION        syslog(LOG_NOTICE, "zerodiv = %d", 10 / 0)
  4. ...


ご覧の通り「Trap exception」は、ゼロ除算を行った結果引き起こされるものです。

小文字の「z」と大文字の「Z」の違いは、CPU例外が小文字の場合はカーネル管轄内で、大文字の場合はカーネル管轄外でそれぞれ実行されるということだけです。

各CPU例外の詳細については、PIC32MXのデータシートを熟読していただく必要がありますが、これらが引き起こされた時点で致命的な状況が多く、デバッグでの用途以外、あまり使い道はないでしょう。


●一部サービスコールは未対応

性能評価用システム時刻取得のための「get_utm()」サービスコールは未実装です。


ライセンスについて

このカーネルは「TOPPERSライセンス」で配布しております。

無償ですが、使用に関しては自己責任です。

万が一、このカーネルを商用利用する方は、このリンク先の条項に従ってください。


さて、今回はPIC32MXを取り上げてみました。

「PIC32」と呼べるものは、今回の「MX」他にも「MM」、「MC」、「MK」や「MZ」などがラインナップされています。

これらの「M系」は、全てMIPSアーキテクチャです。

しかし、先ごろ「C系」のPIC32が発表されました。

CM」、「CX」や「CZ」などです。


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

PIC32ラインナップ


重要なことは、これらの「C系」PIC32が、遂にARMアーキテクチャになってしまったことです!


う~ん、ARM化の波が遂にここまでも。

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

まあ、プログラマーとしては仕事の面では楽になりますが、趣味の面では退屈だし、寂しく思うのです…。

だいたい、同じARMアーキテクチャで各社しのぎを削っても、横一線で尖った特徴もなくなるので、製品のウリをアピールするのが難しくなると思うのですが。

私は、こういうピーキーなマイコンの方が好きだなぁ…。


そのARMも、いずれは今ホットな「RISC-V」に置き換わってしまうのか?

諸行無常、盛者必衰…。

注目して見ていきましょう!


<終わり>

MLAA License

 名称:「MLAAライセンス」(MLAA) タイプ: ・コピーレフト…× ・ライセンス文の掲示…〇(ソースコード頒布のみ) ・コピーライト(著作権)…〇(ソースコード頒布のみ) ・その他…〇(バイナリ頒布のみ) 原文: Copyright: 2010 Jorge Jimenez ...