Forums: Help (Thread #23796)

H8/36064での使用 (2009-09-03 22:30 by o_yamamoto #45689)

初めまして.
H8/36064を使用したボード(Vstone社VS-WRC003)上でHOSの利用を考えております.
「ITRONプログラミング入門」第2章最初のサンプルプログラムを動かそうとしておりま
すが上手く動作せず,皆様にご教授願えればと思い投稿させて頂きました.

症状は,

HOS
00000:Task1

が約0.2秒位の間隔で繰り返し表示され,次のような表示になってしまうというものです.

HOS
00000:Task1
HOS
00000:Task1
HOS
00000:Task1
…(繰り返し)

ビルドにはGCC(h8300-binutils-2.13.2.1)を使用し,
プログラムはFDT4.30によりROMに書き込んで実行しています(モニタは不使用).
各種ファイルのCPU依存部分は次のように変更しました.

src/h83/gcc/pacintn.s

.global _hos_vector025
+ .global _hos_vector026
+ .global _hos_vector027
+ .global _hos_vector028
+ .global _hos_vector029
+ .global _hos_vector030
+ .global _hos_vector031
+ .global _hos_vector032
+_hos_vector026: push.w r0
+ mov.b #26, r0l
+ bra int_handler:16
+_hos_vector027: push.w r0
+ mov.b #27, r0l
+ bra int_handler:16
+_hos_vector028: push.w r0
+ mov.b #28, r0l
+ bra int_handler:16
+_hos_vector029: push.w r0
+ mov.b #29, r0l
+ bra int_handler:16
+_hos_vector030: push.w r0
+ mov.b #30, r0l
+ bra int_handler:16
+_hos_vector031: push.w r0
+ mov.b #31, r0l
+ bra int_handler:16
+_hos_vector032: push.w r0
+ mov.b #32, r0l

sample/h83n/system.cfg

-HOS_MAX_INTNO(23); /* 使用する割り込み番号の最大値(省略時 0)
+HOS_MAX_INTNO(32); /* 使用する割り込み番号の最大値(省略時 0)
-ATT_ISR({TA_HLNG, 0, 19, OsTimer_TimerHandler});
+ATT_ISR({TA_HLNG, 0, 29, OsTimer_TimerHandler});/*タイマTB1の割り込みNo.*/

sample/h38n/h83664.x

- vectors : o = 0x0000, l = 0x0034
- rom : o = 0x0034, l = 0x7fcc
+ vectors : o = 0x0000, l = 0x0042
+ rom : o = 0x0042, l = 0x7fbe
- .text 0x0034 : {
+ .text 0x0042 : {

sample/h38n/ostimer.c

/*TAでなくTB1を用いることは,オーム社開発部を通じ,著者の方にお教え頂きました*/
/*誠にありがとうございました*/
- TA.TMA.BYTE = 0x03;*/ /* 00000011 */
+ TB1.TCB1 = -236; /* ( = 14745600L / 512 / 122 * (-1) )オートリロード値(8.192ms)*/
+ TB1.TMB1.BYTE = 0x80 | 0x02; /*オートリロード有効、φ/512*/
- IENR1.BIT.IENTA = 1; /* タイマ割り込み許可 */
+ IENR2.BIT.IENTB1 = 1; /*タイマ割り込み許可 */

/* 割り込み要因クリア */
- IRR1.BYTE &= 0xbf;*/ /* 10111111 */
+ IRR2.BIT.IRRTB1 &= 0;

sample/h38n/vector.s

.word _hos_vector025
+ .word _hos_vector026
+ .word _hos_vector027
+ .word _hos_vector028
+ .word _hos_vector029
+ .word _hos_vector030
+ .word _hos_vector031
+ .word _hos_vector032

sample/h38n/h8t_sci.h
- /* SCI通信速度定義 (16MHzのとき) */
- #define SCI_2400 207
- #define SCI_4800 103
- #define SCI_9600 51
- #define SCI_19200 25
- #define SCI_31250 15
- #define SCI_38400 12
- #define SCI_57600 8 /* 誤差 -3.5% ぎりぎりいけるかも (^^;; */

+ /* SCI通信速度定義 (14.7456MHzのとき) */
+ #define SCI_2400 191
+ #define SCI_4800 95
+ #define SCI_9600 47
+ #define SCI_19200 23
+ #define SCI_31250 14
+ #define SCI_38400 11
+ #define SCI_57600 7


ostimer.c内のタイマ割り込みハンドラ中に
Sci_PutChar('*');
を追加すると

****************HOS
00000:Task1

のように表示されるので,タイマ割り込みはかかっているようです.
また,sample.cにおいてTsk1内のfor文の先頭にdly_tsk(1000);を
持ってくると,文字列HOSのみが繰り返し表示されるため,dly_tskが
正しく動いていないようです.

宜しくお願い致します.

Reply to #45689×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: H8/36064での使用 (2009-09-04 09:47 by hamayan #45693)

はじめまして。と言いますか、ご購入ありがとうございます。

ちょっと確認させてください。

> +_hos_vector026: push.w r0
> + mov.b #26, r0l
> + bra int_handler:16

元々のソースは8bit相対で繋いでいますが(bra int_handler:8)、
全て16bit相対に変更していると言う事でしょうか。


すいません、こういうビット操作はした事が無いのですが、
> + IRR2.BIT.IRRTB1 &= 0;

アセンブラレベルではどう言ったコードに変換されるのでしょうか。
ちなみに0の代入なら
IRR2.BIT.IRRTB1 = 0;

よろしくお願いいたします。
Reply to #45689

Reply to #45693×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: H8/36064での使用 (2009-09-04 10:19 by hamayan #45695)

一つ思い出しました。

> HOS
> 00000:Task1
>
> が約0.2秒位の間隔で繰り返し表示され,次のような表示になってしまうというものです.

確かこの型番のH8は初期状態でWDTが有効になっていた筈です。
マニュアルを読むと約14MHzのCPUクロックなら大体140ms周期でリセットが掛かるはずです。
WDTを解除するには起動直後、例えばcrt0内か、mainに入った直後にWDTを無効化するか、逆にWDTの延長処理を行う処理を追加する必要が有ります。

これら処置は行っているでしょうか?。

※延長処理を行うのは、一例としてIDLE LOOP内に書くと良いかもしれません。
Reply to #45689

Reply to #45695×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: H8/36064での使用 (2009-09-04 12:47 by o_yamamoto #45699)

hamayan様

対策をご教授頂きまして大変ありがとうございます.
下記コードをmainの冒頭に加えてWDTを止めた所,無事動作しました.
WDT.TCSRWD.BYTE = 0x80; /*bit5=0(bit4への書き込み有効)*/
WDT.TCSRWD.BYTE = 0x90; /*bit4=1,bit3=0(bit2,0への書き込み有効)*/
WDT.TCSRWD.BYTE = 0x90; /*bit2=0(WDT停止)*/
私一人では,WDTが初期状態で有効になっていることには永久に気付けなかったと思います.
ありがとうございました.

>元々のソースは8bit相対で繋いでいますが(bra int_handler:8)、
>全て16bit相対に変更していると言う事でしょうか。

ご指摘の部分は全て16bit相対に変更しています.というのも,pacint.sの方では
一旦8bitで中継点に飛ばしてから16bitでint_handler1に飛ばしていたもので,
pacintn.sの方でもベクタが増えると飛べなくなるかと思ったからです.8bitで十分でした.
当時焦っていてよく考えずに変更してしまいました.

>すいません、こういうビット操作はした事が無いのですが、
>> + IRR2.BIT.IRRTB1 &= 0;
>
>アセンブラレベルではどう言ったコードに変換されるのでしょうか。
>ちなみに0の代入なら
>IRR2.BIT.IRRTB1 = 0;

これもなんとなくAND演算にしてしまいました.小さなプログラムで今確認しましたら,
上のどちらも同じand命令
and #-33,r2l
に変換されていました.

ここ数日の悩みが解消されました.
厚く御礼申し上げます.ありがとうございました.
Reply to #45689

Reply to #45699×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login