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」に置き換わってしまうのか?

諸行無常、盛者必衰…。

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


<終わり>

2023年11月7日火曜日

「pcDuino3」でYocto Project その2

前回からの続きです。


「VMware Workstation Player」のインストール

さて「Yocto Project」で「pcDuino3」のための最新のディストリビューションを作るのはいいとして、まずはLinuxが動作する環境が必要です。

「Yocto Project」は、Linux上で動くフレームワークだからです。

LinuxはLinuxで作らなければなりません。

もし、余ったパソコンをお持ちなら、そこにLinuxをインストールしましょう。

この場合、今回の記事に書かれている内容は飛ばしてしまって構いません。

とはいえ「Yocto Project」を動作させるためには、相当なスペックのパソコンが必要です。

なにせ「Yocto Project」で一つのLinuxディストリビューションを作成する過程で、物凄く多くのソフトウェアのダウンロード、ビルド、コピーを繰り返し行いますので、すべて終わるまでには膨大な時間がかかります。

(場合によっては、丸一日とか…。)

したがって、パソコンが速いほど作業効率は上がります。

しかし、そんなにスペックの高いパソコンって、そうそう余ってませんよね。

懐も寂しいですし…。

そこで、今、Windowsでお使いのパソコン上でLinux環境を再現するために「VMware Workstation Player」を使いましょう。

「VMware Workstation Player」スプラッシュスクリーン


この「VMware Workstation Player」は、Windowsの中に仮想のパソコンを作ってくれるアプリケーションです。

そうして作られた仮想のパソコンの中にLinuxをインストールして「Yocto Project」を動かそう…という目論見です。

まずは、ダウンロードから。

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

そして、以下の通り「VWware Workstation Player」というリンクをクリックします。


https://www.vmware.com/jp/products/workstation-player/workstation-player-evaluation.html

「VMware Workstation Player」のダウンロードページ - 1


ちなみに「VMware Workstation Player」は、非商用利用であれば無償です。

商用利用であれば有償であり、その場合は「VMware Workstation Pro」という製品名になります。

今回は、無償の「VMware Workstation Player」を使用する場合を説明しています。

新しく開いたページで「無償ダウンロード」というボタンをクリックします。

「VMware Workstation Player」のダウンロードページ - 2


次に、新しく開いたページで「GO TO DOWNLOADS」という表示をクリックします。

「VMware Workstation Player」のダウンロードページ - 3


更に、新しく開いたページで「VMware Workstation 17.x.x Player for Windows 64-bit Operating Systems」の欄の右側、「DOWNLOAD NOW」というボタンをクリックします。

やっとこさ、ダウンロードが開始されるはずです。

「VMware Workstation Player」のダウンロードページ - 4


VMware-player-full-17.x.x-xxxxxxxx.exe」みたいな名前のファイルのダウンロードが終了したら、これをダブルクリックします。

インストーラーが起動します…が!、以下のような表示が現れることがあるかもしれません。

なにやら分からぬが…ここは従っておいたほうが無難でしょう。

この表示が出た場合は「はい」ボタンをクリックして、パソコンを再起動しましょう。

これだからWindowsは…。

「VMware Workstation Player」のインストーラー - 1


パソコンの再起動後は、再度「VMware-player-full-17.x.x-xxxxxxxx.exe」をダブルクリックして、インストールを再開しましょう。

インストーラーが立ち上がります。

「VMware Workstation Player」のインストーラー - 2


以下の表示に切り替わったら準備完了。

ここは「次へ」ボタンをクリックです。

「VMware Workstation Player」のインストーラー - 3


はいはい同意同意…って、適当に受け流してはダメですね。

しっかり確認して「使用許諾契約書に同意します」のチェックボックスを有効にしてから「次へ」ボタンをクリック。

「VMware Workstation Player」のインストーラー - 4


以下のような表示が出た場合は、迷わず「Windows Hypervisor Platform(WHP)の自動インストール」のチェックを有効にしましょう。

説明文中にある「Hyper-V」というのは、今インストールしようとしている「VMware Workstation Player」と同じく、Windowsの中に仮想のパソコンを作ってくれる機能で、ある時期からWindowsに標準で実装されるようになりました。

ですが、そのままだと「VMware Workstation Player」とケンカになります。

ですので「Hyper-V」と「VMware Workstation Player」との仲介をするWHPというソフトウェア(ていうかAPI)を自動的にインストールしますか?…というのがこの説明文の大雑把な内容です。

チェックボックスを有効にしてから「次へ」ボタンをクリックします。

「VMware Workstation Player」のインストーラー - 5


これ以降は、しばらく「次へ」ボタンを連打~!

「VMware Workstation Player」のインストーラー - 6


個人的には、タダで使わせてもらっているのだから、せめて協力くらいは~と思います。

個人の判断で良いと思います。

「VMware Workstation Player」のインストーラー - 7


「VMware Workstation Player」のインストーラー - 8


「VMware Workstation Player」のインストーラー - 9


ようやくインストールが始まります。

「VMware Workstation Player」のインストーラー - 10


結構時間はかかりますが、以下の表示が出ればインストールは終了です。

完了」ボタンをクリックしてインストーラーを閉じましょう。

「VMware Workstation Player」のインストーラー - 11


さて、インストールされた「VMware Workstation Player」を試しに起動させてみましょう。

デスクトップに追加されたアイコンをダブルクリックすると、まずは以下のようなダイアログが…。

無償で使います、サーセン…ってなわけで「続行」ボタンをクリック。

「VMware Workstation Player」の起動 - 1


完了」ボタンをクリックしましょう。

お世話になります!

「VMware Workstation Player」の起動 - 2


以下のような表示が出たら「VMware Workstation Player」のインストールと起動は成功です。

お疲れ様でした~。

「VMware Workstation Player」の起動 - 3


さて、今日はここまで。

次回は、この「VMware Workstation Player」で仮想のパソコンを作り、そこにLinuxをインストールするまでやっていきましょうか。


<続く>

2023年11月3日金曜日

「pcDuino3」でYocto Project その1

組み込みLinuxの学習

突然ですが、長年勤めた現職を今年いっぱいで退職し、転職することになりました!

転職先はIoT関連のメーカーで、今までと同様、組み込みエンジニアとしてお仕事をさせていただくことになりました。

お話を伺っていると、新しい職場では、RTOSを使用したベアメタルな機器に加え、組み込みLinuxのお仕事も多いとのこと。

私自身、今まで、このブログで取り上げているようなRTOSを使用した機器の開発がメインでしたが、実は組み込みLinuxを使用した機器の開発経験もあります。

ただし、数年のブランクが空いています。

人間、使わない知識はどんどん忘れていきますし(歳のせいとも言う)、時間の流れが速いLinuxなどのオープンソースの世界においては、この数年のブランクが命取り!

転職後に即戦力となれるように、今一度(現在の)組み込みLinuxを学習してみたいと思いました。


「pcDuino3」とは?

米国LinkSprite社の「pcDuino3」というARMのシングルボード・コンピュータです。

pcDuino3


組み込みLinuxを学ぶ(…というより思い出す)ためには、ターゲットを弄りながら進めていくのが一番。

というわけで、かつて組み込みLinuxでの開発を行っていた時に買ったまま放置していたコイツを引っ張り出してきました。

秋月電子商会さんでは、まだ取り扱っています。

ディスコン(製造中止)ですが、在庫は潤沢のようです。

発売は2014年とのことで、もう10年近く昔の製品です。

しかし、1GHzで動作する「ARM Cortex-A7」のデュアルコアというスペックは、組み込み機器として考えた場合は、まだまだ十分使える性能です。

ちなみに、CPUは中国製の激安SoC「Allwinner A20」です。

一時期は、民生の格安タブレットなどで相当数使われていたとか…。

この手のLinuxが動作するようなシングルボード・コンピュータでは、なんといっても「Raspberry Pi」シリーズが有名ですよね。

一方で、この「pcDuino」シリーズの最大の特徴は、有名な学習用マイコンボードである「Arduino」と同じピン配のピンソケットを実装していることでしょう。

ハードウェアも作るような人は、この「Arduino」用のユニバーサルボードや、ピンソケットの入手性が良いので、オリジナルのシールドが作りやすく、電子工作好きの方々からは好評だったようです。

私も仕事で試作品を作るときには「Arduino」をよく使いますし、オリジナルのシールドを作るために、こういったパーツは使い慣れています。

「Arduino」用のユニバーサルボードとピンソケット


ただし、既存の「Arduino」用のシールドがそのまま使えるか?というと、そこまでの互換性はないようです。

第一、電源が違います(「pcDuino」は3.3Vのみ)ので、既存のシールドは接続しないように注意してください。

さて、この「pcDuino3」を使用して「Node.js」をインストールして「TypeScript」などを使って、IoTゲートウェイのようなものを作ろうと思いました。

いわゆる今風のナウい組み込みLinuxの使い方ですよね~。

そこで、気になるのはデフォルトでインストールされているLinuxのバージョンです。

前述のように、10年近く昔の製品。

あまり古いバージョンのLinuxディストリビューションだと、最新のアプリケーションが動きません。

確認のために、数年ぶりに「pcDuino3」に電源を投入しました。

HDMIコネクタをLCDに繋いで、操作のためのキーボードやマウスをUSBのAコネクタに接続します。

(USBのAコネクタは一つしかありませんから、キーボードとマウスを同時に使用する場合は、USBハブを使いましょう。)

最後に、USBのMicro-Bコネクタから電源を供給してあげれば準備完了です。

「pcDuino3」に電源を投入


しばらくすると、デスクトップが立ち上がります。

「pcDuino3」には、マイクロSDカードのスロットを搭載しています。

しかし、今はこのスロットにはマイクロSDカードが入っていませんので、OSは内蔵のNANDフラッシュから起動しています。

デスクトップの表示


アプリケーションは、最小限ですが「Chromium」を搭載しているのはスゴい。

そうそう、こんな感じだったなぁ…。

インストールされているアプリケーション


ターミナルを開いて各種バーションを確認します。

以下のように入力します。


$ uname -a

カーネルのバージョン確認


カーネルは「3.4.79」!

やはり相当古い…。

今や「6.x.x」とかの時代ですから。

ディストリビューションは「Ubuntu」ですか。

念のため、ディストリビューションの詳細を確認します。

以下のように入力してみます。


$ lsb_release -a

ディストリビューションのバージョン確認


Linaroによる「12.07」ですか。

Ubuntuなので「apt install」コマンドでアプリケーションの追加は可能ですが、カーネルもディストリビューションも古いですね。

これでは、最新の開発環境を使った開発は難しいかもしれません。

さて、どうしたものか…。

そこで「Yocto Project」です!!


「Yocto Project」とは?

詳しくは、こちらを参照してください。

要するに、カスタムのLinuxディストリビューションを作れてしまうフレームワークです。

Linuxディストリビューションを作るには、Linuxの3種の神器「ブートローダ」、「カーネル」、「rootファイルシステム」が必要です。

昔は、これらのそれぞれソースコードを入手して、コンパイラを準備して、ビルドして…という作業が必要でした。

特に「rootファイルシステム」なんかは、ソフトウェアの数が膨大なので、大変な労力を要します。

しかも、それぞれを関連付けるための設定ファイルの作成やら、変更やらで、やっと終わったと思ったらカーネルパニックを起こして起動しなかったりで、もう…やってられるかっ!!…の繰り返しです。

二度とやりたくないです。

そのような煩雑な作業すべてを簡単にやってくれるツールとして「Yocto Project」が登場しました。

他にも、同様の思想のフレームワークには「Buildroot」というものが存在します。

この手のフレームワークでは「Yocto Project」と「Buildroot」が、二大勢力ですが…


●細かいカスタマイズが可能だが、使うのが難しい「Yocto Project

●使うのが簡単だけど、細かいカスタマイズが難しい「Buildroot


という、アベコベの関係にあります。

しかしながら、紆余曲折あって現在は「Yocto Project」がスタンダードです。

組み込みエンジニアにとって、今や「Yocto Project」を扱うことは必須であるといっても過言ではありません。

この「Yocto Project」を使って「pcDuino3」用の最新のカーネルを含むディストリビューションを作ろう!と思います。

IoTゲートウェイを作ろうとしているので、最悪GUIは要りませんが、最低限のセキュリティの担保と、最新の開発環境が使えるだけのディストリビューションを目指したいと思います。


次回から、早速「Yocto Project」による開発環境を揃えていきます。

<続く>…といいですけどね、ボードも古いし、色々忘れちゃってるから…。


<続く>

BSD 2-Clause License

OSSライセンスのメインページは こちら からどうぞ。 ライセンスの目次は こちら です。 名称:「二条項BSDライセンス」(BSD-2-clause) タイプ: ・コピーレフト…× ・ライセンス文の掲示…〇 ・コピーライト(著作権)の掲示…〇 ・その他… × 原文: Cop...