2023年2月23日木曜日

TOPPERS/ASP - ML62Q1000版 その4

前回からの続きです。

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


プロジェクトの作成

ML62Q1000マイコン用の開発環境の構築が完了していれば、統合開発環境(IDE)もインストール済みのはずです。

ラピステクノロジー社のIDEは「LEXIDE-U16」といいます。

このプログラムの場所は、これまで記事の記述通りに作業していただいた場合は、以下のパスに配置されています。

なので、これをダブルクリックでIDEが起動します。


C:\U8Dev\eclipse\lexideu16.exe


すると、以下のようなスプラッシュスクリーンが現れます。

あらやだカッコいい!

「LEXIDE-U16」スプラッシュスクリーン


しばらくして以下のポップアップが表示されます。

ワークスペースの場所を問われているのですが、特に理由がない限り、そのままで「Launch」ボタンをクリックしましょう。

「Eclipse  Launcher」ポップアップ


ここで気付かれた方も多い(てゆうか、配置されているディレクトリの名前でバレバレ)と思いますが、この「LEXIDE-U16」、Eclipseベースですね!

しばらくすると、まっさらな状態のIDEが立ち上がります。

「LEXIDE-U16」 - 1


さて、前回「Cygwin」のターミナルで行っていたTOPPERS/ASPのビルド作業をこのIDE上で行えるようにプロジェクトを作っていきましょう。

まずは「LEXIDE-U16」上部の「File」メニューから「New」をクリックし、「Makefile Project with Existing Code」をクリックします。

「LEXIDE-U16」 - 2


「New Project」ダイアログが表示されます。

ここでは、各項目を以下の通りに入力、設定し、ダイアログ右下の「Finish」をクリックします。


Project Name:<任意のプロジェクト名(ここでは「asp_1.9.2」)>

Existing Code Location:C:\cygwin64\home\<ユーザ名>\asp_1.9.2

Toolchain for Indexer Settings:<none>

「New Project」ダイアログ


「LEXIDE-U16」の画面左側の「Project Explorer」タブに<プロジェクト名>のディレクトリが表示され、その下に「asp_1.9.2」以下のディレクトリ構造が表示されていることを確認します。

「LEXIDE-U16」 - 3


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

「LEXIDE-U16」から「asp_1.9.2」プロジェクトをビルド/クリーンします。

「LEXIDE-U16」の画面右側の「Outline」タブを「Build Target」タブに切り替えます。

「LEXIDE-U16」 - 4


すると、「Project Explorer」タブと同じように「Build Target」タブに「asp_1.9.2」ディレクトリ構造が表示されます。

このツリーリストから「OBJ」を選択し、「New Build Target」ボタン(ツリーリスト上方の◎と+が合わさったようなアイコン)をクリックします。

「LEXIDE-U16」 - 5


「Create Build Target」ダイアログが表示されます。

まずは、プロジェクトのクリーンを行うMakeターゲットを作成します。

ここでは、各項目を以下の通りに入力し、ダイアログ下方の「OK」をクリックします。


ターゲット名:realclean

「Create Build Target」ダイアログ - 1


すると、「Build Target」タブのツリーリストの「OBJ」ディレクトリ以下に「realclean」が追加されます。

次は、これをダブルクリックします。

「LEXIDE-U16」 - 6


「LEXIDE-U16」の画面下方の「Console」タブには、プロジェクトのクリーンが行われたことを示す表示が現れます。

これは、Cygwin上で「OBJ」ディレクトリの中で「$ make realclean」を実行したのと同じ動作をしたことを意味します。

「LEXIDE-U16」 - 7


同じ要領で、「depend」と「all」のMakeターゲットも作成します。


ターゲット名:all

ターゲット名:depend

「LEXIDE-U16」 - 8


今後「OBJ」プロジェクトをビルドするときは「depend」、「all」の順に、クリーンするときは「realclean」のMakeターゲットをダブルクリックすれば良いことになります。


さて、もう一仕事!

今までと同じ要領で、もう一個Makeターゲットを作成してください。

まず「Create Build Target」ダイアログを開いたら「Target name」に「_debug」と入力してください。

頭のアンダーバーがポイント!

「Create Build Target」ダイアログ - 2


次に、今入力したテキストボックスの直ぐ下、「Same as the target name」のチェックボックスをクリックして、チェックを解除します。

「Create Build Target」ダイアログ - 3


Same as the target name」のチェックボックスを解除すると、その下の「Build target」テキストボックスが入力可能となります。

ここには「_debug」と入力されていますが、これの頭のアンダーバーを取って、ただの「debug」に変更しましょう。

その後、ダイアログ下方の「OK」をクリックします。

「Create Build Target」ダイアログ - 4


すると、「Build Target」タブのツリーリストの「OBJ」ディレクトリ以下に他のものより一番上に「_debug」が追加されます。

「LEXIDE-U16」 - 9


なぜ、「debug」のMakeターゲット名の頭にアンダーバーを付けたのか?

これは、ビルドやクリーンじゃなくてデバッガを起動するためのランチャーです。

実際のデバッガの起動方法や使い方は後ほど説明しますが、「_debug」ではなく「debug」という名前にしてしまうと、「Build Target」タブにおいて、すでに存在しているMakeターゲットの「depend」の直ぐ上に「debug」が表示(アルファベット順でソートされるから)されてしまい、これがかなりミスを誘うからです。

そんなのミスるのはオマエだけやろ!

…と思われる方は、そのまま「debug」でも別に良いですが、「depend」しようと思って、うっかり「debug」をダブルクリックしてしまい、デバッガの起動を待たされた上に「プログラムが無い」などとエラー表示されるのは相当イラッとくるので、このやり方をオススメしますよ~。


今回の作業はここまで!

次回は、いよいよ実機でプログラムを動かしましょう!!


<続く>

2023年2月16日木曜日

EPSON「S1C17W36 Eval Board」とデバッガ

新しいオモチャを買いました。

EPSONの16Bitマイコン「S1C17W36」の評価ボードと、そのデバッガ「S5U1C17001H3100」です。

「S1C17W36 Eval Board」とデバッガ


このマイコンは、液晶パネルを直接駆動できる最大2048ドット表示のLCDドライバーを内蔵していることが特徴で「多機能デジタル時計向け」なのだそうです。

うわ~、なんてニッチな!!

もっとも、EPSONは時計で有名なセイコーグループの一社ですから「多機能デジタル時計向け」というのは王道ですけどね!

もちろん、各種シリアルインターフェースやAD変換などの一般的なペリフェラル❨周辺機器❩も搭載しており、汎用マイコンとしても十分に使える製品となっております。

何かこう…センサーからの値を常にLCDに表示しながら他の機器へデータを飛ばすような、凝ったIoTデバイスなどが作れそうです。


失礼ながら、それほどメジャーとは言えませんが、EPSONは古くから4,8bitマイコンをリリースしていた老舗ベンダーです。

現在は32bitマイコンなども販売しておりますが、悲しいことに(?)独自コアではなくARMコアです。

しかし、4,8bitマイコンを使用していた既存の顧客が自社製品をアップグレードする際に、元々低コスト要求が強い製品に対して32bitマイコンでは大きすぎる…といった声から生まれたのが、間を取ったこの16bitの「S1C17Family」なのだそうです。


EPSONのマイコンに関しては、こちらのページに概要が記載されています。

この中で、私が好きな記述が以下の通り…。


開発秘話

エプソンの16bitマイコンは「S1C17 Family」という名称でラインアップしています。16bitマイコンなら「S1C16 Family」では?と良く尋ねられます。

その理由は、以下のどれだと思いますか。


1.単なる16bit マイコンではなく+1歩先を行く思いを込めた。

2.C16 名称は他社でも多いから 。

3.前身の製品4bit(S1C63)、32bit(S1C33)*3 という奇数型番のヒットにあやかった。

4.設計者の好きな曲中の登場人物が17歳だった。


実は...全て正解です。

こうして多くの思いを込めた「S1C17 Family」は2007年にリリースされました。


…なんか、中の人の息遣いが感じられていいですよね!

「S1C17Family」好きになっちゃった。


さて、例の如くこのマイコンにもTOPPERS/ASPを移植したいと思っています。

FreeRTOSなどの移植も面白いかもしれません。

今までこのブログで公開してきたカーネルは、仕事で使おうとしてボツになってしまったものばかりでしたが、「S1C17 Family」に関しては純粋に趣味のものとなるでしょう。

(他社の友人からのリクエストもありましたが。)

ここで公開するためにストックしているTOPPERS/ASPカーネルも残り少なくなってきましたしね…。

それに、私はARM以外のマイコンが大好きです!

…あ~ぁ言っちゃった。


暇を見つけて、コツコツとやっていきますよ~。

2023年2月14日火曜日

TOPPERS/ASP - AVR32版 目次

不幸だけど使いやすいマイコンAVR32!

以下AVR32版に関する記事の目次です。


■TOPPERS/ASP - AVR32版 その1

TOPPERS/ASP - AVR32版 概要

必要なもの

ダウンロード/GitHub


■TOPPERS/ASP - AVR32版 その2

開発環境の構築(Microchip Studio編)

開発環境の構築(Eclipse編)


■TOPPERS/ASP - AVR32版 その3

Atmel Software Framework (ASF)とは?

雛形プロジェクトの作成


■TOPPERS/ASP - AVR32版 その4

Atmel Software Framework (ASF)のコピー

ヘッダーファイルのコピー

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

リンカスクリプト「at32uc3a3_xpld.ld」のコピーと修正

クロック設定の変更

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


■TOPPERS/ASP - AVR32版 その5

プロジェクトの作成

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

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


■TOPPERS/ASP - AVR32版 その6

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

AVR32版カーネルについて

ライセンスについて



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

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

モノがモノだけに、多分悲惨なアクセス数になりそう…。

実際、一連のAVR32関連の記事は海外からの閲覧がほとんどでしたしね~。

日本以外でも「μITRON」って使われているのかしら?

よろしければ参考にしてください。

Qiita

TOPPERS/ASP - AVR32版 - Qiita

2023年2月11日土曜日

TOPPERS/ASP - ML62Q1000版 その3

前回からの続きです。

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


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

ここで言う「サンプルドライバ」とは、いわゆるラピステクノロジー社純正のライブラリパッケージであり、これを使用するとCPUに内蔵されているペリフェラル(周辺機器)を簡単に利用することができるというものです。

今回の「TOPPERS/ASP ML62Q1000版」のカーネル内でも、割り込み、タイマーやシリアル通信ドライバなどは、このサンプルドライバを使用しています。

ところが、このサンプルドライバのソースコードのライセンスが原則公開禁止であるために再配布できません。

そのため「TOPPERS/ASP ML62Q1000版」のソースコードが不完全なものとなり、そのままではビルドが通らず、通すためには手動で不足分のソースコードをコピーしていただくという手間を強いることになってしまいました。

お手数をおかけして申し訳ない…。

では、そのサンプルドライバのソースコードを何処から入手すれば良いのか?

もう一度、ML62Q1000マイコンスタータキット「SK-BS01-D62Q1577TB」に同梱されているDVD-ROMのトップディレクトリから「ML62Q1000_MCU_StarterKit」というディレクトリをダブルクリックします。

すると、以下のようなディレクトリになってると思います。

更に「MCU_SampleProgram_v200.zip」という圧縮ファイルをパソコンの何処へでも良いのでコピーします。

同梱されているDVD-ROMの「ML62Q1000_MCU_StarterKit」ディレクトリ

コピーした「MCU_SampleProgram_v200.zip」を解凍すると、以下のようなディレクトリが展開されます。

この中の「Software_LEXIDE」ディレクトリをダブルクリックします。

解凍された「MCU_SampleProgram_v200.zip」のディレクトリ


移動したディレクトリの中の「driver」ディレクトリ、この中にサンプルドライバのソースコードがギッシリ入っています!

「Software_LEXIDE」ディレクトリ


この「driver」ディレクトリをTOPPERS/ASPのソースツリーの以下に示すのパスの直下に丸ごとコピーしましょう。

「asp_ml62q1000_u8dev」や「asp_ml62q1000_u8dev_master」を「asp_1.9.2」に改名した場合。


C:\cygwin64\home\morita\asp_1.9.2\arch\xn_u16_100_u8dev

「driver」ディレクトリをコピー


これで、サンプルドライバのコピーは完了です。

ここまでは簡単ですが、面倒なのはこの次…。


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

ターゲットに電源が入った後、いの一番に実行されるアセンブラのソースコード「start.asm」を作成します。

一から書くのは大変なので、既に用意されているものをベースに作成しましょう。

元となるソースコードは、「ML621577.ASM」という名前で以下のパスに配置されています。

ターゲットCPUの型番が名前になってます。

似たような型番があるので間違えないようにしてください。


C:\U8Dev\Startup\Src

スタートアップ格納ディレクトリ


この「ML621577.ASM」を以下のディレクトリにコピーします。


C:\cygwin64\home\morita\asp_1.9.2\target\rb_d62q1577tb100_u8dev

「ML621577.ASM」をコピー


ついでに、今コピーした「ML621577.ASM」を「start.asm」に改名しておきましょう。

「start.asm」へ改名


続きまして、改名した「start.asm」をテキストエディターなどで開き、以下の部分を修正します。

元の「ML621577.ASM」で言うところの14行目付近からの…

  1. ...
  2.         model large
  3.         romwindow 0, 0afffh
  4.         extrn code: _main
  5.         extrn data near: _$$SP
  6.         public $$start_up
  7. ...

…という部分を以下のように修正します。

  1. ...
  2.         model large
  3.         romwindow 0, 0afffh
  4.         ;extrn code: _main ; コメントアウト!
  5.         extrn code: _sta_ker ; 追記!
  6.         extrn data near: _$$SP
  7.         public $$start_up
  8. ...


アセンブラソースにおいて「;」はコメントを意味します。

これは、普通のファームウェアが「main()」関数から始まるのに対し、TOPPERS/ASPカーネルを使用する場合は「sta_ker()」という関数から始まるため、このファイルの外にある「sta_ker()」関数を使用するための宣言です。

実際に「sta_ker()」関数へジャンプする部分は、この後実装します。


さて、次の修正です。

21行目付近からの…

  1. ...
  2.         cseg at 0:0h
  3.         dw offset _$$SP
  4.         cseg at 0:4h
  5.         dw $$brk_reset
  6. ...


…という部分を以下のように修正します。

  1. ...
  2.         cseg at 0:0h
  3.         dw offset _$$SP
  4.         cseg at 0:2h ; 追記!
  5.         dw $$NCODml621577lw ; 追記!
  6.         cseg at 0:4h
  7.         dw $$brk_reset
  8. ...


これは、外部リセットの際のベクタを追加しています。

これを省くと、デバッガが使えなくなっちゃうので要注意です。


さてさて、お次は…。

204行目付近からの…

  1. ...
  2. ;---------------------------------------------------------------
  3. ; far jump to main routine
  4. ;---------------------------------------------------------------
  5.         b _main
  6. ...


…という部分を以下のように修正します。

  1. ...
  2. ;---------------------------------------------------------------
  3. ; far jump to main routine
  4. ;---------------------------------------------------------------
  5.         ;b _main ; コメントアウト!
  6.         b _sta_ker ; 追記!
  7. ...

これが前述した「main()」関数の代わりに、実際に「sta_ker()」関数へジャンプする部分となります。


更に更に…。

250行目付近からの…

  1. ...
  2.         cseg #03 at 0ffd0h ; address
  3.         dw 0fffdh ; 0ffd0h
  4. ...

…という部分を以下のように修正します。

  1. ...
  2.         cseg #03 at 0ffd0h ; address
  3.         ;dw 0fffdh ; コメントアウト!
  4.                                     ; 0ffd0h
  5.         dw 0fff8h ; 追記!
  6.                                     ; コードオプション0(CODEOP0)に該当する.
  7.                                     ; ウォッチドッグ関連ビット(WDTNMCK,WDTSPMD,WDTMD)を全て0に設定する.
  8.                                     ; ウォッチドッグを使用する場合は適切な値に設定すること.
  9. ...


これはアドレス「0ffd0h」という場所に「0fffdh」という値に替えて「0fff8h」という値を配置しています。

プログラムメモリ空間の「0ffd0h」というアドレスは「CODEOP0」というコードオプション領域に該当します。

コードオプションというのは、リセットが掛かるとマイコンが自動的に読みに来るパラメーターのことであり、CPUの動作モードやウォッチドッグなどの基本的な設定を書いておく領域のことです。

上記の例では、このコードオプション「CODEOP0」に対し、ウォッチドッグ機能を無効化するように設定しています。

こうしておけばリセット後のマイコンは、ウォッチドッグ機能が無効化された状態で動作を開始するようになります。


コードオプションの設定はもう一箇所!

「CODEOP0」のすぐ下、253行面付近からの…

  1. ...
  2.         cseg #03 at 0ffd2h ; address
  3.         dw 0ffffh ; 0ffd2h
  4. ...


…という部分を以下のように修正します。

  1. ...
  2.         cseg #03 at 0ffd2h ; address
  3.         ;dw 0ffffh ; コメントアウト!
  4.                                     ; 0ffd2h
  5.         dw 0fffdh ; 追記!
  6.                                     ; コードオプション1(CODEOP1)に該当する.
  7.                                     ; CPUの動作モードを「ウェイトモード」に設定する
  8. ...


これはアドレス「0ffd2h」という場所に「0ffffh」という値に替えて「0fffdh」という値を配置しています。

プログラムメモリ空間の「0ffd2h」というアドレスは「CODEOP1」というコードオプション領域に該当します。

上記の例では、このコードオプション「CODEOP1」に対し、CPUの動作モードを「ウェイトモード」に設定しています。

ML62Q1000マイコンには「ノーウェイトモード」と「ウェイトモード」の二種類があります。

前者が初期値です。

二つのモードの違いは、マイコンのデータシートを熟読していただく必要がありますが、今回は「ウェイトモード」を使用することとします。


以上で「start.asm」の修正は終わりです。

修正が終わったら、忘れずに「start.asm」を保存してください。


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

さて、これで全ての準備は整いました。

お疲れ様でした~!!

早速ビルドしてみましょう。

Cygwinを開いて、TOPPERS/ASPソースツリーの場所まで移動しましょう。


$ cd asp_1.9.2/


次にその直下の「OBJ」ディレクトリに移動します。


$ cd OBJ/


コンフィギュレーターのパーミッションを実行可能に設定します。


$ chmod 755 ../cfg/cfg/cfg.exe


ラピステクノロジー社のアセンブラである「rasu8」が出力した「.prn」ファイルから依存するファイルを書き出す「makedepu8.exe」という自作ユーティリティのパーミッションを実行可能に設定します。


$ chmod 755 ../arch/xn_u16_100_u8dev/utils/makedepu8.exe


ラピステクノロジー社のリンカである「rlu8」が出力した「.map」ファイルからシンボル情報ファイル「.syms」を生成する「nmu8.exe」という自作ユーティリティのパーミッションを実行可能に設定します。


$ chmod 755 ../arch/xn_u16_100_u8dev/utils/nmu8.exe


自作ユーティリティの「makedepu8.exe」も「nmu8.exe」も、ラピステクノロジー社のアセンブラやリンカが更新されて出力形式が変わってしまえば、正常に動かなくなるかもしれません。

可能性は低いですが、その際に修正できるように、それぞれのソースコードも「exe」と同じディレクトリに置いておきますね。

その場合は「../arch/xn_u16_100_u8dev/utils/」ディレクトリに移動して、以下のようなコマンドを打てば、コンパイルできます。

「makedepu8.exe」を作る場合は…


$ gcc -o makedepu8.exe makedepu8.c


「nmu8.exe」を作る場合は…


$ gcc -o nmu8.exe nmu8.c


さて、話を戻して…。

ここまで、大丈夫ですか?

Cygwinターミナル - 1

そうしたら、プロジェクトのコンフィグファイル(sample1.cfg)の情報を元に、OSに必要な定義を記したソースコード(「kernel_cfg.c」と「kernel_cfg.h」)を生成します。


$ make depend


以下のような表示にならずエラーが出力される場合は、残念ながらこれまでの作業に誤りがあります。

お手数ですが、最初からご確認を!

Cygwinターミナル - 2


ここまで上手くいったら、ホンチャンのビルド。

以下のコマンドを実行します。


$ make all


以下のように無事にビルドが通ったでしょうか?

Cygwinターミナル - 3


本日はここまで!

とても煩雑な作業でしたが、お疲れ様でした。

コマンドラインではビルドが通るようになりましたので、次回はラピステクノロジー社純正のIDE(統合開発環境)「LEXIDE-U16」で開発できるようにプロジェクトを作りましょう。


<続く>

2023年2月6日月曜日

TOPPERS/ASP - ML62Q1000版 その2

前回からの続きです。


開発環境の構築

早速、開発環境を構築していきます。

ML62Q1000マイコンスタータキット「SK-BS01-D62Q1577TB」に同梱されているDVD-ROMをパソコンに挿入しましょう。

DVD-ROMは、以下のようなトップディレクトリになっていると思います。

以下の「ML62Q1000_MCU_StarterKit」というディレクトリをダブルクリックします。

同梱されているDVD-ROMのトップディレクトリ


次に「U8DevTool_R2_2_0.zip」という圧縮ファイルをパソコンの何処へでも良いのでコピーします。

※ファイル名は開発環境のバージョンによって異なる可能性があります。

同梱されているDVD-ROMの「ML62Q1000_MCU_StarterKit」ディレクトリ


コピーした「U8DevTool_R2_2_0.zip」を解凍すると、以下のようなディレクトリが展開されます。

この中の「Setup」ディレクトリをダブルクリックします。

解凍された「U8DevTool_R2_2_0.zip」のディレクトリ


移動したディレクトリの中の「U8DevInstaller.exe」ファイルをダブルクリックします。

コイツがML62Q1000マイコン開発環境のインストーラーです。

ML62Q1000マイコン開発環境のインストーラー


しばらくすると以下のようにインストーラーが開始されます。

ここは「次へ」ボタンをクリックしましょう。

インストーラー - 1


お約束の使用許諾への同意の作業。

使用許諾契約の条項に同意します」のラジオボタンを選択してから「次へ」ボタンをクリックです。

インストーラー - 2


開発環境のインストール先の設定です。

特に理由がなければ、このままで行きましょう!

次へ」ボタンをクリック。

インストーラー - 3


セットアップの種類を聞かれます。

特に理由がなければ「標準」という表示をクリックしてください。

インストーラー - 4


インストール作業が始まりました!

思いの外時間がかかりますが、気長に待ちましょう。

インストーラー - 5


インストール作業中に以下のようなポップアップが表示されます。

2回位だったかな…?

おそらく、デバッガーか何かのデバイスドライバのインストールを許可してくれ~!って言ってます。

いずれも「インストール」ボタンをクリックです。

「Windowsセキュリティ」ポップアップ


インストーラーが以下の表示になったら、ML62Q1000マイコン開発環境のインストールは終了です。

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

インストーラー - 6


さて、インストールしたML62Q1000マイコン開発環境の環境変数の設定を行います。

開発環境は、インストーラーにより以下のディレクトリにセットアップされているはずです。


C:\U8Dev

「U8Dev」ディレクトリ


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

ただし、パスは…


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


…となっていて、1つだけ設定していますが、今回はそれに代えて以下の2つを設定するようにします。

※特に2つ目のパスは開発環境のバージョンによって異なる可能性があります。


C:\U8Dev\Bin

C:\U8Dev\BuildTools\V2_02_00\Bin


こんな感じ…。

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


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


> ccu8

コマンドプロンプト


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

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


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

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

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

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


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

Cygwinターミナル


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


さて、開発環境をインストールして、ソースコードもダウンロードしました。

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

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

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

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


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

次回は、現状のソースコードに足らないものを色々コピーしたり、修正したりする作業を行っていきます。

複雑で面倒な作業ですが、手順通りにやっていただければ大丈夫です!


<続く>

2023年2月1日水曜日

TOPPERS/ASP - AVR32版 その6

前回からの続きです。

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


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

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

AVR32


AVR32版カーネルについて

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


●割り込み優先度

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

マイコンというのは、割り込みが起こるとアプリケーションで使っていたレジスタの値をスタックという専用のメモリへ退避させます。

更に割り込み処理が終わると、処理がアプリケーションへ戻る前にスタックへ退避させた値をレジスタに復帰させなければなりません。

したがって、これらの一時退避するレジスタの数が多いと処理自体がオーバーヘッドになり、反応性が悪くなります。

レジスタの退避と復帰は、割り込みルーチンの冒頭と終盤一命令ずつ書いていかなきゃならない(仮に一時退避するレジスタの数が8個なら、退避と復帰で計16ステップ必要)からです。

そういうマイコンが多数派ですが、AVR32(正確には「AVR32 UC3」)の場合はレジスタの一時退避をハードウェアで自動的にやってくれます。

ハードウェアによる一時退避の処理は非常に速いため、このことは割り込みの反応性を大きく向上させます。

つまり、割り込みを多用するアプリケーションの性能が良いということです。

大変優れたアーキテクチャです!


●例外ハンドラ

例外ハンドラとしては「..\target\at32uc3a3_xpld_gcc\target_vector.S」の冒頭のコメントに記されたものを使用することができます。

番号は飛び飛びになっちゃっているのは注意です。

特に20番以降はヒドイ…。

  1. ...
  2. /*
  3.  *        ターゲット依存ベクターテーブル(AT32UC3A3-XPLD用)
  4.  */
  5. #include <avr32/io.h>
  6. /*
  7.  * CPU例外番号
  8.  *
  9.  *
  10.  * 0 - Unrecoverable exception
  11.  * 1 - TLB multiple hit
  12.  * 2 - Bus error data fetch
  13.  * 3 - Bus error instruction fetch
  14.  * 4 - NMI
  15.  * 5 - Instruction Address
  16.  * 6 - ITLB Protection
  17.  * 7 - Breakpoint
  18.  * 8 - Illegal Opcode
  19.  * 9 - Unimplemented instruction
  20.  * 10 - Privilege violation
  21.  * 12 - Coprocessor absent
  22.  * 13 - Data Address (Read)
  23.  * 14 - Data Address (Write)
  24.  * 15 - DTLB Protection (Read)
  25.  * 16 - DTLB Protection (Write)
  26.  * 20 - ITLB Miss
  27.  * 24 - DTLB Miss (Read)
  28.  * 28 - DTLB Miss (Write)
  29.  * 64 - Supervisor call
  30.  */
  31. ...


例外ハンドラの動作は、サンプルプログラムで確認できます。

サンプルプログラム実行中に「z」か「Z」をターミナルで入力すると、CPU例外番号「14」のData Address (Write)」が引き起こされる仕掛けになっています。

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

  1. ...
  2. #define CPUEXC1                14        /* Data Address (Write) */
  3. #define RAISE_CPU_EXCEPTION *(volatile int*)(0x1) = 0x11;
  4. ...


すなわち「CPUEXC1」に「14(Data Address (Write))」を定義し、サンプルプログラムから「RAISE_CPU_EXCEPTION」というマクロを呼び出すと「*(volatile int*)(0x1) = 0x11」という非常に行儀の悪いコードが実行されるようになっています。

(「0x1」という奇数番地を32ビットのポインターのアドレスとして扱い、更に、それに対して値を書き込んでいる!)

このイタズラにより、データを書き込むメモリのアドレスのアラインメントの不正が検出され、その名の通りの「14(Data Address (Write))」CPU例外が引き起こされます。

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

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


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

割り込みIDを指定して、これを有効/無効化するための「ena_int()」と「dis_int()」サービスコールはサポートしていません。

これはAVR32に搭載されている割り込みコントローラーがシンプルな設計であり、割り込み要因ごとに有効/無効化するためのフラグを設けていないためです。

どうしても一時的に割り込みを有効/無効化したい場合は、各ペリフェラルのレジスタを設定するか、CPU全体の割り込みを一括で設定しても良いのであれば、以下のような関数を呼び出すことで代用してください。

なお、以下の関数を使用するためには、これを使用するソースに「#include <avr32/io.h>」を一行加えてあげてください。

  1. Disable_global_interrupt(); /* すべての割込みの禁止 */
  2. Enable_global_interrupt();  /* すべての割込みの許可 */


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


ライセンスについて

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

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

万が一、このカーネルを商用利用する方は、このリンク先の条項に従ってください…って、いらっしゃる訳ないですよね。

シリーズ自体がディスコンですから!


さて、絶滅危惧っていうか、ほぼ絶滅したアーキテクチャであるAVR32を取り上げてみました。

OS書き易かったし、良いマイコンなんだけどなぁ…。

強そうな「AVR32ロボ」(?)

でも市場で負けちゃった…。

(頭の形状から「おやおやおや…」とか言いそう。)

AVR32ロボ


この可哀想なAVR32、TOPPERSカーネルもしばらくは頑張ってメンテナンスしていきますので、市場にある内にどうか使ってやって下さい!


<終わり>

TOPPERS/ASP - Arduino UNO R4版 その7

前回からの続き です。 このテーマを最初からご覧になる場合は こちら からどうぞ。 プログラムの転送とデバッグ ターゲットの「Arduino UNO R4」とデバッガの「E2 emulator Lite」を 前々回 作成したケーブルで接続します。 こんな感じ。 これからTOPPE...