ラベル TOPPERS/ASP(AVR32版) の投稿を表示しています。 すべての投稿を表示
ラベル TOPPERS/ASP(AVR32版) の投稿を表示しています。 すべての投稿を表示

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月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カーネルもしばらくは頑張ってメンテナンスしていきますので、市場にある内にどうか使ってやって下さい!


<終わり>

2023年1月19日木曜日

TOPPERS/ASP - AVR32版 その5

前回からの続きです。

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


プロジェクトの作成

この「TOPPERS/ASP AVR32版」では、2つのIDE(統合開発環境)を使用する方針です。

すなわち、コードを編集してそれをビルドする時に使う「Eclipse」と、ターゲットへプログラムの書き込みを行い、それをデバッグするための「Microchip Studio」です。

したがって、それぞれの様式に沿った2つのプロジェクトを作成しなければなりません。

では、なぜ2つ使うのか?

Microsoftの「Visual Studio」ベースの「Microchip Studio」が、コーディングをする上で重すぎて使い難いからです。

とはいえ、デバッガの「Atmel-ICE」を使用するためには、どうしても「Microchip Studio」が必要というジレンマ…。

あくまで個人的な好みなので、このあたりの使い分けは自由に選択してください。


とにもかくにも、まずは「Eclipse」のプロジェクトを作りましょう。

これに関しては、以前このブログに記載した「TOPPERS/ASP Arduino MEGA2560版」の記事が参考になります。

8Bitか32Bitかの違いはありますが、同じAVRマイコンですからね。

作業内容は同じです。

このページ(TOPPERS/ASP - Arduino Mega2560版 その4)の「プロジェクトの作成(Eclipse編)」の項目を参考にしてください。

同様に「Microchip Studio」のプロジェクトもこのページ(TOPPERS/ASP - Arduino Mega2560版 その4)の「プロジェクトの作成(Microchip Studio編)」の項目を参考にしてください。


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

デバッガの「Atmel-ICE」とターゲットの「AT32UC3A3-XPLD」の間で、こんな感じの配線をします。

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


「Atmel-ICE」には2種類のケーブルが同梱されているはずです。

今回使用するのは、10ピンがバラバラに出てるやつです。

それをこのように配線しなければなりません。

表がこう。

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


裏はこんな感じ。

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


信号の対応表は以下の通り。

まずは、「Atmel-ICE」側は以下の通り。

今回使うのはAVRポートの方ですよ!

信号表(デバッガ側)


次に「AT32UC3A3-XPLD」側は以下の通りです。

信号表(ターゲット側)


結果、バラバラ10ピンケーブルの方は、7番と8番はノンコネクトで大丈夫です。


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

これからTOPPERS/ASPのサンプルプログラムを動かす際には、動作確認のためにどうしてもシリアルポートが必要です。

そこで、以下のような市販のUSB/シリアル通信変換ケーブルを用意します。

市販のUSB/シリアル通信変換ケーブル


シリアル通信をするために必要なポートは、RXDとTXDとGNDの三本ですね。

ターゲット基板上の「J4」ヘッダから取りましょう。

「J4」ヘッダの位置


以下の赤い四角で囲った端子を使いましょう。

信号表(「J4」ヘッダ)


評価ボードからこうやってGNDRXDTXDと、それぞれの線を出してやって…

ターゲット側の配線


USB/シリアル通信変換ケーブル側の配線は、上からTXDRXDGNDの順番でこんな感じ。

これでシリアルポートが使えるようになりました。

USB/シリアル通信変換ケーブル側の配線


続いて、このUSB/シリアル通信変換ケーブルをパソコンに繋いでみましょう。

パソコン上でデバイスマネージャーを開きます。

ポート(COMとLPT)のサブカテゴリーとして「USB Serial Port」というポートが追加されているはずです。

(私のパソコンでは、「COM15」として認識されていますね。)

このポート番号、覚えておいて下さい。

デバイスマネージャー


ここで、デバッガとパソコン、そしてターゲットとパソコンをそれぞれUSBケーブルで繋げちゃいましょ。

面倒なことに、2種類のUSBケーブルが必要です。

デバッガは「Micro-B」、ターゲットは「Mini-B」と、似ているようで違うので要注意です。

ご覧の通り、通電します。

デバッガ、ターゲットとパソコンの接続


次に「TeraTerm」をご用意ください。

インストールしていない方は、このページ(TOPPERS/ASPのビルドからデバッグまで~サンプルプロジェクトのデバッグ)の「TeraTermの導入」の項目を参考にしてください。

もちろん、シリアル通信のターミナルであれば、他のものもお使いいただけます。

今回のTOPPERS/ASPのサンプルプログラムは、シリアル通信のメッセージを出力しますので、先程「USB Serial Port」として認識されたシリアルポート番号でターミナルを立ち上げておきましょう。

設定は、こんな感じです。

ボーレートは「9600」です。

(私のパソコンは、USB/シリアル通信変換ケーブルをCOM15として認識していました。)

TeraTerm - シリアルポートの設定


さて、「Microchip Studio」に戻りましょう。

「Microchip Studio」でプロジェクトを作成した状況から始めます。

以下の画面が表示されたら、上部にある「AT32UC3A3256」というタブをクリックしてください。

「Microchip Studio」 - 1


すると、以下の表示に切り替わりますので、すかさず左のリストから「Tool」をクリックしてください。

「Microchip Studio」 - 2


以下のような画面に切り替わります。

Selected debugger/programmer」のコンボボックスに接続中の「Atmel-ICE」がID番号付きで表示されていますか?

(「J41800113804」というIDは私のですね。)

表示されていない場合は、コンボボックスをクリックして、あなたの「Atmel-ICE」(「J41800113804」以外のもの)を選択してください。

加えて「Interface」は「JTAG」のままで結構です。

(ていうか、それ以外選べないはず。)

「Microchip Studio」 - 3


この設定を保存しましょう。

画面上部の保存アイコンをクリックしてください。

「Microchip Studio」 - 4


次に、プログラムのビルドと実行を行います。

画面上部の「」ボタンをクリックします。

「Microchip Studio」 - 5


しばらくすると、立ち上げておいたターミナルに以下のような表示が出ていると思います。

TOPPERS/ASPカーネルとそのサンプルプログラムの転送と実行に成功です。

TeraTermの表示


ブレークポイントを試してみましょう。

動作中のプログラムを停止します。

画面上部の「」ボタンをクリックします。

「Microchip Studio」 - 6


ブレークポイントを仕掛けましょう。

画面右の「Solution Explorer」のソースコードリストの中から「sample1.c」をダブルクリックし、ソースコードを表示します。

このソースコードの丁度中盤くらい、メインタスクの始めに仕掛けましょうか。

ブレークポイントは、ソースコードビューの左端をクリックすると赤丸が表示され、セットされていることを表します。

仮に、これを再びクリックするとブレークポイントが解除され赤丸も消えます。

「Microchip Studio」 - 7


では、ブレークポイントを仕掛けた状態で、プログラムを再び実行してみます。

上手く引っかかってくれるでしょうか…。

「Microchip Studio」 - 8


以下のようにプログラムが停止すれば成功です!

ここからは、「F10」キーでステップオーバー、「F11」キーでステップインなど、おなじみの操作が使用できます。

因みに、ステップオーバーやステップインなどを行っている時に命令が飛んでしまったり前後したりする場合は、最適化のせいです。

デバッグ時は、このページ(TOPPERS/ASPのビルドからデバッグまで~サンプルプロジェクトのデバッグ)の「サンプルプログラムのデバッグ」の項目を参考に最適化を解除しましょう。

「Microchip Studio」 - 9


ソースコードのコピーやら、複数のIDEの操作やら、AVR32版は少々複雑でしたね…。

お疲れ様でした!!

さて、次回はサンプルプログラムの動きの説明や、AVR32版カーネルの詳細な情報や注意事項などを書いていきます。


2023年1月12日木曜日

TOPPERS/ASP - AVR32版 その4

前回からの続きです。

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


Atmel Software Framework (ASF)のコピー

前回作成した雛形プロジェクトのディレクトリと、「TOPPERS/ASP AVR32版」のソースツリーのディレクトリを同時に2つエクスプローラーで開いておきましょう。

記事通りに作業すると、雛形プロジェクトは以下のディレクトリに保存されているはずです。


C:\Users\<ユーザー名>\Documents\Atmel Studio\7.0\GccBoardProject1

雛形プロジェクトのディレクトリ - 1


同じく、TOPPERS/ASPのソースツリーは以下のディレクトリに保存されているはずです。

「asp_avr32_gcc」や「asp_avr32_gcc_master」を「asp_1.9.2」に改名した場合。


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

TOPPERS/ASPソースツリーのディレクトリ - 1


さて、2つ開いたエクスプローラーでそれぞれ以下の場所を表示するようにします。

まず、雛形プロジェクトの方は、以下のディレクトリへ移動させます。


C:\Users\<ユーザー名>\Documents\Atmel Studio\7.0\GccBoardProject1\GccBoardProject1\src

雛形プロジェクトのディレクトリ - 2


次に、TOPPERS/ASPのソースツリーの方は、以下のディレクトリへ移動させます。


C:\cygwin64\home\<ユーザー名>\asp_1.9.2\target\at32uc3a3_xpld_gcc

TOPPERS/ASPソースツリーのディレクトリ - 2


雛形プロジェクトの方のディレクトリに注目!

以下の3つのディレクトリとヘッダーファイルを確認して下さい。


●ASF

●config

●asf.h

雛形プロジェクトのディレクトリ - 3


この3つを開いてあるもう一方のエクスプローラー、TOPPERS/ASPのソースツリーの方にコピーします。

結果、TOPPERS/ASPのソースツリーの方は、以下のようになりましたか?

TOPPERS/ASPソースツリーのディレクトリ - 3


これで、ASF関連のソースコードの回収は完了です。

雛形プロジェクトの方のエクスプローラーは閉じちゃって構いません。


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

TOPPERS/ASPをビルドするにあたり、AVR32の様々な定義を記述したヘッダーファイルが必要となります。

それを一から自分で書いていたら大変ですので「Microchip Studio」からいただいちゃいましょう。

新たに、以下のパスを表示するエクスプローラーを開きましょう。


C:\Program Files (x86)\Atmel\Studio\7.0\packs\atmel

ヘッダーファイルのディレクトリ - 1


次に、TOPPERS/ASPのソースツリーの方のエクスプローラは、以下のディレクトリへ移動させます。


C:\cygwin64\home\<ユーザー名>\asp_1.9.2\arch\avr32uc3_gcc

TOPPERS/ASPソースツリーのディレクトリ - 4


ヘッダーファイルの方のディレクトリに注目!

以下のディレクトリを確認して下さい。


●UC3A_DFP

ヘッダーファイルのディレクトリ - 2


このディレクトリを開いてあるもう一方のエクスプローラー、TOPPERS/ASPのソースツリーの方にコピーします。

結果、TOPPERS/ASPのソースツリーの方は、以下のようになりましたか?

TOPPERS/ASPソースツリーのディレクトリ - 5


ここで、コピーしたヘッダーファイルのバージョンを調べておきます。

TOPPERS/ASPのソースツリーの方のエクスプローラーでコピーした「UC3A_DFP」ディレクトリをダブルクリックしてください。

そこで新たに現れたディレクトリの名前がヘッダーファイルのバージョンを示します。

以下の例では「1.0.80」となっていますね?

TOPPERS/ASPソースツリーのディレクトリ - 6


このバージョンは「Microchip Studio」をインストールした時期によって異なります。

そのため、TOPPERS/ASPのMakefileに対し、このバージョン通りのディレクトリ名を教えてあげないといけません。

それを行うには、以下のディレクトリにある「Makefile.prc」を修正する必要があります。


C:\cygwin64\home\<ユーザー名>\asp_1.9.2\arch\avr32uc3_gcc

TOPPERS/ASPソースツリーのディレクトリ - 7


そこで「Makefile.prc」をテキストエディターなどで開き、以下の部分を修正します。

15行目付近からの…

  1. ...
  2. #
  3. # コンパイルオプション
  4. #
  5. INCLUDES := $(INCLUDES) \
  6.          -I$(SRCDIR)/arch/$(PRC)_$(TOOL)/UC3A_DFP/1.0.53/include/AT32UC3A3256
  7. COPTS := $(COPTS) -mpart=uc3a3256 -DBOARD=UC3_A3_XPLAINED -std=gnu99
  8. LDFLAGS := $(LDFLAGS)
  9. ...


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

  1. ...
  2. #
  3. # コンパイルオプション
  4. #
  5. INCLUDES := $(INCLUDES) \
  6.          -I$(SRCDIR)/arch/$(PRC)_$(TOOL)/UC3A_DFP/1.0.80/include/AT32UC3A3256
  7. COPTS := $(COPTS) -mpart=uc3a3256 -DBOARD=UC3_A3_XPLAINED -std=gnu99
  8. LDFLAGS := $(LDFLAGS)
  9. ...


おわかりいただけただろうか?

「INCLUDES :=」の定義の2行目において「1.0.53」などとなっている古いバージョンの表記を今回使用する「1.0.80」に修正しています。

もちろん、前述した方法でヘッダーファイルのバージョンを調べた結果「1.0.80」でなかった場合は、それに合わせたバージョン番号をディレクトリ名として修正すれば良いです。

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

これで、ヘッダーファイルの回収は完了です。

ヘッダーファイルの方のエクスプローラーは閉じちゃって構いません。


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

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

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

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


C:\cygwin64\home\<ユーザー名>\asp_1.9.2\target\at32uc3a3_xpld_gcc\ASF\avr32\utils\startup

TOPPERS/ASPソースツリーのディレクトリ - 8


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


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

TOPPERS/ASPソースツリーのディレクトリ - 9


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

TOPPERS/ASPソースツリーのディレクトリ - 10

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

59行目付近からの…

  1. ...
  2.   .global _stext
  3.   .type _stext, @function
  4. _stext:
  5.   // Set initial stack pointer.
  6.   lda.w sp, _estack
  7. ...


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

  1. ...
  2.   .global _stext
  3.   .type _stext, @function
  4. _stext:
  5.   // Set initial stack pointer.
  6.   //lda.w sp, _estack       // コメントアウト!
  7.   lda.w r0, _kernel_istkpt  // 追記!
  8.   ld.w sp, r0[0]            // 追記!
  9. ...


もう一箇所!

103行面付近からの…

  1. ...
  2.   // Start the show.
  3.   lda.w pc, main
  4. ...


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

  1. ...
  2.   // Start the show.
  3.   //lda.w pc, main  // コメントアウト!
  4.   lda.w pc, sta_ker // 追記!
  5. ...

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


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

ソースコードをビルドした後に、どのようにメモリに配置すればよいのか?をリンカに指示するためのリンカスクリプト「at32uc3a3_xpld.ld」を作成します。

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

元となるリンカスクリプトは、「link_uc3a3256.lds」という名前で以下のパスに配置されています。


C:\cygwin64\home\<ユーザー名>\asp_1.9.2\target\at32uc3a3_xpld_gcc\ASF\avr32\utils\linker_scripts\at32uc3a3\256\gcc

TOPPERS/ASPソースツリーのディレクトリ - 11


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


C:\cygwin64\home\<ユーザー名>\asp_1.9.2\target\at32uc3a3_xpld_gcc

TOPPERS/ASPソースツリーのディレクトリ - 12


ついでに、今コピーした「link_uc3a3256.lds」を「at32uc3a3_xpld.ld」に改名しておきましょう。

TOPPERS/ASPソースツリーのディレクトリ - 13

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

42行目付近からの…

  1. ...
  2. OUTPUT_FORMAT("elf32-avr32", "elf32-avr32", "elf32-avr32")
  3. OUTPUT_ARCH(avr32:uc)
  4. ENTRY(_start)
  5. ...


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

  1. ...
  2. OUTPUT_FORMAT("elf32-avr32", "elf32-avr32", "elf32-avr32")
  3. OUTPUT_ARCH(avr32:uc)
  4. /* ENTRY(_start) コメントアウト! */
  5. STARTUP(start.o)                    /* 追記! */
  6. PROVIDE (hardware_init_hook = 0) ;  /* 追記! */
  7. PROVIDE (software_init_hook = 0) ;  /* 追記! */
  8. PROVIDE (software_term_hook = 0) ;  /* 追記! */
  9. ...


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


クロック設定の変更

デフォルトのままではパフォーマンスが悪いのでCPUのクロック設定を変更します。

これを行うには、ASFのクロック設定ファイル「conf_clock.h」の内容を変更する必要があります。

この「conf_clock.h」は、以下のパスに配置されています。


C:\cygwin64\home\<ユーザー名>\asp_1.9.2\target\at32uc3a3_xpld_gcc\config

TOPPERS/ASPソースツリーのディレクトリ - 14


conf_clock.h」をテキストエディターなどで開き、以下の部分を修正します。

44行目付近からの…

  1. ...
  2. #define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_RCSYS
  3. //#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_OSC0
  4. //#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLL0
  5. ...


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

  1. ...
  2. //#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_RCSYS // コメントアウト!
  3. //#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_OSC0
  4. #define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLL0    // アンコメント!
  5. ...


もう一箇所!

60行面付近からの…

  1. ...
  2. //#define CONFIG_PLL0_SOURCE PLL_SRC_OSC0
  3. //#define CONFIG_PLL0_SOURCE PLL_SRC_OSC1
  4. /* Fpll0 = (Fclk * PLL_mul) / PLL_div */
  5. //#define CONFIG_PLL0_MUL (48000000UL / BOARD_OSC0_HZ)
  6. //#define CONFIG_PLL0_DIV 1
  7. ...

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

  1. ...
  2. #define CONFIG_PLL0_SOURCE PLL_SRC_OSC0                 // アンコメント!
  3. //#define CONFIG_PLL0_SOURCE PLL_SRC_OSC1
  4. /* Fpll0 = (Fclk * PLL_mul) / PLL_div */
  5. //#define CONFIG_PLL0_MUL (48000000UL / BOARD_OSC0_HZ)
  6. #define CONFIG_PLL0_MUL (84000000UL / BOARD_OSC0_HZ)    // 追記!
  7. #define CONFIG_PLL0_DIV 1                               // アンコメント!
  8. ...


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


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

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

お疲れ様でした~!!

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

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


$ cd asp_1.9.2/


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


$ cd OBJ/


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


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


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

Cygwinターミナル - 1


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


$ make depend


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

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

Cygwinターミナル - 2


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

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


$ make all


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

Cygwinターミナル - 3


本日はここまで!

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

コマンドラインではビルドが通るようになりましたので、次回はIDE(統合開発環境)で開発できるようにプロジェクトを作って、ターゲットへプログラムを転送し、デバッグを行うところまでやっていきましょう。


<続く>

2023年1月2日月曜日

TOPPERS/ASP - AVR32版 その3

前回からの続きです。

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


Atmel Software Framework (ASF)とは?

ASFとは、ドライバ、プロトコル、スタック、コーディングユーティリティ、ビルドシステムなどを開発者に提供するソースコードのライブラリです。

いわゆる純正のライブラリパッケージであり、これを使用するとCPUに内蔵されているペリフェラル(周辺機器)を簡単に利用することができるというものです。

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

ところが、このASFのソースコードのライセンスの条項が不明瞭なために再配布できません。

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

面目無いです…。

では、そのASFのソースコードを何処から入手すれば良いのか?

そのためには、インストールした「Microchip Studio」上で雛形となるプロジェクトを作って、そこで生成されたASFのソースコードを「TOPPERS/ASP AVR32版」のソースツリーにコピーするという方法を採ります。


雛形プロジェクトの作成

まずは「Microchip Studio」を起動して下さい。

「Microchip Studio」 - 1


画面上部の「File」、「New」、「Project...」メニューを順にクリックしていきます。

「Microchip Studio」 - 2


以下のようなダイアログが表示されます。

ここでは「GCC ASF Board Project」を選択し、ダイアログ右下の「OK」ボタンをクリックしましょう。

これで「GccBoardProject1」という名前のプロジェクトを作成したことになります。

このプロジェクト名、覚えておいてください。

「New Project」ダイアログ


続いて、以下のようなダイアログが表示されます。

まずは「Extensions」コンボボックスに注目してください。

デフォルトでは「Atmel ASF(x.xx.x)」と言った具合に、「Microchip Studio」をインストールした時点での最新版のASFを使用するように選択されています。

「Board Selection」ダイアログ - 1


今回の場合、デフォルトの最新版でも多分大丈夫なのでしょうが、検証をしていないので「Atmel ASF(3.49.1)」に設定してください。

これで動くことを確認してから、最新版を試すことをオススメします。

気持ち悪いから最新版で試したい!って方は、貴殿のご武運をお祈りします!

「Board Selection」ダイアログ - 2


使用するASFのバージョンを設定したら、そのコンボボックスのすぐ左、「Select By Board」のラジオボタンをクリックします。

「Board Selection」ダイアログ - 3


このASFのバージョンでサポートされている多くの評価ボードがリストアップされています。

その中から、今回使用する「UC3-A3 Xplained - AT32UC3A3256」を選択し、ダイアログ右下の「OK」ボタンをクリックします。

「Board Selection」ダイアログ - 4


すると、以下のようにダイアログが消えて、元の「Microchip Studio」の画面に戻ります。

ただし「ASF Wizard」というタブが表示されていますね。

このタブの左上、「Project:」という表示のコンボボックスに注目してください。

「Microchip Studio」 - 3


このコンボボックスをクリックすると、作成した「GccBoardProject1」というプロジェクト名が選択できるようになっているので、これをクリック!

「Microchip Studio」 - 4


すると「ASF Wizard」というタブは、以下のような表示に切り替わります。

この画面の見方なのですが、左側のリストには、このプロジェクトで指定したデバイスである「AT32UC3A3256」で使用できるASFのライブラリが表示されています。

右側のリストには、このプロジェクトで既に選択されている(使用する)ASFのライブラリが表示されています。

デフォルトで選択されているのは「GPIO」と「Generic board support」のみですね。

つまり、左側のリストから右側のリストに項目を移動させることにより、自由に使用するASFのライブラリをプロジェクトに付け加えることができる訳ですね。

「Microchip Studio」 - 5


今回の「TOPPERS/ASP AVR32版」に必要な最低限のASFライブラリは以下の4つです。


●GPIO - General - Purpose Input / Output (driver)

●Generic board support (driver)

●TC - Timer / Counter (driver)

●USART - Serial interface (service)


このうち、上の2つは既に選択されていますので、残りのOSタイマーとして使用する「TC - Timer / Counter」と、デバッグ・シリアルに使用する「USART - Serial interface」の2つを追加しましょう。

まずは「TC - Timer / Counter」から。

左側の「Available Modules」リストから「TC - Timer / Counter (driver)」を選択して、「ASF Wizard」タブの下部にある「Add」ボタンをクリックします。

「Microchip Studio」 - 6


すると、無事、右側の「Selected Modules」リストに「TC - Timer / Counter (driver)」が追加されたでしょうか?

「Microchip Studio」 - 7


同じ要領で「USART - Serial interface」も追加しちゃいましょう。

左側の「Available Modules」リストから「USART - Serial interface (service)」を選択して、「ASF Wizard」タブの下部にある「Add」ボタンをクリックします。

「Microchip Studio」 - 8


すると、右側の「Selected Modules」リストに「USART - Serial interface (service)」が追加されるはずです。

「Microchip Studio」 - 9


以上で、必要なASFライブラリの設定は終わりました。

次は、この設定通りにASFライブラリのソースコードをプロジェクトに吐き出させる作業です。

なんてことはないです。

ただ「ASF Wizard」タブの下部にある「Apply」ボタンをクリックするだけです。

「Microchip Studio」 - 10


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

特にやることもなく「OK」ボタンをクリックします。


以下のように、派手な表示の変化もなく作業は終了します。

ちょっと不安ですね?

ちゃんとソースコードが吐き出されているかどうか、後で確認しましょう。

「Microchip Studio」 - 11


さて、必要なソースコードを雛形プロジェクトへ吐き出させたようなので「Microchip Studio」を一旦終了させましょうか。

左上のバッテン(X)をクリックすると以下のダイアログが表示されています。

この雛形プロジェクトを保存するかどうかを問われます。

保存しておいた方が良いでしょう。

(「Yes」ボタンをクリックです。)

変更の保存ダイアログ


もしこの先、無事に「TOPPERS/ASP」の起動に成功して、イザ何かを作ろう!となった場合、今回追加したASFライブラリだけでは絶対に足らなくなることでしょう。

評価ボードにセンサーを繋げて、そのセンサーとSPIで通信するとか、AD変換を使いたいだとか…。

その際には、再び今回の手順で必要になったASFライブラリを追加して、ソースコードを吐き出させて、更にそれを「TOPPERS/ASP」のソースツリーにコピーしなければなりません。

そういう意味では、この雛形プロジェクト、結構使用頻度が高くなるかもしれませんよ?

大切に取っておきましょう!


さて、一連の作業で吐き出されたASFライブラリのソースコードがどうなっているのか?確認しておきましょう。

特に変わったことをしていないのであれば、雛形プロジェクト「GccBoardProject1」は以下のディレクトリに保存されているはずです。


C:\Users\<ユーザー名>\Documents\Atmel Studio\7.0\GccBoardProject1

「GccBoardProject1」ディレクトリ - 1


さらに、このディレクトリの中にある、これまた「GccBoardProject1」というディレクトリの中は以下のようになっています。

「GccBoardProject1」ディレクトリ - 2


さらにさらに、このディレクトリの中にある「src」というディレクトリの中は以下のようになっていますでしょうか?

「src」ディレクトリ


ここで現れる「ASF」と「config」(さらに「asf.h」)こそが、欲しかったモノです!

これらが見つかれば、作業は成功です!


さて「TOPPERS/ASP AVR32版」を動かす上で足りないソースコードのゲットに成功しました。

次のステップは、これらのソースコードのコピーと配置、そして若干の修正です。

忙しいですが、一個ずつやっつけて行きましょう!


<続く>

BSD 4-Clause License

  名称:「四条項BSDライセンス」(BSD-4-clause) タイプ: ・コピーレフト…× ・ライセンス文の掲示…〇 ・コピーライト(著作権)の掲示…〇 ・その他…〇 原文: Copyright (c) <year>, <copyright holde...