Monthly Archives: July 2018

MacでルネサスのRX631マイコンの開発〜GCC環境の環境ファイルの作成〜

こんにちわ、青木です。

個人的に進めていたプロジェクト「MacでRXマイコンの開発環境を構築する」が今回を含めてあと2回でこの連載が終わります。

過去の記事は、以下からアクセスできます。
第1回:クロスコンパイラを作るためのコンパイラを作る方法
第2回:RXマイコンのクロスコンパイラを作る方法
第3回:CS+のMAIN関数が実行されるまでの流れ
第4回:GCC環境のスタートアップファイルの作成
第5回:GCC環境で用意するファイルの作成
第6回:GCC環境のベクタファィルの作成

環境設定ファイルxxx.ldを紹介するとビルドに必要なファイルは全て揃ったことになります。ビルドは、makefileと言われるスクリプトを作ると完成です。ビルトが終わると残りは、プログラムの転送になります。プログラムの転送は、次回紹介します。

環境設定ファイルは、GCC環境を構築した時に、prefix/rx-elf/lib/rx.ldが生成されています。これを修正してRX631の環境にします。左が、オリジナル、右がRX631用に修正したものです。

最初にMEMORY{ }の中身を修正します。オリジナルは一番大きいメモリサイズで記述されているので使い物になりません。RX631のハードウェアマニュアルのメモリマップをみてRAM、ROMの開始アドレスと終了アドレスを確認します。今回紹介しているRX631のRAMのサイズは64k、ROMのサイズは256kです。オリジナルには、STACKしかありませんが、修正後には、ユーザースタック(ustack)と割り込みスタック(istack)の2種類に分けています。CS+の環境がユーザーと割り込みに分かれていたので修正後の環境も分けています。スタックポインタは、スタックが増えるとアドレスがデクリメントの方向に進むので、指定するときは、最後のアドレスになります。それも、スタックが入ると設定したアドレスからその前のアドレスから開始されるのでISTACKは0x0000_FFFFではなく、0x0001_0000を指定しています。ISTACKは0x300byte使う予定なので、USTACKは0x0000_FD00を指定しています。USTACKは0x100byte使う予定なので、 RAMの最後は0x0000_FBFFとなり、RAMのサイズが0x0000_FC00となります。そのサイズをLENGTHに記述しています。
 ROMのサイズは、ROMの最後に固定ベクタが入るため、固定ベクタを除いたサイズを指定します。CS+を無償で使用するとコンパイルのサイズ制限(128kまで)がありますが、GCCの場合は、その制限がないため、マイコンにあるROMを全て使う事ができます。
 SECTIONS{ }にも、差分があります。KEEP(*(.init))、KEEP(*(.fini))はベクタ関連の記述です。ベクタは、CS+の環境をそのまま使えるように細工していますので、KEEP(*(.init))、KEEP(*(.fini))は使わないので削除しています。

そのほかに修正したのは、ベクタのところです。

オリジナルでは、ベクタの関数名をこのファイルで設定していますが、修正後は、別のファイルで設定しているため記述が異なっています。ベクタで注意するところは、固定ベクタ(.fvectors)は、0xFFFF_FFD0から開始されるので直接アドレスを記述していますが、可変ヘクタ(.rvectors)の方は、開始アドレスが決まっているわけではなく、ROM上に置くので、”>ROM”の指示でROM上のどこかにリンカーによって配置されています。配置されれば、vecttbl.cにある可変ベクタのRelocatable_Vectorsの配列のアドレスが決まり、そのアドレスが、スタートアップのstart.sでintbレジスタにセットされる仕組みになっています。
あと、stackのところもistackとustackに分けたので、記述も分けています。
makefileを紹介すると長くなりそうなので今回はここまでとします。

続きを読む ›

Posted in 技術情報


DCマウス研修(inukai編)[17] 金沢・草の根大会参加

こんにちは
inukaiです。

ついに参加してきました初大会!
週末に金沢草の根大会に行ってまいりました。簡単に大会の参戦記を書ければと思います。
大会の日程や結果はこちら

今年は国際高等専門学校、白山麓キャンパスでの開催でした。東京から金沢まで新幹線、金沢駅から会場まではレンタカーで1時間ほど移動して現地に到着。
正門には大会看板が目立っていました。

こちらが、大会会場の校舎です。一部をお借りして大会を行いました。

こちらはイノベーションハブという宿舎です。中もめっちゃきれいでした!さすがかんぽの宿跡地だけはありますね。

大会会場はこんな感じです。クラシック、トレーサー、マイクロマウスの3競技が開催。

早速調整に入っていきます。
調整に悩んでいるところを社長にとられた私の図。
必死で気が付かなかった…

ひたすら懇親会まで調整。19:30から懇親会。

懇親会はイノベーションハブ内のカフェテリアで行われました。
みんなに持ち寄られた懇親会のお酒たち↓

東北での合宿の教訓から、飲むのはほどほどに、懇親会後もひたすら調整。

16×16の迷路を走っていると、軌道の誤差が蓄積し、迷路によってゴール出来たり失敗したりと不安定な状態でした。
そこで、「前壁補正」を急遽実装することに。(こちらは後日記事できればと思います。)

午前12時なんとか安定してゴールできるようになり、その後も2時ごろまで確認と調整を行って就寝。

 

 

そして大会当日!

朝ごはんを食べて、大会用迷路が組まれる前に急いで会場でセンサ調整。

9:00に競技開始。自分はクラシック競技の出走番号が4番とあっという間に出番が回って来ました。

初の大会での緊張もありましたが、前日に入れた前壁補正で新たなバグを生み出していないかという不安のほうが大きかった気がします。

とは言ったものの前壁補正が功を奏して、ゆっくりではあるものの安定して探索走行で完走できました!
また、スタートまで無事帰ってくることもできたのでほっとしました。

写真は競技中に探索走行しているところです。

その他クラシックの様子のyoutubeの中継はこちら

https://www.youtube.com/watch?v=Mlu3KHZ1ADU

その他の競技や表彰の様子も先ほどのチャンネルからご覧いただけます。

無事、認定証も発行されました!


走り終わって2分くらいでもらえました。(仕事が早い!)

というわけで初大会を無事終えることができました。

NTF事務局やI.Sysをはじめとした運営の皆様、本当にありがとうございました。
そして参加者の皆様お疲れさまでした!

それではまた次回

続きを読む ›

Posted in DCマウス研修(吸引編), ブログ, 研修


MacでルネサスのRX631マイコンの開発〜GCC環境でのベクタファイル〜

こんにちわ、青木です。

個人的に進めていたプロジェクト「MacでRXマイコンの開発環境を構築する」がもう少し続きます。

過去の記事は、以下からアクセスできます。
第1回:クロスコンパイラを作るためのコンパイラを作る方法
第2回:RXマイコンのクロスコンパイラを作る方法
第3回:CS+のMAIN関数が実行されるまでの流れ
第4回:GCC環境のスタートアップファイルの作成
第5回:GCC環境で用意するファイルの作成

前回、GCC環境で用意するファイルを紹介しましたが、一部紹介しきれていないところがありましたので、今回は、紹介しきれなかったベクタファイル(vecttbl.cとvech.h)の修正内容を紹介します。環境設定ファイルxxx.ldは次回紹介します。

RX631のベクタは、固定ベクタと可変ベクタの2種類あります。固定ベクタは、アドレスが固定されており、変更することができません。例えばリセットのベクタアドレスは0xffff_fffcと固定されています。可変ベクタは、intbレジスタに可変ベクタの先頭アドレスを入れ、そのアドレスからベクタ番号を加算したアドレスに割り込み先のアドレスがある構造になっています。例えば、intbレジスタに0xffff_0000をセットとし、CMT0の割り込みベクタ28の場合は、0xffff_0000+28*4=0xffff_0070番地にあるアドレスにジャンプするというものです。
その辺りは、第3回の記事のルネサスのリンク先を見ていただけるとイメージがつかめると思います。
 ベクタの動作は、関数ポインタ配列と同じ動作をしているので、同じように関数名を用意して配列に入れれば、同じ動作ができます。固定ベクタは、次のように記述しています。

__attribute__(( ))はGCCの環境に用いられているもので関数属性というものです。__attribute__((.section(“name”)))はnameというセクション名のコードをビルド任せではなくユーザーが指定したメモリ空間に置くことができます。固定ベクタは、0xffff_ffd0から開始されるので、__attribute__((.section( )))を使って固定ベクタの関数は、ここに置いてねとリンカに知らせています。.section( )のアドレスの設定は、次回のxxx.ldで紹介します。
 ここでは、固定ベクタの配列名をFixed_Vectors[]としています。固定ベクタは、0xffff_ffd0から0xffff_fffcまで全てベクタが埋まっておらず、ベクタがないところは、Dummy関数を入れています。PowerOn_Reset_PCのベクタだけは、スタートアップファイルstart.s(詳細は第4回を参照)に”.global _PowerON_Reset_PC”の記述で外部で公開されているシンボルとして定義しています。PowerON_ResetがC言語の関数ではないので記述が少し違っています。
 コメントアウトしているのでおそらくお気づきだと思いますが、このファイルはCS+で生成されるvecttbl.cを修正して作っています。

次に可変ベクタですが、可変ベクタも同じように記述します。

ここでは、可変ベクタの配列名をRelocatable_Vectors[]としています。固定ベクタと同じように記述します。CS+のvecttbl.cには可変ベクトのテーブルの記述がないため、CS+で生成されるvect.hからコピーして作成しました。ベクタ番号が連番ではないところもあり、vect.hからコビーしたベクタ番号を消さずにコメントアウトして間違えにくいようにしています。

最後にvect.hは割り込み関数の羅列だけなのですが、ここでも__attribute__((interrupt))の関数属性を使ってこれらの関数は、「割り込みで使用します」と定義します。

割り込みの関数で高速割り込み(優先レベルを15)にした場合、割り込み前のところに戻る時に通常ではアセンブル言語でRTE命令で戻るところをRTFI命令で戻る必要があり、普通の関数とはちょっと違ったことをする必要があるので、関数属性を使う必要があります。

次回は、環境設定ファイルxxx.ldの紹介をします。

続きを読む ›

Posted in 技術情報


DCマウス研修(inukai編)[16] 慣性センサ(ジャイロ)の読み取り

こんにちは
inukaiです。

西日本を中心としたで豪雨で被災した皆様とそのご家族、関係者の方々に心よりお見舞い申し上げます。一日も早い復旧を心よりお祈り申し上げます。

それに伴って、関西地区大会も延期となりました。

 

前回までに8×8の迷路を走りきることができましたが、マウス内部の処理としては各車輪のエンコーダ情報を用いてステッパーと同じように走行距離や車体角度を管理していました。今回は今後のためにもジャイロを読み取って制御できるようにしていきたいと思います。
とはいっても読み取り自体は2ヵ月くらい前に実装していたのですが、この度ジャイロ角速度を制御に使えるようにしたので、これを機に記事にしました。

というわけで、ジャイロの読み取りの実装にあたってぶつかった壁をいくつか書きとめていきたいと思います。

①簡易SPI端子割り当て

慣性センサ(ジャイロ)は「ICM-20648」を使用しています。マイコンとの通信はI2CとSPIに対応しており、読み取り速度の速いSPIを使うことにしました。RX631のマニュアルの「機能別端子一覧」より、SPIには下記の端子を割り当てて回路設計をしていました。

RX63Nグループ、RX631グループユーザーズマニュアル ハードウェア編より引用

端子を割り当てる際、MOSI、MISO、SCKの文字だけを見てSPIはここでOKだと思っていました…

しかし、いざプログラムを書こうと思ったら頭に”S”がつく(SMISOなど)ところは簡易SPI機能が割り当てられた端子だったのです。簡易SPIと通常のSPIの大きな違いとしては、簡易SPIは8ビットごとの通信となるところです。これは想定外だったのですが、「ICM-20648」は基本的に8ビットごとの通信で問題なさそうなので特に大きな問題にはなりませんでした。

②SPIのMOSI、MISO接続が逆

以前ご紹介した回路図からSPI周りを抜き出すと下記となるのですが、SPIのMOSI、MISO接続が逆になっていました。
今回の構成は、SPIのMasterはマイコンであるRX631、SlaveはセンサであるICM-20648です。
MOSIは「Master Out Slave In」の略、MISOは「Master In Slave Out」の略として機能名がついています。これを意識していれば間違えないところのはずなのに…

ジャイロは0.4mmピッチなので一番再配線したくなかったのですが…
仕方なくパターンカットと再配線、そして配線がはがれないようホットボンドで固めました。

 

これらの確認と修正と行ったところで簡易SPIでジャイロを読み取り、まずはいわゆる”宴会芸”を実装。

制御の安定性に余裕を持たせているので少し遅れはありますが、宴会芸ができるようになり角速度方向の制御をできるようになりました。

余談ではありますが、下記が簡易SPIを6MHzに設定して、「ICM-20648」のZ軸周りの角速度を読み取ったときのCS端子の波形です。
読み取りに約11usかかっています。今回は特に割り込みを使用せずにSPIの通信をしていますが、この読み取り時間なら問題なさそうです。

では今週末の金沢草の根大会に向けて、ソフトを詰めていきたいと思います!
ではまた次回!

 

続きを読む ›

Posted in DCマウス研修(吸引編), ブログ, 研修


MacでルネサスのRX631マイコンの開発〜GCC環境で用意するファイル〜

こんにちわ、青木です。

まだまだ個人的に進めていたプロジェクト「MacでRXマイコンの開発環境を構築する」が続きます。

過去の記事は、以下からアクセスできます。
第1回:クロスコンパイラを作るためのコンパイラを作る方法
第2回:RXマイコンのクロスコンパイラを作る方法
第3回:CS+のMAIN関数が実行されるまでの流れ
第4回:GCC用のスタートアップファイルの作成

第5回目は、GCC環境に必要なファイルの紹介とGCC用にカスタマイズしないといけないファイルについて説明します。
ここで目指すMacでRX631環境の構築は、今までの資産を可能な限り流用し開発時間を短くすることです。つまり、今までCS+で開発してきたマイクロマウスのプログラムを可能な限り修正せずに流用することが大きな目標となります。

まずは、CS+の環境で新規のプロジェクトを作るときに生成されるファイルの確認をします。これ以外のファイルは、ユーザーが追加したファイルとなります。
生成させるファイルは、以下のものです。
 resetprg.c・・・初期設定ルーチン (リセットベクタ関数)
 dbsct.c・・・セクションの初期化処理(テーブル)
 stacksct.h・・・スタックサイズの設定
 intprg.c・・・ベクタ関数の定義
 sbrk.c・・・低水準インタフェースルーチン(sbrk関数)
 sbrk.h・・・低水準インタフェースルーチン(sbrk関数のヘッダ)
 main.c・・・main関数
 typedefine.h・・・型定義ヘッダ
 iodefine.h・・・内蔵周辺I/Oレジスタ定義
 vecttbl.c・・・固定ベクタテーブル
 vect.h・・・ベクタ関数のヘッダ

resetprg.cに関しては前回紹介したスタートアップのファイルです。そのほかのファイルは、そのまま使えそうな気がしますが、いろいろと落とし穴があります。

dbsct.c(セクションの初期化処理)は、GCC環境では環境設定ファイルに記述します。GNUtoolsのサンプルプログラムでは”Rx62t_led_flasher.ld”のxxx.ldファイルが環境設定ファイルになります。クロスコンパイラを作成したディレクトリにも同じようなrx.ldファイルがあります。このファイルの修正に関しては、後日紹介します。

stacksct.h(スタックサイズの設定)、割り込みスタックのサイズとユーザスタックのサイズが記述されています。GCC環境では、スタートアップのファイルで設定しています。実際の値はxxx.ldファイル内で記述しています。

intprg.c(ベクタ関数の定義)は、ほぼそのまま使えます。使えないところはコンパイラ指示の#pragmaです。#pragmaは、コンパイラに対して特殊なことをするように伝える役割をしています。#pragmaは環境依存であるため、コンパイラによって使えないことがあります。今回のGCC環境では、エラーとなってしまったので、コメントアウトしています。修正したものを下記に示します。左が修正前、右が修正後となります。修正後のファイルは、実際マイクロマウスで使用しているファイルなので余分なものもありますが・・・気にしないでください。#include machine.hでもエラーになり、ここでは使っていないのでコントアウトしています。

sbrk.c、sbrk.h(低水準インタフェースルーチン)ファイルは、sbrk関数を使わなければ不要なので、今回は、使用しない方針です。

typedefine.h(型定義ヘッダ)ファイルは、使っていないのでなんともいえませんが、そのまま使えると思います。

iodefine.h(内蔵周辺I/Oレジスタ定義)は、行数が多いですが、修正する内容は簡単です。ここでも#pragmaでエラーとなったため、コメントアウトしてGCCのエラーを回避しています。コメントアウトしてエラーは回避できるのですが、ただコメントアウトしてしまうとiodefine.hがそのまま使えないという問題がありました。その問題になったのは、#pragam bit_order leftのビットフィールドの順番でした。C言語は、アドレス管理をリンカがするので特にユーザーは気にせずにプログラミングすることができますが、レジスタに直接アクセスする場合、レジスタのアドレスとそのレジスタのビットの並びを気にする必要があります。レジスタのアドレスは、byte単位で管理されているため問題にならないのですが、ビットに関しては、ビルドによっては、ビットフィールドの並びが右からなのか左からなのか決まっていません。CS+は左詰、GCC環境は右詰となっており、すべて書き直しをしました。書き直した一部を以下に示します。unionの中にあるビットフィールドが上下逆になっているのがわかりますでしょうか。

vecttbl.c(固定ベクタテーブル)は、かなり手を加えています。

vect.h(ベクタ関数のヘッダ)も変更しています。

ベクタのところは、いろいろ変更しているので、次回修正した内容を説明します。

続きを読む ›

Posted in 技術情報


DCマウス研修(inukai編)[15] マイクロマウス合宿@山形(長井)

こんにちは
inukaiです。

週末の6/30(土)、7/1(日)にマウス合宿@山形に参加してきました!

合宿日程としては
1日目
・~16:00 到着次第、マウス開発
・16:00~17:00 弊社社長の講演
・~18:00 懇親会までマウス開発
・18:00~22:00 懇親会
・22:00~次の日 マウス開発
2日目
・~11:00 マウス開発
・11:00~ プチ大会
・13:30 片付け&解散

という感じでした。
まとまった開発の時間が取れたため、マウス開発もはかどる合宿となりました。

こちらが合宿での開発中風景です。
基本的には黙々と開発しつつ、情報交換をしたりしながら次の日のプチ大会に向けて開発。

用意されているのは、クラシックマウス競技8×8と、

マイクロマウス競技(旧ハーフサイズ)の16×16の迷路

クラシックサイズの合宿用の8×8迷路は少し滑りやすい迷路でした。
(東北大会用とはまた別の迷路みたいです)

講演の様子がこちら。
内容はロボット技術動向について、具体的なロボットを挙げて紹介していくものでした。

 

懇親会は写真を撮り忘れてしまいました。
とりあえず、東北の方々はお酒が強かったです!

私は懇親会後、開発を再開するもグロッキー状態で23:30頃から次の日の朝まで酔いつぶれてました…
次の日は朝7:00~2日酔い状態ながらも作業再開!

プチ大会に向けてプログラムを書いたり、パラメータ調整したりしてはマウスを走らせて見守ります。

 

そしてプチ大会開始!
プチ大会では1人あたり3回走行というルールで行われました。

写真は2回目のスタートをする様子。

結果としては8×8を2分49秒で探索し、約5分でスタートに戻ることができました。
本番の16×16を考えると時間は厳しいところですが、8×8を往復できたことは合宿の大きな成果でした。

というわけで、地区大会直前の合宿も終わり、今週末は関西地区大会となるわけですが、完走(全日本出場権)を目指して頑張ってまいります。

ではまた次回

続きを読む ›

Posted in DCマウス研修(吸引編), ブログ, 研修


MacでルネサスのRX631マイコンの開発〜GCC用のスタートファイルを作成〜

こんにちわ、青木です。

毎週、更新し続けている個人的に進めていたプロジェクト「MacでRXマイコンの開発環境を構築する」も4回目となりました。

第1回目は、クロスコンパイラを作るためのコンパイラを作る方法を紹介しました。
第2回目は、RXマイコンのクロスコンパイラを作る方法を紹介しました。
第3回目は、CS+のMAIN関数が実行されるまでの流れを紹介しました。

第4回目は、第3回目で紹介したCS+のおまじない的な文法をGCC環境に合わせて記述し直します。
まずは、おさらいです。忘れていたら、第3回目の記事をみて下さい。
MAIN関数に行く前に、PowerOn_Reset関数が実行され、そのPowerOn_Reset関数では以下のことが実行されていましたね。

1行目は、関数ポインタ配列で実現しますと前回紹介しました。
そしてset_intbはアセンブリ言語でしか記述できないコードです。なんとなく予想をしていたと思いますが、今回紹介する内容は、アセンブリ言語です。といっても、難しいことはしておらず、ベクタ(intb)の設定、浮動小数点ステータスワード(fpsw)の設定、プロセッサステータスワード(psw)の設定、メモリの初期化をアセンブリ言語で記述するだけです。すべてをアセンブリ言語で記述するわけではないので安心してください。

さて、set_intbはアセンブリ言語では、以下のように記述します。

mvtcは、制御レジスタに値を転送するコマンドです。制御レジスタは、
 PC:プログラムカウンタ
 ISP:割り込みスタックポインタ
 USP:ユーザースタックポインタ
 INTB:割り込みテーブルレジスタ
 PSW:プロセッサステータスワード
 BPC:バックアップPC
 BPSW:バックアップPSW
 FINTV:高速割り込みベクタレジスタ
 FPSW:浮動小数点ステータスワード
の9種類です。お気づきの方もいると思いますが、set_intbのほかに、set_fpswとset_pswも同じように記述することができるということです。記述すると以下のようになります。

注意点として、RX631マイコンの動作モード(プロセッサモード)が2種類(ユーザーモードとスーパバイザモード)があり、
ユーザモードの場合は、mvtcコマンドでレジスタに転送できないものもあります。リセット直後はスーパバイザモードです。CS+のデフォルト環境では、スーパバイザモードのままなので、必要なければ、ユーザモードに移行する必要はないと思います。

割り込みテーブルレジスタintbの話に戻って、#_Relocatable_Vectorsの変数らしきものは、どこで設定しているのかというと、ほかのファイルで定義してます。そのため、「外部に変数があるよ」という記述をプログラムの初めに記述しています。
外部変数の参照は以下のように記述します。

この記述は、C言語に似ていますね。
Relocatable_Vectorsの所在や内容については次回紹介します。
残りの_INITSCT()は、メモリの初期化をしています。パワーオンリセット時、RAMの値は不定です。C言語ではbssセクションは、0で初期化する必要があります。初期値つき変数の初期化も必要です。ここでは、RAM全体を0で初期化しています。実装すると以下のコードになります。

参考したものは、以下のGNUtoolsのサンプルプログラム(start.S)になります。

mov命令は、ソースオペランド(src)にある値をデスティネーションオペランド(dest)に値を転送します。
ここでのsrcは、#0です。destはr1になります。
sub命令は、C言語的表現で記述すると dest = dest -src の引き算になります。つまり、r3 = r3 -r1 になります。
sstr.b命令は、r3で示される回数分、r2の内容(ここでは”0″)をr1で示される転送先番地へ、アドレス加算方向にr2の値がコピーされます。
言い換えると、r1のアドレスからr3のアドレスのまで、r2の値で埋め尽くすということです。
RX631のRAMのアドレスは、64Kbyteの場合、0x0000_0000から0x0000_FFFFです。
気になるのが、#__istackの存在だと思います。#__istackは、割り込みスタックポインタ(ISP)のアドレスを示しています。この変数も外部のファイルで定義しています。この他に、RX631はユーザースタックポインタ(USP)があります。スタックポインタは、スタックを管理するポインタで、スタックとは、割り込み要求が発生した場合、割り込みが発生する直前まで実行していたプログラムのフラグやフログラムカウンタを一時的に退避する場所です。詳細は、スタックポインタ、プッシュ、ポップのキーワードで調べてください。
__istackのアドレスは、0x0001_0000にしています。スタックポインタは、アドレスの減算方向に進むため、RAMの一番終わりの値にしています。このスタックポインタも設定する必要があります。

GNUtoolsのサンプルプログラムを参考に必要なところのみ抽出するとスタートアップファイルは以下のコードになります。

次回は、割り込みベクタのファイルの修正について紹介します。

続きを読む ›

Posted in 技術情報