2473444 ランダム
 HOME | DIARY | PROFILE 【お気に入りブログ登録】 【ログイン】

CPUを作ろう ~計算機教材とマイコンと電子工作~

μITRON

図解μITRONによる組込みシステム入門を買って読んで,本の通りに試してみようと思ったら,本で紹介されているリアルタイムOS smalightは有償でした.価格を問い合わせ,購入資金繰り中.

--追記--
smalightの価格は自分の利用したい範囲だと5万円から10万円くらい.
というのは,ソースを含めるかどうかとか,利用範囲(個人,学科,学校,ターゲットは?)などで違ってくる.
教育目的ならかなり広い範囲で使える契約で購入した.

もう一冊,ITRONとプログラミング入門の方で紹介されているHOSは無償なのでこれを最初の開発環境の設定のところを見て以下のメモ書きのようにやってみました.
取りあえずビルドできたので,なんとか使えるっぽいです.
11月過ぎたら,マイクロマウスをITRONで動かすことを目標に,じっくり勉強してみます.

----以下自分用メモ書き(ウソが含まれてるかもしれません)----

ITRONプログラミング入門の本を見てやってみたこと

P.6 に書いてあるオーム社のサイトからHEW用のワークスペースをダウンロード.
解凍後,hosv4.hwsを起動,するとバージョンが違うので新しいバージョンで開くか?と聞いてきて,
OK,OK・・・ をクリック.
ワークスペースが開くと,左側にチュートリアルがずらっと並んでいる.
チュートリアルの上で右クリックすると”アクティブプロジェクトに設定”とある.どうやらプロジェクトをいくつも並べて
切り替えることができるらしい.
プロジェクトの読み込みをして一番簡単そうな,h83n_tutorial3_1をロードし,アクティブプロジェクトに設定,
開いていたプロジェクトはアンロードした.
ビルドするとエラー
C:\Program Files\Renesas\Hew\Tools\Renesas\H8\6_0_0\bin\ch38.exeがないだそうで,
フォルダを確認すると自分の使っているバージョンは,6_2_1でフォルダ名が違う.
検索すると,
http://hiepita01.blog47.fc2.com/blog-entry-115.html
に対処法が書かれていた.
メニューのビルドフェーズからPreconfigureを選び変更を選んで,フォルダ名を正しく書き直した.
これでビルドができた.

2010/3/4
h83n_tutorial2をコンパイルしてFlashWriterで書き込み.3664はこっちのほうが簡単.
ルネサスのFlash Development Tool Kitは使わなくてもいい.

GDL付属のSIMPLE TERMを起動,ボーレートを19200に合わせて接続すると,
HOS-V4 by Project HOS!
XXXXX:Task1
XXXXX:Task2



と表示された.

h83n_tutorial3_1
h83n_tutorial3_2

と続けてやってみた.前と同じようにフォルダ名が違うので,
メニューのビルドフェーズからPreconfigureを選び変更を選んで,フォルダ名を正しく書き直す.

h83n_tutorial8 は周期ハンドラ動作.
割込みの時間をsystem.cfgで変えてみた.
最初1000msは正しく動いていたが,10msにすると誤差が大きくなり,(誤差は数ms以下)
5msの割り込みに設定すると動かなくなった.
短すぎるとダメらしい.

h83n_tutorial9 は周期ハンドラの使い方を工夫したもの.
この場合も5msの割り込みに設定すると動かなくなった.
やっぱり短すぎるとダメらしい.

本によると,3664では8ms以上の誤差がでる,とかいてあるので,
見えているのは前後ともその程度遅れているものなのか.
とすると,その誤差周期以下に早くするとだめということかも.


2010/3/5から
ITRON-Micromouseの作成

HOSV4のファイルを新しいフォルダにコピー.
3664で作るので,h83nを残し,h83のフォルダーを全て消去,h83をプロジェクトからも消去.
サンプルの一つを名前を変えてmicromouseとして設定をいろいろ直す.
サンプルファイルの名前はsample.cなので,これをmicromouse.cになおす.
他もいろいろ直す.

その他ITRON関係で主に書き換えるのは,
system.cfg
この中にマイクロマウスのプログラムにあわせたタスクの設定をする.

この最初の方の行に,
INCLUDE("\"sample.h\"");
とあるので,自動的にsample.hにかかれたプロトタイプ宣言が参照される.
INCLUDE("\"micromouse.h\"");
と書き換えて,micromouse.hの中に関数のプロトタイプ宣言を書く.

教材用マウスのプログラムを,ITRON版の中に挿入.
グローバル変数は極力使わないようにして,ローカル変数にかえる.
TimerAの中身をモータとセンサに分けて2つの周期ハンドラに割り当てた.
関数をそれぞれ無限ループで作って,タスク休止を入れたものを,
周期ハンドラから起床させる形にする.

他はとりあえずただの関数として,メインがかち合わないように一時的にmain2()に
名称変更してコンパイルしてみる.
abs関数が見つからないと出たので,
#include < stdlib.h>
を頭に入れるが読み込めてないようだ.
しょうがないので,abs関数をabsfという名前で引数付きマクロで定義↓

#define absf(a,b) ((a>b)?a-b:b-a)

するとコンパイル,ビルドとおった.

3/11
いろいろやっててコンパイルが通らなくなったので,調べた.
コンパイルの流れは,
HEWのpreconfigureの設定のとおりHEWのフォルダの
C:\Program Files\Renesas\Hew\Tools\Renesas\H8\6_2_1\bin\ch38.exe
をオプションを与えて起動し,system.cfg から system.i が作成される.
次に,HEW中の configure 設定のとおり,
hos4cfg.exe によって kernel_cfg.c が作成される.
コンパイルしてもsystem.i や kernel_cfg.c や kernel_id.h が更新されないので
C:\ に hos4cfg.exe と system.i をコピーして,
DOS窓から
hos4cfg.exe system.i
を実行した.するとエラーメッセージが表示され,どうやら system.i 中にエラーがあるため
先に進まないようだった.
system.i のエラー箇所を修正すると,
hos4cfg.exe system.i
によって,
kernel_cfg.c と kernel_id.h
が新しく生成された.
というわけで,元をたどれば,system.cfg 中の記述の間違いがあったために,
preconfigure と configure が正常に行われなかったようだ.
system.cfg ファイルを修正し,中間ファイルをクリーンアップしてコンパイル,ビルドしたら
正常にビルドが完了. できた.motファイルをフラッシュライタで3664に書込むと,
HOSに記述したとおりにタスクが動き出した.

前に書いたように,ヘッダーファイル(micromouse.h)にタスクは全て書いておかないといけない.


いくつかバグ発見.

赤外センサ関係で,LEDをONして1ms待った後にA/D変換したら,LEDの輝度が低い.
1msは待ちすぎらしく,電解コンデンサが放電してしまっているようだ.
ディレイで待つのはやめて,空ループを使って,短時間待つことにした.
i=1000; while(i--); // 少し待つ
これでずいぶん明るくなったが,もう少し待ち時間は短くてもいいかもしれない.要調整.

赤外センサの点灯間隔が長すぎたので50ms間隔とし,その半分ずつで前と横を見ることにした.

左右の距離補正は,別の周期ハンドラで起動させてもいいかもしれない.

メインタスクで,START_SW待ちが入らない.
回路的にプルアップされてないためのようなので,ソフトでプルアップさせた ->GDLのほうにも必要.

IO.PUCR1.BIT.B6=1; // P16 未使用入力をプルアップ
IO.PUCR1.BIT.B7=1; // P17 未使用入力をプルアップ

モータ回転速度が遅かったので,ディレイの待ち時間を減らした.

#define LSPD 8 // 低速走行のタイマーAカウント値
#define HSPD 4 // 高速走行のタイマーAカウント値

低速スタートのステップ数が多いようだったので減らした.

void slow_start(){
fS=0; // 最初は低速設定
modeR=modeL=1; // モード設定 右:0 (加速前進),左:0 (加速前進)
cntR=0; stepR=20; // 低速で20ステップ進む
while (cntR< stepR);

同じワークスペース内にプロジェクト追加をしてみる. <-後に再度やったものを記載,ここではたまたま上手く言っている.

h83nのフォルダの中にマイクロマウスのプロジェクトがあるので一式コピー.
フォルダの名前を micromouse_v2 に変えた.
中のhwsファイルの名前も,micromouse_v2.hwp に変更.
HEWのプロジェクトメニューから,プロジェクトを挿入.
既存のプロジェクトを選択.
さっき名前を変えた micromouse_v2.hwp ファイルを選択.
するとプロジェクトが追加された. <-同じプロジェクト名があるとエラーになる.たまたまプロジェクト名を変えたりしてたからエラーにならなかった.
h83nをアンロードしてコンパイル.なぜか hosv4n.lib ライブラリが見つからないとエラーが出る.
hosv4n.lib ファイルをダブルクリックしても見つからない,
hosv4n.lib のプロパティを見ると,unknownとなっている.リンクが切れているようだ.
正しい場所は,hosv4nの中のdebugの中なので,リンクを変えようとやってみるが変え方が
分からず,一旦削除して,再度プロジェクトにファイルの追加をしてみた.
すると上手くコンパイルできるようになった.


(補足,再度やってみた方法)
プロジェクトの追加方法(コピーして追加する方法)

プロジェクトのファイル一式コピー
ファイル名を付け替える.
例えば,
micromouse_v2 のフォルダを, micromouse_v2_1 に変更.
フォルダ内のプロジェクトファイル名(hwp)を変更,同じく _v2 を _v2_1 に.
プロジェクトファイルはテキストファイルなので,中身もテキストエディタで変更.
検索置換を使って,”_v2”を”_v2_1”にすべて付け替えた.
続いて,プロジェクトの挿入で先ほど作ったファイルを読み込めば追加完了.



というわけで,バージョンを変えながら更にITRON仕様に改変.

タスク間通信をフラグでやってみる.
とりあえず,壁それぞれの有無をフラグで見ることにした.
フラグ定義は,

/* イベントフラグ */
CRE_FLG(FID_WF, {TA_TFIFO | TA_WMUL, 0});
CRE_FLG(FID_WR, {TA_TFIFO | TA_WMUL, 0});
CRE_FLG(FID_WL, {TA_TFIFO | TA_WMUL, 0});

センサタスク内に以下を記述してみた.
壁の反射を見てしきい値以上ならフラグをセット,それ以下ならリセット

if (sensFR>DISFMAX) set_flg(FID_WF,1); else clr_flg(FID_WF,0);
if (sensR>DISRMAX) set_flg(FID_WR,2); else clr_flg(FID_WR,0);
if (sensL>DISLMAX) set_flg(FID_WL,4); else clr_flg(FID_WL,0);

最初以下のようにしたら,
if (sensFR>DISFMAX) set_flg(FID_WF,1); else set_flg(FID_WF,0);

壁を検出してフラグがついたあと,つきっぱなし.
フラグはセットされたら,リセットしないといけない.
set_flg(FID_WF,0);  はリセットすることではない.
clr_flg(FID_WF,0); で該当ビットに0が入ったパターンを入れて始めてリセットになる.


モニタ側は,メインタスクのスタートキー待ちのところに入れて様子を見てみた.

ポインタ定義は以下のようにする.これは,
\src\kernel\flg\ref_flg.c 
を読めば分かるが,構造体 T_RFLG で定義されているようなのでこの通りにしないとだめだった.

T_RFLG pk_rflg;

フラグ参照命令が以下の通り,IDと先に定義したポインタを渡す.
その後値を取り出すのは,pk_rflg.flgptn
ここで,flgptn はフラグパターン.
つまり,ポインタのセットもリセットも値の参照もフラグパターンで行うので,
壁のフラグも別々に定義して読み書きするより,フラグパターンとしてまとめて読み書き
したあと各ビットに分ける方がスマートかもしれない.

ref_flg(FID_WF, &pk_rflg);
ff= pk_rflg.flgptn;

ref_flg(FID_WR, &pk_rflg);
fr= pk_rflg.flgptn;

ref_flg(FID_WL, &pk_rflg);
fl= pk_rflg.flgptn;

LED = ff;

フラグをセンサのビットパターンとして定義,利用.
フラグ待ちはまた違った変数の定義で呼ばないといけない.

フラグをセンサのビットパターンとして定義,利用.
フラグ待ちはまた違った変数の定義で呼ばないといけない.


モータ関係をフラグ化.
回転モード(フリー,前進,バック,ブレーキ)を2ビットでフラグ化,
さらに,高速低速の切り替えフラグ, これを左右モータで定義.

歩数をフラグ化,必要最小限で,90度ターンと1ステップの歩数しかカウントしないことにする.
歩数カウント中かどうかを与えるフラグをもう一つ用意.

これまで,while文で歩数カウントを待つ空ループを,フラグ待ちに全て置き換え.
これで歩数カウンタや目標値を与える変数が不要になった.



ITRONとプログラミング入門


図解μITRONによる組込みシステム入門


Copyright (c) 1997-2018 Rakuten, Inc. All Rights Reserved.