2023年8月1日火曜日

TOPPERS/ASP - PIC32MX版 その4

前回からの続きです。

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


開発環境の構築(Eclipse編)

さて、デバッガを使うための純正IDEである「MPLAB X IDE」と純正コンパイラの「XC32」のインストールに続き、コーディングとビルドを行うための「Eclipse」をインストールします。

まずは、今回使う「PIC32MX」用のツールチェーンの環境変数の設定を行います。

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


C:\Program Files\Microchip\xc32\v4.30\bin

(XC32のバージョンが「4.30」の場合)


XC…などと言っても、普通にGCCを含むGNUツールチェーンのように見えます。

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


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

ただし、パスは…


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


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


C:\Program Files\Microchip\xc32\v4.30\bin


に置き換えてください。

こんな感じ…。

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


また、このページの「パスの確認」の項目で打ち込むコマンドも、以下のように変わります。


> xc32-gcc --version

コマンドプロンプト


続きまして「Cygwin」のインストールを行います。

このページ(TOPPERS/ASPのビルドからデバッグまで~Cygwinの導入)を参考にしてください。


次に、ソースコードをゲットしちゃいましょう。

ソースコードのダウンロードはこちらからどうぞ。

TOPPERS/ASP PIC32MX版」というのを選んでください。

また、「Github」を使いたい方は以下のコマンドでソースコードのクローンを行います。


$ git clone https://github.com/RyutaroMorita/asp_pic32mx_gcc.git

Cygwinターミナル

ダウンロードとGithub、いずれの場合も「asp_pic32mx_gcc」というディレクトリの名前を「asp_1.9.2」などと改名すると、上記のページと同じ状況になります。


さて、コンパイラーをインストールして、ソースコードもダウンロードしました。

早速ビルドを~!って思う気持ちはわかりますが、やめておきましょう。

どうせ、必ずビルドは失敗します。

なぜならば、ソースコードに色々加えなければならないからです。

その手順も追って説明いたしますので、ここはグッと我慢。


それよりも先に「Eclipse」のインストールを行います。

例のごとく、このページ(TOPPERS/ASPのビルドからデバッグまで~Eclipseの導入)を参考にしてください。


さて、以上で開発環境のセットアップは終了です。

これで「MPLAB X IDE」と「Eclipse」の2つのIDEを使用する準備が整いました。

次回は、Microchip社が提供する、PIC32用のソフトウェア開発フレームワーク「Harmony」のインストールを行います。

その「Harmony」とは何ぞや?というところからも説明したいと思います。


<続く>

2023年7月28日金曜日

TOPPERS/ASP - ML62Q1000版 目次

知る人ぞ知る、地元民しか知らないお店の絶品ラーメンみたいなマイコンML62Q1000シリーズ。

そこで動作するTOPPERS/ASPに関する記事の目次です。


■TOPPERS/ASP - ML62Q1000版 その1

TOPPERS/ASP - ML62Q1000版 概要

必要なもの

ダウンロード/GitHub


■TOPPERS/ASP - ML62Q1000版 その2

開発環境の構築


■TOPPERS/ASP - ML62Q1000版 その3

サンプルドライバのソースコードのコピー

スタートアップファイル「start.asm」のコピーと修正

コマンドラインでのビルド


■TOPPERS/ASP - ML62Q1000版 その4

プロジェクトの作成

プロジェクトのクリーンとビルド


■TOPPERS/ASP - ML62Q1000版 その5

デバッガとターゲットの配線

プログラムの転送とデバッグ


■TOPPERS/ASP - ML62Q1000版 その6

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

ML62Q1000版カーネルについて

ライセンスについて


なお、Qiitaにも上記の記事を1ページにまとめたダイジェスト版を投稿しました。

こっちの方が読み易いです。

仕事でもネットで調べ物をしていると、このQiitaには有用な投稿が多いです。

いつも助けれられています。

投稿者の皆様に感謝です。

私の投稿も、よろしければ参考にしてください。

Qiita

TOPPERS/ASP - ML62Q1000版 - Qiita

2023年7月25日火曜日

TOPPERS/ASP - PIC32MX版 その3

前回からの続きです。

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


開発環境の構築(XC32コンパイラ編)

お次はPIC32MX用のコンパイラのインストールを行いましょう。

XC32」っていうGCCベースのコンパイラです。

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


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

このページのほんのちょっと下へ行ってもらって…。

XC32コンパイラ・ダウンロードページ - 1


3つ並んでいる内の一番右「Download an XC32 Compiler」というバナーをクリックして下さい。

XC32コンパイラ・ダウンロードページ - 2


以下のようなページに飛ばされますので、ここでは「MPLAB VC32 C-Compiler(Winodws)」をクリックです。

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

XC32コンパイラ・ダウンロードページ - 3


ダウンロードが完了すると「xc32-vx.xx-full-install-windows-x64-installer.exe」というファイルが生成されますので、これをダブルクリック!

以下のようにインストーラが起動します。

ここでは「Next>」ボタンをクリックです。

XC32コンパイラ・インストーラ - 1


お次はお約束のライセンス承諾。

I accept the agreement」のラジオボタン、「Next>」ボタンを順にクリックしましょう。

XC32コンパイラ・インストーラ - 2


しばらくは「Next>」ボタンを連打です。

XC32コンパイラ・インストーラ - 3


XC32コンパイラ・インストーラ - 4


XC32コンパイラ・インストーラ - 5


XC32コンパイラ・インストーラ - 6


ようやくインストール作業が開始されたようです。

これがまた終わるまでにどえりゃ~時間がかかります。

コーヒー片手に、しばらくネットサーフィンでもしていてください。

XC32コンパイラ・インストーラ - 7


インストールが終わると以下のような表示が…。

以下のように「Your Host ID is:」という記述の後にパスワードらしきものが表示されています。

「XC32」を最大限の最適化で使用する際にはアクティベーションが必要であり、その登録のために必要なIDなのだそうです。

趣味レベルではなく、仕事などで本格的にPIC32を使いたいよ~という方は、メモしておいた方が良いでしょう。

アクティベーションしなくても、普通の用途ならコンパイラは問題なく使えます。

一応メモしたら「Next>」ボタンをクリックして先に進みましょう。

XC32コンパイラ・インストーラ - 8


コンパイラのインストールはこれで完了です。

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

XC32コンパイラ・インストーラ - 9


今回はここまでにしましょう。

次回はEclipseの導入を行いましょう。


<続く>

2023年7月21日金曜日

DIYレトロゲーム機「Nibble」がやってきた! その1

今年の初めくらいにクラウドファンディングサイト「Makuake」でオーダーした、DIYレトロゲーム機「Nibble(ニブル)」が届きました!

この「Nibble」とは?

詳細は公式サイトを参照ください。

Nibble


どことなく往年のPSPに似ているゲーム機のキット(半完成品)です。

最初から三つくらいのゲームが入っているみたいですが、自分でプログラミングして開発することもできます。

この「Nibble」の私の購入動機は、当然、最初から入っているゲームではなくてプログラミングをして遊ぶことです。

その際の開発環境/言語は、

初心者向けの「CircuitBlocks」(ブロックを組み合わせるビジュアル言語)、

中級者向けの「Arduino」(実質C言語)、

上級者向けの「C++」

などが、それぞれ利用できるようです。

いきなり「C++」に挑戦しても大丈夫でしょうかね?

この「Nibble」執筆時点では、まだコチラで購入できるみたいですよ~。


メーカーのCircuitMess社は、クロアチア共和国の会社です。

なので、外箱はどことなく色使いがヨーロピアンテイスト。

外箱 - 1


外箱の裏には簡単な商品解説が。

外箱 - 2


何はともあれ御開帳!

開封 - 1


なにやら、紙が入っています。

ドキュメント類は、サイトからダウンロードしてください、という旨が書いてあります。

続きはWebでっ!」ってやつです。

内容物は、以下のような感じです。

開封 - 2


目を引くのがプラスチック(アクリルかも?)筐体。

白い色をしていますが、これは保護シートが貼られているみたいです。

それを剥がすと無色透明のようです。

ホント…小さいPSP。

プラスチック(アクリルかも?)筐体


部品類は、こんな感じ。

ドライバーや半田なども同梱されています。

(半田は「鉛フリー」のようです。これは使い難いので破棄するでしょう…。)

液晶は128x128ドットのフルカラーとのこと。

往年の名機MSXが256x192ですから、それより相当荒いのですが、発色数だけは圧倒的ですか。

ほか、プッシュスイッチやボタンなど、半田付けが必要な部品は最小限です。

私のようなブキッチョ(って、きょうび聞かねぇなぁ~)にとってはありがたいです。

部品類


肝心のメイン基板がこちら。

結構、シッカリした基板で好感が持てます。

コッチは裏側かな?

メイン基板(裏)


メイン基板をひっくり返してみましょう。

CPUのお出まし!

面実装の細かい部品は、すでに実装済みです。

メイン基板(表)


さて、ここで奇妙なことに気付きます。

このCPU、パターンアンテナが出てますね。

これは、何らかの無線通信機能を持っていることを意味します。

なんだろう?

そんな仕様、上記のサイトに書いていなかったのに?

では、このCPUの正体とは、一体!?

CPU


あ~、これは以前このブログでMSX関連の記事でも取り上げた、中国のEspressif Systems社の「ESP32」マイコンの廉価版「ESP-12F」ですね。

アメリカのTensilica社がライセンスする「Xtensa LX106」CPUコアを採用し(今どき珍しくARMじゃない!)、80MHzのクロックで動作します。

そしてこのマイコン、確かにWiFi機能を内蔵しています。

しかし、それならばこの「Nibble」の強力な売り文句として、もっとアピールすれば良いのに?

この「Nibble」に対して、メーカーのCircuitMess社がどのようなゲーム開発用ライブラリを提供しているのか?…まだ分かりませんが、そこは対応していないということでしょうか?

果たして、どのような開発環境を提供しているのか?

そして仮に、その開発環境が対応していないのであれば、閉ざされしWiFiの封印を解くことができるのか!?

気になるので、早速見てみたいです!!

とはいえ、まずは組み立てを成功させねばなりませんね…。


次回は、組み立ての過程とゲーム機の起動までレポートしたいと思います。

…無事に組み立てられたらねw!


<続く>

2023年7月18日火曜日

TOPPERS/ASP - PIC32MX版 その2

前回からの続きです。


開発環境の構築(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」のダウンロードをしましょう。


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

「MPLAB X IDE」ダウンロード・ページ - 1


上記のページのちょっと下の方に行ってもらって、「MPLAB X IDE」のロゴと「Learn More」というバナーが配置されている箇所がありますよね。

ここで「Learn More」バナーをクリックします。

「MPLAB X IDE」ダウンロード・ページ - 2


新しいページに誘導されます。

ここで「Download MPLAB X IDE」のバナーをクリックです。

「MPLAB X IDE」ダウンロード・ページ - 3


すると、以下のような場所に誘導されます。

ここで最新版の「MPLAB X IDE」をダウンロードしたくなりますが、それはダメです。

なぜならば、今回のターゲット「PIC32MX1/2/5 Starter Kit」は、新しめのバージョンではサポートが打ち切られ、最新版では「PIC32MX1/2/5 Starter Kit」用のプロジェクトの出力ができないからです。

それほど古い評価ボードではないと思うのですが、なんででしょうか?

大人の事情!?

ウ~ン、ちょっと気持ち悪いですが、とりあえず今はガマンして古いバージョンを探してみましょう。

なので、以下の通り「Go to Downloads Archive」バナーをクリックしましょう。

「MPLAB X IDE」ダウンロード・ページ - 4


以下のような場所に誘導されます。

ちょっと下の方に行ってもらって、良さそうなバージョンを探しましょう。

「MPLAB X IDE」ダウンロード・ページ - 5


以下のようなリストに辿り着いたら「Next >」というバナーをクリックしていきましょう。

ここでは動作確認ができている「MPLAB X v5.40」を探します。

(v6.0まで行かなければ、v5.45やv5.50でも大丈夫とは思います。)

「MPLAB X IDE」ダウンロード・ページ - 6


あった!これだね。

MPLAB X v5.40」という表記の部分をクリックして、ダウンロードを開始します。

「MPLAB X IDE」ダウンロード・ページ - 7


ダウンロードが完了すると「MPLABX-v5.40-windows-installer.exe」というファイルが落とせます。

これをダブルクリックしてみましょう。

以下のようにインストーラーが起動します。

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

「MPLAB X IDE」インストーラー - 1


ほいほい、ライセンスね。

分かりましたよ~ってことで、同意のラジオボタンをクリックし、「Next >」ボタンをクリックです。

「MPLAB X IDE」インストーラー - 2


その後は、しばらく「Next >」ボタン連打!

「MPLAB X IDE」インストーラー - 3

「MPLAB X IDE」インストーラー - 4

「MPLAB X IDE」インストーラー - 5


ようやくインストールが開始されました。

「MPLAB X IDE」インストーラー - 6


かなり壮大な時間がかかりますが、インストール終了です。

Finish」ボタンをクリックです。

「MPLAB X IDE」インストーラー - 7


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


今日はここまで。

次回はコンパイラのダウンロード、インストールを行いましょう。


<続く>

2023年7月14日金曜日

TOPPERS/ASP - PIC32MX版 その1

TOPPERS/ASP - PIC32MX版 概要

このブログ、気が付けば三ヶ月も更新を止めてしまいました。

本業が多忙過ぎたのもありますが、決してネタ切れというわけではありません。

まだまだ、公開したいネタはあります。

万が一、更新を待っていてくれた方がいましたら大変申し訳ありませんでした。


さてさて、今回取り上げるのは、Microchip社のマイコン「PIC32MX」です。

PIC32MX1/2/5 Starter Kit


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という設計思想の正しさを証明するという学術的な理由から開発された、大学の研究室由来のアカデミックなアーキテクチャです。

こんな大学の教科書みたいな表紙のイメージ通り、アカデミックです!

MIPSアーキテクチャに関する書籍


この評価の結果、旧来のCISCに対するRISCの優位性が証明され、後のARMやPowerPCの設計に大きな影響を与えたわけですが、これについての蘊蓄はこの辺にして。

この「MIPS」、昔は結構流行っていました。

私が今でも愛用する、このモバイルギアIIにもNEC製の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円です。

デバッガー機能を内蔵していますので、これポッキリで開発が進められます。

これが高いか安いかの議論はさておき…。

PIC32MX1/2/5 Starter Kit


他の型番への移植も可能ですが、TOPPERS/ASPを搭載して動作させるならROM:128KB/RAM:8KB以上の容量を持つ型番を選びましょう。

このブログでは「PIC32MX1/2/5 Starter Kit」を使用した場合の例を説明していきたいと思います。


ダウンロード/GitHub

ソースコードの入手は、こちらからどうぞ。

とは言っても、このソースコードをダウンロード、もしくは「git clone」しても、絶対にビルドが通りません。

このソースコードは未完成です。

なぜなら、Microchip社のドライバを後から付け加える必要があるんです。

そのMicrochip社のドライバのライセンスの条項が理解に難しく、公開、および再配布しない方が無難と判断したためです。

ですので、今後この記事では、それらのソースコードの入手方法やコピーする場所などを事細かに書いていくつもりです。

ちょっとだけ面倒ですが、お付き合いしていただけると嬉しいです。

ビルドは、まだやっちゃダメですよ~。

(あと、動かしながら記事書いてる過程でバグなんかが見つかるかもしれないので、ダウンロードは後の方が良いかも…。)


さて、次回から開発環境の構築をやっていきましょう。

そんなに間を空けずに更新…したいです。


<続く>

2023年4月8日土曜日

TOPPERS/ASP - ML62Q1000版 その6

前回からの続きです。

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


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

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

ML62Q1000


ML62Q1000版カーネルについて

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


●OS上の割り込み優先度の扱い

このカーネルでは、割り込み優先度の設定はできません。

コンフィグレーションファイルなどにおいて、他のアーキテクチャからの移植性を考慮して、-1(優先度最低)から-6(優先度最高)を設定してもエラーが起きないようになっていますが、実際の動作に反映しません。

しかしながら、ML62Q1000に搭載されている割り込みコントローラーは、ちゃんと割り込み優先度を変更する機能を持っています。

だったら、対応しなさいよ!って言われちゃいそうですが、TOPPERS/ASP、および「μITRON4.0」の仕様に適合するカタチでの実装ができませんでした。

理由は以下の通りです。

少し小難しい話になってしまいますので、興味のない方は以下の青い部分は読み飛ばしてください。

複雑なので、箇条書きにします。


○「μITRON4.0」は、OSの仕様として割り込み優先度の操作をサポートするために割り込みマスクを管理する必要がある

○これを行うには、割り込みハンドラ内でその割り込みが起こった直前の割り込みマスクの値を参照できる必要がある。

○大概のCPUの場合、ステータスレジスタに割り込みマスクのビットが含まれる。

○大概のCPUの場合、割り込みが発生するとその直前のステータスレジスタの値がスタックに退避される。

大概のCPUの場合、割り込みハンドラ内でその割り込みが起こった直前の割り込みマスクの値は、スタックに退避されたステータスレジスタの値から知ることができる。

○ところが、ML62Q1000の場合、ステータスレジスタ「PSW」に割り込みマスクのビットがそもそも含まれない。「ELEVEL」という、それらしいビットは存在するが、これは「エミュレータ専用」、「ノンマスカブル」、「ソフトウェア」、「マスカブル」という4種類の大雑把な割り込みレベルを示すものであって、ここで言う割り込みマスクとは意味が異なる。

ML62Q1000の場合、ここで言う割り込みマスクに近いものは、割り込みコントローラー内の現割り込みレベル管理レジスタ、すなわち「CIL」レジスタである。

○しかし、この「CIL」レジスタの値は割り込み発生時にスタックには退避されない。

○よって、ハンドラ内では割り込みが起こった直前の割り込みマスクの値を回収できず、「μITRON4.0」の仕様に沿った形での割り込みマスク管理が完全には実装できない。


…う~ん、無念!

その代わり、裏技的に割り込み優先度を変更する方法を後ほど紹介します。

その裏技を使用しない場合、ML62Q1000における割り込み優先度は、割り込み番号が若いほど優先度が高くなるように固定されています。

割り込み番号の定義は「..\target\rb_d62q1577tb100_u8dev\target_sil.h」にあり、以下の通りです。

  1. ...
  2. /*
  3. * 「ML62Q1577」割込み番号(intno)の定義
  4. */
  5. #define TINTNO_WDTINT       1U
  6. //#define TINTNO_           2U
  7. #define TINTNO_VLS0INT      3U
  8. //#define TINTNO_           4U
  9. #define TINTNO_EXI0INT      5U
  10. #define TINTNO_EXI1INT      6U
  11. #define TINTNO_EXI2INT      7U
  12. #define TINTNO_EXI3INT      8U
  13. #define TINTNO_EXI4INT      9U
  14. #define TINTNO_EXI5INT      10U
  15. #define TINTNO_EXI6INT      11U
  16. #define TINTNO_EXI7INT      12U
  17. #define TINTNO_CBUINT       13U
  18. #define TINTNO_DMACINT      14U
  19. #define TINTNO_MCSINT       15U
  20. #define TINTNO_SIU00INT     16U
  21. #define TINTNO_SIU01INT     17U
  22. //#define TINTNO_           18U
  23. #define TINTNO_SADINT       19U
  24. //#define TINTNO_           20U
  25. #define TINTNO_EXTXINT      21U
  26. //#define TINTNO_           22U
  27. #define TINTNO_I2CM0INT     23U
  28. #define TINTNO_I2CM1INT     24U
  29. #define TINTNO_FTM0INT      25U
  30. #define TINTNO_FTM1INT      26U
  31. #define TINTNO_TM0INT       27U
  32. #define TINTNO_TM1INT       28U
  33. #define TINTNO_I2CU0INT     29U
  34. #define TINTNO_SIU10INT     30U
  35. #define TINTNO_SIU11INT     31U
  36. //#define TINTNO_           32U
  37. #define TINTNO_FTM2INT      33U
  38. #define TINTNO_FTM3INT      34U
  39. #define TINTNO_TM2INT       35U
  40. #define TINTNO_TM3INT       36U
  41. #define TINTNO_SIU20INT     37U
  42. #define TINTNO_SIU21INT     38U
  43. #define TINTNO_CMP0INT      39U
  44. #define TINTNO_CMP1INT      40U
  45. #define TINTNO_FTM4INT      41U
  46. #define TINTNO_FTM5INT      42U
  47. #define TINTNO_TM4INT       43U
  48. #define TINTNO_TM5INT       44U
  49. #define TINTNO_SIU30INT     45U
  50. #define TINTNO_SIU31INT     46U
  51. #define TINTNO_SIU40INT     47U
  52. #define TINTNO_SIU41INT     48U
  53. #define TINTNO_FTM6INT      49U
  54. #define TINTNO_FTM7INT      50U
  55. #define TINTNO_TM6INT       51U
  56. #define TINTNO_TM7INT       52U
  57. #define TINTNO_SIU50INT     53U
  58. #define TINTNO_SIU51INT     54U
  59. #define TINTNO_LTB0INT      55U
  60. //#define TINTNO_           56U
  61. #define TINTNO_LTB1INT      57U
  62. #define TINTNO_LTB2INT      58U
  63. #define TINTNO_RTCINT       59U
  64. //#define TINTNO_           60U
  65. ...


●ソフトウェア割り込み

今回のTOPPERS/ASP ML62Q1000版においては、特別にサンプルプロジェクトにソフトウェア割り込みのサンプルコードを入れています。

サンプルプロジェクトの操作方法については前述したこのページ(TOPPERS/ASPのビルドからデバッグまで~サンプルプロジェクトで遊ぼう)を見ていただくとして、具体的には「i」を一文字ターミナルに対して入力すると、このソフトウェア割り込みが発生するようになっています。

「..\OBJ\sample1.c」の「main_task()」関数内を参照してください。

結構下の方、以下のソースコードに注目。

  1. ...
  2.         case 'i':
  3.             /*
  4.              * ソフトウェア割込み(ソフトウェア割込み10番を発生させる)
  5.              */
  6. #pragma ASM
  7.             swi #10
  8. #pragma ENDASM
  9.             break;
  10. ...


こんな感じで「i」の一文字をターミナルから入力された場合の処理を追記しています。

実際にソフトウェア割り込みを発生させているのは「swi #10」というインライン・アセンブラの命令です。

これは、ソフトウェア割り込みの10番を発生させろ!…という意味になります。

ソフトウェア割り込みでも、通常のマスカブル割り込みと同様に、正しく動作させるにはコンフィギュレーション・ファイルに宣言を行う必要があります。

このサンプルプロジェクトの場合は「..\OBJ\sample1.cfg」にその記述があります。

  1. ...
  2. /*
  3.  * ソフトウェア割込み(ソフトウェア割込み10番を指定)
  4.  */
  5. ATT_ISR({ TA_NULL, 0, (10 + 61), swi_isr, 1 });
  6. CFG_INT((10 + 61), { TA_NULL, -1 });
  7. ...


ここで指定する割り込み番号は、通常のマスカブル割り込みとソフトウェア割り込みを通して連番としています。

上記の割り込み番号の定義(「..\target\rb_d62q1577tb100_u8dev\target_sil.h」」)では、60番まで使われていましたよね?(実際は空番ですけど…。)

したがって、ソフトウェア割り込みはその次、すなわち61番から指定するようにしてください。

ちょっとややこしいですが、ソフトウェア割り込み番号0は61番、今回のソフトウェア割り込み番号10なら、(10 + 61)=71番ということになります。

ソフトウェア割り込み番号は、0~63番まで、合計64個も使えます!(何にそんなに使うんだ!?)

さて、上記のコンフィギュレーションでは、「swi_isr()」という割り込みハンドラを登録しています。

これは「..\OBJ\sample1.c」に実装しています。

一番下の方です。

  1. ...
  2. /*
  3.  * ソフトウェア割込みハンドラ
  4.  */
  5. bool_t debug = false;
  6. void swi_isr(intptr_t exinf)
  7. {
  8.     debug = !debug;
  9. }
  10. ...


10番のソフトウェア割り込みが発生すると、この関数に処理が飛びます。

すなわち「debug = !debug;」の行にブレークを仕掛けて、サンプルプロジェクト動作中にターミナルに「i」を入力すると、この行で停止します。

ソフトウェア割り込みは、昔のCPUにはよく見られた実装ですが、最近ではあまり目にすることはありません。

しかし、上手く使うとプログラムの処理がスマートになり、ソースコードが読みやすくなったりするメリットがあります。

その分、他のアーキテクチャへの移植性は悪くなりますので、ここぞ!という時に使いましょう。


●OS管理外割り込み

今回のTOPPERS/ASP ML62Q1000版においては、OS管理外割り込みに対応しています。

通常「μITRON4.0」は割り込みをも管理するOSですが、OS管理下の割り込みは、純然たるベタな記述のOS管理外割り込みとして実装した場合と較べて、パフォーマンスは若干劣ります。

そのため、例えばAD変換などの応答性を重視される割り込みなどにおいては、OSの管理が足かせになる場合があります。

割り込みをOSの管理外として実装した場合、確かに応答性は向上しますが、割り込みハンドラ内でOSのシステムコールを呼ぶことは、原則できなくなります。

なにせOSの管理外ですから…。

さて、割り込みをOS管理外に設定する方法ですが、これはコンフィギュレーション・ファイルで宣言を行います。

具体的は、以下の条件で設定します。


1.CFG_INTの引数「intpri」を優先度最高(このML62Q1000版の場合は-6)以下にする

2.DEF_INHの引数「inhatr」に「TA_NONKERNEL」フラグを設定する


例えば、前述のソフトウェア割り込みをOS管轄外に変更してみましょう。

「..\OBJ\sample1.cfg」のソフトウェア割り込み10番の設定を以下のように変更します。

  1. ...
  2. /*
  3.  * ソフトウェア割込み(ソフトウェア割込み10番を指定)
  4.  */
  5. //ATT_ISR({ TA_NULL, 0, (10 + 61), swi_isr, 1 });   // コメントアウト!
  6. //CFG_INT((10 + 61), { TA_NULL, -1 });              // コメントアウト!
  7. CFG_INT((10 + 61), { TA_NULL, -7 });                // 追記!
  8. DEF_INH((10 + 61), { TA_NONKERNEL, swi_isr });      // 追記!
  9. ...


CFG_INT」では、ML62Q1000版の優先度最高の値「-6」より、更に優先度が高い「-7」を設定しています。

元の「ATT_ISR」では「TA_NONKERNEL」フラグが設定できませんので「DEF_INH」を使います。

以上で前述の条件を満たせます。

このようにすると、このソフトウェア割り込み10番のハンドラは、OSの管轄から外れ、割り込みの応答性は向上しますが…。

繰り返します。

OS管理外割り込みハンドラ内で「iwup_tsk()」などのシステムコールを呼ぶことはできませんのでご注意を!


●割り込み優先度を変更する裏技

さて、前述した割り込み優先度を変更してしまう裏技についてです。

この裏技、実はすでにOS内で使用しています。

今回のTOPPERS/ASP ML62Q1000版においては、素の状態で3つの割り込みを使用しています。

1つはOSタイマーで、上記の割り込み番号の定義(「..\target\rb_d62q1577tb100_u8dev\target_sil.h」」)で言うところの「TINTNO_TM0INT(割り込み27番)」です。

2つ目は、デバッグ用のシリアル通信で、受信割り込みである「TINTNO_SIU00INT(割り込み16番)」です。

3つ目は、同じくシリアル通信で、送信割り込みである「TINTNO_SIU01INT(割り込み17番)」です。

ここで思い出してください。

ML62Q1000における割り込み優先度は、割り込み番号が若いほど優先度が高くなる」と前述しましたね。

すなわち、普通に実装した場合、OSタイマーよりもシリアル通信のための割り込みの方が優先度が高いということになります。

TOPPERS/ASPはリアルタイムOSです。

タイムクリティカルが売りなのに、それを司るOSタイマーが、遅延の許されるデバッグ用のシリアル通信の割り込みよりも優先度が低いという状況になります。

それって、リアルタイムOSとしてどうなのよ?

なんとかしてOSタイマーの割り込み優先度を上げたいところですよね?

しかしながら、これも前述のように、このカーネルでは、割り込み優先度の設定はできません。

じゃあどうするか?

そこで裏技です。

「..\target\target_config.c」の「target_initialize()」関数を御覧ください。

この「target_initialize()」はOSが起動してから比較的早い時期に実行される関数です。

以下の部分に注目!

  1. ...
  2. /*
  3.  * ターゲット依存の初期化
  4.  */
  5. void
  6. target_initialize(void)
  7. {
  8.     initVls_t initVls;
  9.     /*
  10.      * プロセッサ依存の初期化
  11.      */
  12.     prc_initialize();
  13.     /*
  14.      * 割込みレベル制御許可
  15.      */
  16.     write_reg8(ILEN, 0x01U);
  17.     /*
  18.      * 16 ビットタイマ0 割込み(TM0INT)のレベル設定
  19.      * -> 11: レベル4(割込みレベル高)
  20.      */
  21.     ILTM0L = 1;
  22.     ILTM0H = 1;
  23. ...


一番下の2行で「ILTM0L」と「ILTM0H」のレジスタにそれぞれ「1」を設定していますね?

これらは「割り込みレベル制御レジスタ」というレジスタの中のビットで、OSタイマーに使用している16ビットタイマ0割込み(TM0INT)用のものです。

この「割り込みレベル制御レジスタ」は全てのマスカブル割り込み要因ごとに用意されています。

これらは、今回の場合は「c:\U8Dev\Inc\ML621577.H」に定義されています。

「割り込みレベル制御レジスタ」のこれらのビットは、該当する割り込み要因のレベルを設定するものであり、「H(ハイ)」と「L(ロー)」の2ビットで構成されています。

2ビットだから、レベル1~4までの4段階を設定できます。

ここで言う「レベル」とは、その値が高い割り込みが優先されるという意味になります。

つまり、前述した「ML62Q1000における割り込み優先度は、割り込み番号が若いほど優先度が高くなる」という法則を無視することができます!

(同じレベルのものは、やはり上記の法則に則りますが…。)

「H(ハイ)」と「L(ロー)」の並びで、以下のようにレベルを設定できます。


○00: レベル1(割り込みレベル低)(初期値)

○01: レベル2

○10: レベル3

○11: レベル4(割り込みレベル高)


今回は「ILTM0L」と「ILTM0H」を共に「1」にしたので、OSタイマーに使用している16ビットタイマ0割込み(TM0INT)は「レベル4」に設定していることになります。

これにより、たとえ「割り込み番号が若いほど優先度が高くなる」という法則があろうとも、レベル1のシリアル通信系のものよりもレベル4のOSタイマーの割り込みが優先して実行されることになります。

前述の通り、割り込みマスクの問題から、割り込み優先度の操作についてこのカーネルでは完璧にはサポートできませんでしたが、この裏技を使えば、大抵の場合は対処できるようになるでしょう。


●例外ハンドラは未対応

コンフィグレーションファイルなどにおいて、他のアーキテクチャからの移植性を考慮して、例外ハンドラの作成はできるようになっているものの動作はしません。

理由はML62Q1000に例外処理が存在しないためです。


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

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


●拡張パッケージについて

例えば、アプリケーションによっては、メッセージバッファやミューテックスといった機能を使いたい場合が出てくると思います。

しかしながら、これらの機能は標準では実装されておらず、「..\extension」以下の該当する機能のソースコードをカーネルのソースコードディレクトリにコピーする必要があります。

ここで注意しなければならないのは、今回のTOPPERS/ASP ML62Q1000版においては、カーネルのソースコードディレクトリが2つ存在することです。

1つ目は、純正のカーネルソースコードディレクトリである「..\kernel」。

2つ目は、ML62Q1000専用の「..\kernel_u8dev」です。

なんで分かれているのか?

それは、ML62Q1000版で使用されることを想定しているコンパイラがいつものGCC系統ではなく、ラピステクノロジー社純正の「ccu8」だからです。

すなわち、GCC系統のコンパイラでビルドが通るように書かれた「..\kernel」以下のソースコードは、ラピステクノロジー社純正の「ccu8」コンパイラではビルドが通らなかったのです。

そこで「ccu8」コンパイラでもビルドが通るように「..\kernel」を書き換えたものが「..\kernel_u8dev」というわけです。

ヘッダファイルの格納ディレクトリである「..\include」と「..\include_u8dev」も同様の理由で分けています。

さて、例えば現在のカーネルにメッセージバッファの機能を加えるために、「..\extension\messagebuf」以下のソースコードやヘッダファイルを「..\kernel_u8dev」や「..\include_u8dev」に上書きすると仮定しましょう。

すると「..\extension」以下のソースコードやヘッダファイルは、GCC系統のコンパイラで通るように書かれているため、「ccu8」コンパイラではエラーが出ることが考えられます。

私が「ccu8」コンパイラ用の「..\extension_u8dev」といったものを用意すればいいだけの話ですが、そこまで手が回らず…すんません!

とはいえ、エラーが発生した場合に「ccu8」コンパイラで通るように修正するのは、それほど難しい作業ではありません。

ほとんどの場合、修正が必要なのはヘッダファイルであり、インラインの宣言の違いなど、C言語の方言にまつわる部分です。


この辺りは「..\kernel」と「..\kernel_u8dev」、および「..\include」と「..\include_u8dev」を比較して、それをヒントに移植してみてください。


ライセンスについて

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

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

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


さて、今回はラピステクノロジー社のML62Q1000マイコンを取り上げたわけですが、個人的には、大変気に入っております。

元々8ビットのアーキテクチャを16ビットに拡張した製品ではあるのですが、それが無理なくスマートに実現されており、命令系統も洗練されています。

コンパイラやデバッガも、純正品独特のクセはあるものの質実剛健といった印象で、好感が持てます。

それに加えてノイズに強くて低消費電力という売りを考えると、もう少し広く普及しても良いのでは?と思います。

TOPPERS/ASPに続いて、FreeRTOSも移植してみたいと思いました。

ML62Q1000マイコン、どうぞ機会があれば採用を検討してみてくださいね。


<終わり>

Simplicity Studioを使ってみた! その1

「Simplicity Studio」のインストール 急遽、 Silicon Labs 社のマイコンを使用することになり、その統合開発環境「 Simplicity Studio 」をインストールしました。 手順が多く結構ハマったので、その備忘録です。 まずは、インストーラーのダウ...