ITRON本書籍サポートページ [書籍ITRON本]
書籍の内容に関するサポートページです。
質問等はコメント欄に記入していただければ、出来る限り回答いたします。
なお、こちらのリンクもご利用下さい。
http://hamayan.ddo.jp/~hamayan/so-net/book1.html
gccの環境構築再確認編
ITRONプログラミング入門―H8マイコンとHOSで始める組み込み開発
- 作者: 浜原 和明
- 出版社/メーカー: オーム社
- 発売日: 2005/04/25
- メディア: 単行本
しかし、スイッチの様に押されたとか、押されないとかの状態を取るだけならば
下記の例題はIRQ0に接続されたスイッチの入力で、割り込みハンドラを起動する例ですが、この様に機械的な要素で、単にON/OFFの反応ならば、むしろ優先度を最低にしたタスクでスイッチの状態をポーリングする事をお勧めします。
スイッチをIRQに接続する最大の問題は、いわゆるチャタリングの問題です。チャタリングの出ない、または出難いスイッチなら良いのですが、平気で数回デバウンスするようなスイッチを使った場合、この数だけ割り込みが処理される事となります。処理は一回で良いのにです。
しかも悪い事に無駄な処理をしている割には、処理の優先度が相当に高い。最も優先度を高くしているタスクよりも優先度が高いので、なんとも無駄な・・・。
よくチャタリングを除去した回路(ハードウエアのフィルター)を外付けしたり、ソフトウエアでフィルターを掛けたりしますが、フィルターを掛けるという事は、結局イベントに有る程度の時定数を持たせる事となり、反応は必ず遅れます。
だったら、優先度の低いタスクでdly_tskを使って適当な周期でサンプリングしても同じ事です。
RSラッチを外付けすれば、反応は良くなります。兎に角一発目で処理に入りたい時は有効でしょう。ですがRSラッチの様にフィードバックを持つ回路は、回路規模が増えます。FPGA等でも、この程度の目的の為に、二つのマクロセルを消費する可能性が有ります。つまりコスト高です。
私のお勧めは、リアルタイム性が許容されるなら、タスクでポーリングです。
忘れていた?割り込みハンドラの記述具体例
「割り込みハンドラの具体的な説明が本に記載されていない」と指摘を受けてしまったので、ここで補足して置きます。
割り込みハンドラの記述はそれ程難しくは有りませんが、それ以前にH8での割り込み処理に付いての知識は当然必要となります。また、割り込みスタックにも充分注意して下さい。思った以上に割り込みスタックが必要で、別のタスクのスタックを破壊する事のない様に。
では、ターゲットはH8/3664F、通称Tinyマイコンです。このTinyのIRQ0にスイッチ等を接続し、割り込みを発生させる場合です。
1.初期化処理等で割り込みコントローラー(ICU)等を設定し、割り込みを有効にする。
IO.PMR1.BYTE = 0x1e; /*0001 1110 IRQ0(bit4)割り込み入力として使用する*/
IENR1.BIT.IEN0 = 1; /*IRQ0割り込み許可*/
2.割り込みハンドラの起動関数を記述する。
例えば
void IRQ0Int(VP_INT exinf )
{
IRR1.BIT.IRRI0 = 0; /*割り込み要因クリア*/
/*以下、割り込み処理*/
}
ってな感じで、まず割り込み要因のクリアを行ってから、割り込み処理を記述します。
3.システムコンフィギュレーションファイル(system.cfg)に割り込みハンドラの登録を行う。
ATT_ISR({TA_HLNG, 0, 14, IRQ0Int(});
この静的APIの引数は、左から言語属性、ハンドラ起動時の引数、割り込みベクター番号、起動関数名です。14は3664FのIRQ0のベクター番号です。簡単ですね。
4.おそらくこれが最後の要素
上記ATT_ISRで掛かれた内容をコンフィギュレータが解釈し、それをkernel_cfg.cと言うC言語のソースファイルに展開します。読者の方ならご存知ですね。
kernel_cfg.cをエディタで開くと
/* object initialize */
void kernel_cfg_init(void)
{
int i;
/*途中は省く*/
/* initialize interrupt table */
kernel_intcb_tbl[14-14].exinf = (VP_INT)(0);
kernel_intcb_tbl[14-14].isr = (FP)(IRQ0Int);
}
こんな感じで展開されています。当然IRQ0Intと言う名前は解決しなければならない事となりますが、これもシステムコンフィギュレーションファイルに
INCLUDE("\"sample.h\"");
と書く事で、このヘッダーファイルをkernel_cfg.cで参照出来る様になります。
このsample.hの中に、IRQ0Intのプロトタイプ宣言である
void IRQ0IntVP_INT exinf);
を記述すれば、割り込みハンドラとして使える様になります。
是非、やってみて下さい。
HEWツールバージョンに合わせたコンフィギュレータの改造!
本の執筆時のHEWのツールバージョンは6.0.0でしたが、現在ルネサスからダウンロードすると、もっとバージョンが上がっています。間違いなく今後もどんどん上がるでしょう。
そこで、オーム社のダウンロードページから落とせるワークスペースの対応方法を以下に記載して置きます。
まず、HEWを起動後、ワークスペースを読み込みます。多分ここでHEWワークスペースバージョンや、ツールバージョンを上げるか聞いていきますから、そのまま指示される通りにバージョンを上げて置きます。
次に、使用したいプロジェクトをアクティブにして、ビルド(B)→ビルドフェーズ(P)に進みますと、ビルドフェーズの編集用ダイアログが開きますので、PreConfigureを選択し、変更(M)ボタンをクリックします。
下の画面のコマンドの入力欄で"6_0_0"となっている所を、実際に使っているバージョンのフォルダー名に変更して下さい。例えば6.1.1ならば、"6_1_1"となります。
HOSカーネルをデバックしてみたい
ICEを使った話とか、printfデバックをしてみるとか、根性で逆アセンブル出力を見ながらデバックしたい!という話ではなく、HEWとHTERMを使ったソースレベルデバックの話です。
まずHOS-V4では、カーネルはライブラリ化して利用するのが基本となっていて、書籍でもその方法で利用しています。
ライブラリは勿論HEWから作成できますが、作成する時のオプション指定で、デバックコードを付加するようにして下さい。ツールチェインのコンパイラタグから、デバック情報出力にチェックを入れればOKです。
または、デフォルトセッションにDebugを選択してビルドします。
あとは、ユーザーアプリケーションを作成したプロジェクトをアクティブにして、デバック情報を付加したカーネルライブラリをプロジェクトメンバーに変更し、ユーザーアプリケーションをビルドします。
これで作成されたABSファイル(ELF/DWARF形式)をHTERMに読み込ませれば、ソースウインドウの選択項目に、HOSカーネルのファイルが選択出来るようになります。
但し、注意が有ります。
ユーザーアプリケーションをロードしている最中に、HTERMはファイルの情報からソースコードにアクセスします。当然この様な場合、ファイルへのアクセスは絶対パスで行われるので、このファイルパスが無効になるような操作はできません。つまり、出来上がったABSだけを別のマシンに持って行って、そこでソースレベルデバックを行う事はできないと言う事です。
また、ロード中にソースコードを書き換える事も駄目です。HTERMは、ABSファイル中の行情報を元に、ソースコードと対比を行っているので、行が変更されてしまうと、実際のプログラムとソースコードが一致せず、ブレークを正しく掛けられなくなります。ロード中の編集は、我慢しましょう。
デバック中の注意点としては、
別にHOSに限らない話ですが、タイマー割り込みを使用していると、ステップ実行が出来ない点です。
これは、ステップ実行と言うのが、次に実行するプログラムの位置にトラップ命令を仕掛ける為に起こる問題です。つまりユーザーがあれこれ操作している間にも、タイマー割り込みは継続して動いており、ステップを実行する前に次に実行すべき命令が、割り込み処理になっているからです。もし、タイマー割り込みを使用している状態でステップ実行を行いたいなら、面倒でもブレークを掛けた直後にペリフェラルウインドウから割り込みを停止しておく必要が有ります。
でも私の場合はそんな面倒な操作はせず、ブレークポイントを細かく設定して、ステップもどきでデバックしています。まあ、こっちも面倒といえるかもしれませんが。
秋月のH8 LAN基板(3069F版)のROM上に配置して動かす時のリンカースクリプトの参考、、、上手く表示できるかな
OUTPUT_FORMAT("coff-h8300") OUTPUT_ARCH(h8300h) ENTRY("_startup") MEMORY { vectors : o = 0x0000, l = 0x100 rom : o = 0x0100, l = 0x20000 -0x100 ram : o = 0x400000, l = 0x10000 stack : o = 0xffff20, l = 0x4 } SECTIONS { .vectors : { *(.vectors) FILL(0xff) } > vectors .text : { *(.text) *(.strings) *(.rodata) _etext = . ; } > rom .tors : { ___ctors = . ; *(.ctors) ___ctors_end = . ; ___dtors = . ; *(.dtors) ___dtors_end = . ; } > rom .data : AT ( ADDR(.tors) + SIZEOF(.tors) ){ ___data = . ; *(.data) *(.tiny) _edata = .; } > ram data_size = SIZEOF(.data); .bss : { _bss_start = . ; *(.bss) *(COMMON) _end = . ; } > ram bss_size = SIZEOF(.bss); .stack : { _stack = . ; *(.stack) } > stack .stab 0 (NOLOAD) : { [ .stab ] } .stabstr 0 (NOLOAD) : { [ .stabstr ] } }
秋月のH8 LAN基板(3069F版)のRAM上に配置して動かす時のリンカースクリプトの参考、、、上手く表示できるかな。 この場合デバックモニタのLOADコマンドを使ってRAM上に展開しますが、vectorsの配置は必ずデバックモニタのUSER領域に一致する必要があると言う事です。
OUTPUT_FORMAT("coff-h8300") OUTPUT_ARCH(h8300h) ENTRY("_startup") MEMORY { vectors : o = 0xFFC040, l = 0x100 ram : o = 0x400000, l = 0x200000 stack : o = 0xFFFF20, l = 0x4 } SECTIONS { .vectors : { *(.vectors) FILL(0xff) } > vectors .text : { *(.text) *(.strings) *(.rodata) _etext = . ; } > ram .tors : { ___ctors = . ; *(.ctors) ___ctors_end = . ; ___dtors = . ; *(.dtors) ___dtors_end = . ; } > ram .data : { ___data = . ; *(.data) *(.tiny) _edata = .; } > ram data_size = SIZEOF(.data); .bss : { _bss_start = . ; *(.bss) *(COMMON) _end = . ; } > ram bss_size = SIZEOF(.bss); .stack : { _stack = . ; *(.stack) } > stack .stab 0 (NOLOAD) : { [ .stab ] } .stabstr 0 (NOLOAD) : { [ .stabstr ] } }
H8/3048FでRAM上でHOSのデバックを行いたい方の為に、左のサイドバーにリンクを用意しました。
って、3箇所に書いていますけれど。
by hamayan (2005-10-28 22:58)
初めまして、ITRONプログラミング入門を購入し勉強させていただいてます。
巻末の”HEWによる開発について”で、どうしても分からないことがあります。
最後のビルドでmotファイルを作成する部分がありますが、下記のエラーが発生し、いろいろやってみたのですがどう解決すればよいかわかりません。
L2310 (E) Undefined external symbol "_mknl_rmv_que" referenced in "mwai_tsk"
誠にお手数おかけしますが、ご教授のほどよろしくお願いいたします。
by omorin (2008-04-04 16:08)
エラーメッセージのタイプからルネサスのHEW上でH8かSHの開発をされているものかと思いますが、リンカーが出力したエラーメッセージの内容からmwai_tskの中で参照しているmknl_rmv_queが見つからないと言っています。
HOSのビルドの過程でこの様なエラーメッセージが発生する理由は、HOSのカーネルライブラリの中にmknl_rmv_queが組み込まれていない事が考えられます。
そこでちょっと確認してもらいたいのですが、カーネルライブラリの構成ファイルの中に(HEWの左のペインのソースコードリスト)mrmc_que.cが入っていますでしょうか。
もしカーネルライブラリの構成ファイルに見つからない場合は、このファイルもプロジェクトに追加して、再度カーネルライブラリの再構築をしてからサンプルのビルドを行ってみてください。
なお、HOSのカーネルライブラリに必要なソースファイルは
src/kernelディレクトリ以下の全てのソースと、src/mknlディレクトリ以下の全てのソース、それに使用するマイコンタイプ別のソースと、開発環境別のアドバンスドモードまたはノーマルモードのsrcファイルとなります。
※例えばH8/300Hの3048Fならば、以下のファイルです。
src/h83/chg_imsk.c
src/h83/fchg_imk.c
src/h83/fget_imk.c
src/h83/get_imsk.c
src/h83/pacini.c
src/h83/htc/pacctx.src
src/h83/htc/pacint.src
by hamayan (2008-04-04 17:46)
早急なご返答ありがとうございました。
指摘されれば、”なーんだ”と思うのですが
分かりませんでした。
早速、ご指摘どおり行った結果、無事、motファイルが出来ました。
ありがとうございました。
今後も、この本を大事にしていきます。
by omorin (2008-04-07 08:29)
濱原先生
テキストに採用したいと思い、AKI-H8/3069fLAN 基板でチャレンジしています。//me.me.tokushima-u.ac.jpの3069f用にファイルの中身を変更された情報を参考にやってみまして、makeもh8writeによる書き込みも
successedとなりましたが、動作モードでメッセージがhterm画面に
受信されず。まったく応答のない状態です。
アドバイスをお願いします。
大原荘司
奈良産業大学・情報学部
by 大原荘司 (2008-10-10 14:18)
すいません、これから出なければならないので、回答はお待ちください。
by hamayan (2008-10-10 15:39)
さて、何をやって、何が出ないのか?その辺から教えてもらえないでしょうか。
例えばデバックモニターを焼いたけれど、デバックモニターの初期画面が表示されないとかです。
by hamayan (2008-10-12 13:27)
AKI-H8/3069f LAN 基板を使い、sample.cやgcc.makを3069用に修正を行って、sample.motの作成は成功しています。
h8wirteもsuccessedとなっていますが、実行モードで33ページのような
結果が表示されず、「モニタープログラムの応答がない」となります。
by 大原荘司 (2008-10-23 15:03)
追伸
書き込みはUSBケーブルで行っていますが、パソコンへの返送は
できないのでしょうか。
by 大原荘司 (2008-10-23 15:58)
追伸
USBケーブルをシリアルケーブルに変更しました。
h8writeでsample.motの書き込みは成功しましたが、
htermを立ち上げて、ブートモードにし電源を入れてOK
するとビットレートの調整ができませんとなります。
htermのプロパティ、フラッシュのプロパティともにビットレートは
9600にしております。
by 大原荘司 (2008-10-23 18:04)
追伸
書き込みはh8writeで成功していますので、htermのフラッシュでブートモードにする必要はないわけですが、htermを立ち上げ、ビットレートを
9600にそろえて基板側スイッチを実行モードに変え、電源ONにしましても
33ページのような実行結果がでません。
ファイルのセッションを開くとすると「モニタープログラムから応答がない」と
なります。
ビットレートの設定に問題がありますでしょうか。
by 大原荘司 (2008-10-23 18:19)
まずご存知の様に、3069は自分自身で書き込みプログラムを持っていますので、HOS本で紹介したような書き込み手順ではありません。そのままフラッシュ(R)のブートモードに入ります。
HTERMは、マイコンにデバックモニタが実装されている事を前提に動いていますので、デバックモニタ実行下でなければセッションを開く必要は無いでしょう。単なるターミナルソフトと思ってください。
H8からの応答が無い件については、この内容ではちょっと判らないです。
もしかしたらボーレートが一致していないのかもしれませんし、プログラム自体が動いていないのかもしれません。
もしあれだったら、ソースコード等一式送ってもらえますか。
連絡はここから
http://hamayan.blog.so-net.ne.jp/2008-10-23
by hamayan (2008-10-23 22:31)
素でメアドを曝されるのは色々問題が有るでしょうから、消させていただきました。
連絡先は、上のリンク先の絵の中をご覧下さい。
by hamayan (2008-10-24 20:40)
H8上でプログラムを動かす時の実行形態には二種類が考えられます。
つまりプログラムをH8のROM領域に書き込んでしまう方法と、デバックモニタ-のLOADコマンドを使ってRAM領域に転送後、エントリーポイントにジャンプして動かす方法です。
この二つはHEWならばセクションの設定、gccならばリンカースクリプトで区別されます。
そこで、送られて来たリンカースクリプトを確認させていただき、いったいどちらで動かそうとしているか見てみます。
MEMORY
{
/* vectors : o = 0x0000, l = 0x200
rom : o = 0x0200, l = 0x1fdff
ram : o = 0xffef10, l = 0x1000
stack : o = 0xffff0c, l = 0x4
*/
stack : o = 0xffff0c, l = 0x4
vectors : org =0x400000, len =0x100
}
vect = 0x400000;
ベクター領域が400000番地から開始しています。H8の本物のベクター領域は必ず0番地から開始する必要が有りますが、これはDRAM領域から配置されていると言う事で、デバックモニター上で動かす事を意図しているかと思います。
しかしここまでのやり取りでは「h8writeでsample.motを転送している」との事ですので、そうするとROM領域に書き込む事をなさっていると。
本当のところ、どちらで動かす事を意図されているのでしょう?。
一応参考までに私のリンカスクリプトを本文に掲載しておきます。
by hamayan (2008-10-25 15:28)
ROM書き込みとなるようリンカースクリプトを訂正します。
3069F用デバッグモニターは、ルネサステクノロジー社サイトの
デバッグプログラムHEW(C/C++ Compiler Ver4.0)対応版で
よろしいでしょうか。
by 大原 (2008-10-27 17:16)
いえ、ROM書き込みとなるとデバックモニターは消されて、その上から書き込む事となるので、その時点からデバックモニターは無関係になります。
取り敢えず今はデバックモニタの事は忘れて、ROMに書き込んで実行で宜しいのではないでしょうか。
by hamayan (2008-10-27 18:08)
本文中のROM用リンカースクリプトを用いmake ,h8write ともに通過しました。Sci_PutCharの結果はどのように確認すればよいでしょうか。
sample.c中にprintfを挿入し、syscall.hをインクルードしますと、なぜか
'pirnt'が参照できないといってきます。
by 大原 (2008-10-28 15:12)
printfを使うには標準入出力ライブラリをリンクする必要が有りますが、結局のところ、その標準入出力ライブラリから呼ばれる、低レベル入出力ライブラリを自前で用意する必要があるので、printfを実現するのは面倒だし、しょうがないので自分でSCIに関するプログラムを作ってシリアルから出力するしか無いです。
HOSのsampleのSci_PutCharは、SCIを使ってメッセージをパソコンのシリアルに送るプログラムです。これを参考に3069用に改造すれば良いでしょう。
by hamayan (2008-10-28 15:34)
あれ?「syscall.h」と言うのは何でしょう?。
by hamayan (2008-10-28 15:37)
Sci_Initialize(SCI_57600);とすることで、シリアル送信ができるようになりました。ただ”HOS"は、動作モードに切り替え直後やリセットボタンを押すとすぐにハイパーターミナルに表示するのですが、タイマー値とTask1
の表示がままならず、リセットボタンを押していると突然ズラっと表示したりという現状です。どのあたりに検討が必要でしょうか。
by 大原 (2008-10-30 15:11)
スタックポインタの設定、DRAM周りの初期化は正しく完了されていますよね。
DRAMが動いているとすれば、例えば割り込み処理に問題が有るとかでしょうか。HOSの表示までは割り込みを使用していないので、その可能性が有ります。
宜しければ今度は一式、crt0とかvectorとかも含めて送って頂ければ、中身を見てみます。
by hamayan (2008-10-30 17:43)
ええっと、crt0.sを見たらDRAMの設定がありませんでした。
そこで、こうしましょう!。
h83069rom.xのRAMの配置ですが、内蔵RAMに配置される様に以下の様にしてみてください。
ram : o = 0xFFBF20, l = 0x4000 - 0x200
※syscall.hって判りました。H8/OSのヘッダーだったのですね。
by hamayan (2008-10-31 14:30)
濱原先生
ありがとうございました。テキスト33ページどおりの
動作を確認できました。
by 大原荘司 (2008-11-04 14:53)
他の話題に紛れてしまいましたが、無事動いて良かったです。
また不明な事があれば、ご連絡ください。
by hamayan (2008-11-05 13:55)
STOP!表示のあと入力待ちとなって、'a'でTask1表示が再開される
プログラム、ter_tsk()とsta_tsk()を使ってなんとかできました。
by 大原 (2008-12-02 16:59)
素晴らしいです。
いよいよタスク管理機能を使った協調動作ですね。
by hamayan (2008-12-03 09:00)
久しぶりにご連絡します。テキストを使って実際に演習を始めています。
>make -f gcc.mak の際
h8300-hms-gcc -E -mh -x c system.cfg > system.i
make: /bin/sh.exe:Command not found
make: ***[kernel_id.h] Error 127
となりますがどう対処すればよいでしょうか。
以前成功していた環境にはcygwinをインストールしておりましたので
そのことが関係していると思います。33ページの最初のmakeでは
成功するのですが、次の課題に移り次のmakeでは上記のようになります。
アドバイスよろしくお願いします。
by 大原荘司 (2009-11-24 14:51)
オーム社のダウンロードのページ
http://www.ohmsha.co.jp/data/link/4-274-06604-5/
からhos-v4_for_gcc.zipをダウンロードして確認しているのですが、
/bin/shはシェルの事だとは思うのですが、このダウンロードファイルの中でbin/shを実行しているのはIA32用のサンプルだけです。何故H8用のmakeでこのメッセージが出力されるのか判りません。
もう一度makeを実行しているディレクトリ等を確認してもらえませんでしょうか。
あと、現在の環境についても教えて下さい。
以上、宜しくお願いいたします。
by hamayan (2009-11-24 18:07)
ありがとうございました。
昨年来の正常動作環境のhos-v4_for_gccを演習パソコンにコピーしますと正常動作に改善されました。
根本的原因は不明ですがしばらく様子を見ます。
またよろしくお願い申し上げます。
by 大原荘司 (2009-11-25 15:07)
ありがとうございました。
昨年来の正常動作環境のhos-v4_for_gccを演習パソコンにコピーしますと正常動作に改善されました。サポートサイトからのD/Lの仕方に問題が
あったかもしれません。(演習機はHD交換可能型です)
根本的原因は不明ですがしばらく様子を見ます。
またよろしくお願い申し上げます。
by 大原荘司 (2009-11-25 18:00)
ご報告有難うございます。了解しました。
しかし理由はなんですかね?。
by hamayan (2009-11-26 10:32)
濱原先生
演習機側であらためてオーム社サイトからD/Lいたしまして、h83
の内容のみ正常動作機からコピーし、makeいたしますと
下記のようなメッセージとなりました。
C:\hos-v4\sample\h83>make -f gcc.mak
h8300-hms-gcc -mh -mrelax -nostartfiles -mint32 -nostdlib -Wl,-Map,sample.map -Wl,-Th83069rom.x -L../../lib/h83/gcc -o sample.coff crt0.o vector.o sample.o h8_sci.o kernel_cfg.o ostimer.o -lgcc -lh4h83
ld: unrecognised emulation mode: h8300h
Supported emulations: i386pe
make: *** [sample.mot] Error 1
by 大原荘司 (2009-11-28 13:45)
> unrecognised emulation mode: h8300h
このメッセージはH8用の環境が正常にセットされていないとかで実行されなかった様な気がします。
> Supported emulations: i386pe
からも386用のツール関係を呼び出している様な。
”先生”はちょっと無しでお願いしたいです。
by hamayan (2009-11-28 21:35)
> -mint32
すいません、オリジナルではこのコンパイルオプションは付いていませんが、これを付けて正常に動いていますでしょうか?。
by hamayan (2009-11-28 21:58)
濱原先生
windows7の入ったノートパソコンhos-v4_for_gccとmsysを
コピーして実験しました。msysはHOS雑物庫からテキストのように
D/Lしましたが、インストーラが起動せずdeniedとなりましたので
正常動作するパソコンのファイルをコピーしてPathをきりました。
sample.mot .coff .map ファイルを消去してから make
しますと、
make: h8300-hms-gcc :command not found
make: *** [sample.o] Error 127
となります。この点は演習機でも同じです。
状況のご連絡が適格でなく混乱させていると思いますが、
ご検討よろしくお願いします。
by 大原荘司 (2009-11-28 23:24)
-mint32 オプションは正常動作機のgcc.makに含まれます。演習機で
除きましても、結果はおなじです。
Windows2000ノートパソコンで、msysをインストールして実行しました。
sh.exeのメッセージと[kernel_id.h]Error 127
がおなじように表示されました。
引き出しハードディスクの問題ではなさそうです。
演習機でエラーとなった状態のh83の内容を正常動作機にそのままコピー
しますと。正常動作(system.cfgを変更してもmakeが有効)を復帰します。
by 大原荘司 (2009-11-30 23:16)
あらためてオーム社のダウンロードページからtoolsのアーカイブを落とし、gccのインストーラで自分のパソコンに入れて試しましたが、特に問題無くMAKEが完了しています。
もっとも入れたパソコンには既に色々な環境が入っており、その辺が影響しているかもしれませんので、本日家に帰ってから新たに何も入っていないパソコンを用意し、そこで試してみます。
by hamayan (2009-12-01 08:00)
-mint32オプションはご存知の様にint型を32bitとするオプションです。
H8の汎用レジスタは凝っていて、8bitでも16bitでも32bitでも扱えるようになっていますので、それでint型を32bitにすれば32bitCPU同様に高速となる!みたいな感じでこのオプションを利用される様ですが、実際にそうなのかは微妙です。
つまりアプリケーションによっては32bitサイズのデータをあまり扱わず、ほとんどは16bit以内で済んでしまうかもしれません。
そうなると32bit汎用レジスタの上位16bitはあまり役に立っていないのですから、むしろ無駄な符号拡張ばかり増えて逆に遅くなる可能性もあるかもしれません。
そもそもそんなに高速化するなら、まずルネサスがやっているでしょう。
問題は-mint32オプションを使うのは良いのですが、その場合HOSカーネルも-mint32オプションを付けて再構築しないと、整合性が取れなくなっているかもしれません。
by hamayan (2009-12-01 22:35)
濱原様
ご指摘のように、リダイレクト system.cfg > system.i の処理問題
だったようで、ご指導の処理をいたしますと解決いたしました。
お手数をおかけいたしました。おかげでテキストに沿った演習がつづけられます。ありがとうございました。
大原
by 大原荘司 (2009-12-07 14:15)
濱原 様
はじめまして。
ITRONプログラグの勉強を
始めようとおもい、濱原さんの
「ITRONプログラミング入門」を購入しました。
AKI-H8 3048Fボートをつかって実験しています。
Hewのバージョンは、
C/C++ compiler package for
the H8, H8S, and H8SX family V.7.00
Release 00 (1-25-2010 06:52:39)
です。
質問なんですが、
ITRONプログラミング入門のP75の
スイッチのサンプリングプログラム(tutorial5)の
正常動作を確認した後、
P88のタスク間通信(tutorial6)にとりかかったので
すが、
下記の本書のsystem.cfgの設定ですと、
まったくプログラムが動作しなかったのです。
CRE_TSK(TSKID_TASK_A, {TA_HLNG | TA_ACT, 0, task_SW_Input,
1, 256, NULL});
CRE_TSK(TSKID_TASK_B, {TA_HLNG | TA_ACT, 0,
task_SW_Num_Display, 2, 256, NULL});
CRE_TSK(TSKID_TASK_C, {TA_HLNG | TA_ACT, 1,
task_SW_Num_Display, 2, 256, NULL});
CRE_TSK(TSKID_TASK_D, {TA_HLNG | TA_ACT, 2,
task_SW_Num_Display, 2, 256, NULL});
CRE_TSK(TSKID_TASK_E, {TA_HLNG | TA_ACT, 3,
task_SW_Num_Display, 2, 256, NULL});
そこで、いろいろ実験した結果、
下記のように、system.cfgにおいて、
task_SW_Inputの優先順位を2、
task_SW_Num_Displayの優先順位を1に
変更したところ、正常に動作するようになったのです。
ただ、現在3つのスイッチ入力に応じた処理しか
行われないのです。ここに、
CRE_TSK(TSKID_TASK_D, {TA_HLNG | TA_ACT, 3,
task_SW_Num_Display, 1, 256, NULL});
をつけたすと、ビルドは正常に行われますが、
プログラムが動作しないのです。
HOSさえ出力されません。
4つめのスイッチについて、ハード的に問題はないことは
確認しています。
ここで、質問なのですが、
1)優先順位は誤記でしょうか?
2)4つめのスイッチ入力に応じた処理を
行わせたいのですが、どのようにすればよろしい
のでしょうか?
【正常に動作したときの設定】
CRE_TSK(TSKID_TASK_A, {TA_HLNG | TA_ACT, 0,
task_SW_Num_Display, 1, 256, NULL});
CRE_TSK(TSKID_TASK_B, {TA_HLNG | TA_ACT, 1,
task_SW_Num_Display, 1, 256, NULL});
CRE_TSK(TSKID_TASK_C, {TA_HLNG | TA_ACT, 2,
task_SW_Num_Display, 1, 256, NULL});
CRE_TSK(TSKID_TASK_MONITOR, {TA_HLNG | TA_ACT, 0,
task_SW_Input, 2, 256, NULL});
この実験結果より、ひょっとして評価版では
登録できるタスクに制限があるのでは?と考え、
下記の実験を行いました。
登録できるタスク数に制限があるという考えは
私の勘違いなのでしょうか?
ご多忙とは存じますが、ご教示のほど宜しくお願い申し上げます。
------------------------------------------------------
<実験1>
P43のプログラムをベースに、
タスクを5つにして実行してみたところ、
ハイパーターミナルの出力結果は下記のように、
Task2とTask3しか表示されず、正常に動作しません
でした。
【system.cfg】
ATT_INI({TA_HLNG, 0, Initialize});
CRE_TSK(TSKID_SAMPLE1, {TA_HLNG | TA_ACT, 1, Task1, 1,
256, NULL});
CRE_TSK(TSKID_SAMPLE2, {TA_HLNG | TA_ACT, 2, Task1, 1,
256, NULL});
CRE_TSK(TSKID_SAMPLE3, {TA_HLNG | TA_ACT, 3, Task1, 1,
256, NULL});
CRE_TSK(TSKID_SAMPLE4, {TA_HLNG | TA_ACT, 4, Task1, 1,
256, NULL});
CRE_TSK(TSKID_SAMPLE5, {TA_HLNG | TA_ACT, 5, Task1, 1,
256, NULL});
【ハイパーターミナル】
HOS
00618:Task2
00618:Task3
------------------------------------------------------
<実験2>
今度は、タスクを4つにしてみたところ、
下記のように正常に動作しました。
この実験結果より、評価版ではタスクは4つしか登録できない
ということがわかりました。
【system.cfg】
ATT_INI({TA_HLNG, 0, Initialize});
CRE_TSK(TSKID_SAMPLE1, {TA_HLNG | TA_ACT, 1, Task1, 1,
256, NULL});
CRE_TSK(TSKID_SAMPLE2, {TA_HLNG | TA_ACT, 2, Task1, 1,
256, NULL});
CRE_TSK(TSKID_SAMPLE3, {TA_HLNG | TA_ACT, 3, Task1, 1,
256, NULL});
CRE_TSK(TSKID_SAMPLE4, {TA_HLNG | TA_ACT, 4, Task1, 1,
256, NULL});
【ハイパーターミナル】
・・・
05026:Task1
05033:Task2
05040:Task3
05047:Task4
06031:Task1
06038:Task2
06045:Task3
06052:Task4
・・・
以上
by 木原 (2010-02-09 06:29)
> 登録できるタスクに制限があるのでは?
取り急ぎ、登録できるタスクの制限はありません。
評価版の開発環境がITRONに依存している事は無いからです。
考えられる理由としてはスタックサイズがあります。
全タスクの合計サイズで引っかかってしまっているのか、それとも個々のタスクサイズで問題が有るのか、ちょっと今は判りません。
by hamayan (2010-02-09 17:36)
早々のご回答ありがとうございます。
>考えられる理由としてはスタックサイズがあります
なるほど。スタックサイズを減らして実験してみることにします。
ご教示頂きありがとうございました。
by 木原 (2010-02-09 23:37)
動かないプログラムのmap出力はどのようになっていますでしょうか?。
以上、宜しくお願いいたします。
by hamayan (2010-02-10 09:38)
木原です。
回答がおくれてもうしわけございません。
動かないプログラムのsystem.cfgとmap出力は
下記の通りです。
質問ですが、濱原さんH8 3048Fでテストしたとき、
ボードにはSRAMが増設されていたのでしょうか?
わたしのボードには増設されていません。
-----------------------------------------------------
[system.cfg]
ATT_INI({TA_HLNG, 0, Initialize});
CRE_TSK(TSKID_TASK_A, {TA_HLNG | TA_ACT, 0, task_SW_Num_Display, 1, 256, NULL});
CRE_TSK(TSKID_TASK_B, {TA_HLNG | TA_ACT, 1, task_SW_Num_Display, 1, 256, NULL});
CRE_TSK(TSKID_TASK_C, {TA_HLNG | TA_ACT, 2, task_SW_Num_Display, 1, 256, NULL});
CRE_TSK(TSKID_TASK_D, {TA_HLNG | TA_ACT, 3, task_SW_Num_Display, 1, 256, NULL});
CRE_TSK(TSKID_TASK_MONITOR, {TA_HLNG | TA_ACT, 0, task_SW_Input, 2, 256, NULL});
-----------------------------------------------------
*** Mapping List ***
SECTION START END SIZE ALIGN
VECT
00000000 000000ff 100 2
P
00000100 00001721 1622 2
C
00001722 000017db ba 2
D
000017dc 00001811 36 2
B
00ffef10 00fffe17 f08 2
X
00fffe18 00fffe4d 36 2
--------------------------------------------------------
[追記]
P43のプログラムをベースにタスクを5つにすると
動作しないと報告しましたが、
スタックサイズを下記のようにすべて128に変更すると
正常に動作しました。
CRE_TSK(TSKID_SAMPLE1, {TA_HLNG | TA_ACT, 1, Task1, 1, 128, NULL});
CRE_TSK(TSKID_SAMPLE2, {TA_HLNG | TA_ACT, 2, Task1, 1, 128, NULL});
CRE_TSK(TSKID_SAMPLE3, {TA_HLNG | TA_ACT, 3, Task1, 1, 128, NULL});
CRE_TSK(TSKID_SAMPLE4, {TA_HLNG | TA_ACT, 4, Task1, 1, 128, NULL});
CRE_TSK(TSKID_SAMPLE5, {TA_HLNG | TA_ACT, 5, Task1, 1, 128, NULL});
by 木原 (2010-02-12 07:50)
濱原 様
木原です。
プログラムが動作しました!!
下記のようにスタックサイズを256から128に
変更しました。
めっちゃうれしいです!
ご教示頂きありがとうございました。
ATT_INI({TA_HLNG, 0, Initialize});
CRE_TSK(TSKID_TASK_A, {TA_HLNG | TA_ACT, 0, task_SW_Num_Display, 1, 128, NULL});
CRE_TSK(TSKID_TASK_B, {TA_HLNG | TA_ACT, 1, task_SW_Num_Display, 1, 128, NULL});
CRE_TSK(TSKID_TASK_C, {TA_HLNG | TA_ACT, 2, task_SW_Num_Display, 1, 128, NULL});
CRE_TSK(TSKID_TASK_D, {TA_HLNG | TA_ACT, 3, task_SW_Num_Display, 1, 128, NULL});
CRE_TSK(TSKID_TASK_MONITOR, {TA_HLNG | TA_ACT, 0, task_SW_Input, 2, 128, NULL});
*** Mapping List ***
SECTION START END SIZE ALIGN
VECT
00000000 000000ff 100 2
P
00000100 00001721 1622 2
C
00001722 000017db ba 2
D
000017dc 00001811 36 2
B
00ffef10 00fffb97 c88 2
X
00fffb98 00fffbcd 36 2
以上
by 木原 (2010-02-12 08:09)
動いてよかったです。
前回のmap出力のBセクションとXセクションの合計が3902byteになっていますので、4Kbyteしか無い3048では割込みスタックが不足していたのかもしれません。
沢山のカーネルオブジェクトを作成する場合は、この辺に気をつけてみて下さい。
私もよく「あれ?、動かないなぁ」って嵌ります。
by hamayan (2010-02-12 09:18)
濱原 様
>map出力のBセクションとXセクションの合計が3902byte
今後、動作がおかしい場合は、この合計をみてみることにします。
ご多忙の中、ご教示頂き誠にありがとうございました。
以上
by 木原 (2010-02-12 18:25)