Forums: Help (Thread #8619)

3つめのタスクが動かない? (2005-09-05 10:50 by miw #16262)

miwです。
AkiーH8/3052Fとマザボードでいろいろ試してます。
HOSのお勉強の教材をつくろうと思っているのですが、秋月のマザーボードが使えると、面倒がなくていいですね。
beshioさん、ありがとうございます。

いろいろとサンプルを作ってみました。
http://www.wakayama-u.ac.jp/~miw/linux/pukiwiki/pukiwiki.php?HOS%CE%FD%BD%AC%A5%B3%A1%BC%A5%B9

さて、このページに添付したTimerTest2.LZHですが、
hamayanさんのサンプル、tutorial10を元にして、
  1.SCIとLCDへメッセージを表示するタスクOutTask
  2.マザーボードのスイッチを監視してLEDの点灯・消灯をするタスクSwitchTask
A.ITU1の割り込みでOutTaskを起こす。
というプログラムをつくりました。

これのタスク1を
  1’.メッセージを文字列bufにいれてSCIに表示するタスクOutTask
と変更し、
  1’.SCIへメッセージを表示するタスクOutTask
  2.マザーボードのスイッチを監視してLEDの点灯・消灯をするタスクSwitchTask
  3.文字列bufをLCDに表示するタスクLCDTask
A.ITU1の割り込みでOutTaskを起こす。
と3つ目のタスクを追加しました。
2,3はwhileループでまわしております。



system.cfgのこの部分
/* サンプルプログラム */
ATT_INI({TA_HLNG, 0, Initialize});
CRE_TSK(TSKID_OUT, {TA_HLNG, 1, OutTask, 1, 128, NULL});
CRE_TSK(TSKID_SWITCH, {TA_HLNG, 2, SwitchTask, 2, 128, NULL});
CRE_TSK(TSKID_LCD, {TA_HLNG, 3, LCDTask, 3, 128, NULL});

でタスクの優先度を
  1.OutTask
  2.SwitchTask
  3.LCDTask
とすると、LCDが表示されません。

また、
  1.OutTask
  2.LCDTask
  3.SwitchTask
とすると、LEDが点灯しません。

さらに、
  1.SwitchTask
  2.LCDTask
3.OutTask
とすると、SCIへの出力がありませんし、bufの更新がないのでLCDも表示されません。

さらに、
  1.LCDTask
  2.SwitchTask
3.OutTask
とすると、SCIへの出力がありませんし、bufの更新がないのでLCDも表示されません。
スイッチも利かなくなっちゃいました。

これは、RAM上の実行でも、ROMに焼いての実行でも起こりました。


同様に、サーボモータを回すサンプルは
  1.SCIに表示するTask1
  2.LCDに表示するTask2
A.ITU1の割り込みハンドラA:PWM信号を生成
B.ITU1の割り込みハンドラB:PWM信号を生成、ITU1.GRBの更新
C.ITU2の割り込みハンドラA:A/D変換、0.5秒ごとにTask1をおこす。
としていて、動作するのですが、これに、

3.マザーボードのスイッチを監視してLEDの点灯・消灯をするタスクSwitchTask

を追加すると、優先度を3番目にしたTaskが実行されないです。


私のところでは、
1.ITUの割り込みハンドラで起動されるTaskは動く?
2.でも、登録されたTaskは2番目までしか動かない
ということになっているようです。
また、最後の場合ですと、割り込みハンドラで起こされるTaskが3番目以降の優先度だと、
ほかのTaskもこけている、ということかもしれません。

なにか、設定をまちがえているでしょうか?

Reply to #16262×

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: 3つめのタスクが動かない? (2005-09-05 11:16 by hamayan #16263)

プログラムを拝見させていただきました。

SwitchTaskとLCDTaskですが、見る限り共に内部でディスパッチを起こさせるようなサービスコールが使われておらず、優先度を2としたタスクから、優先度3のタスクへのCPU実行権の移譲が起こっていません。つまり、現状の動作は正しいと言えます。
RTOSでは、プログラマー自ら全てのタスクに最適なスケジューリング決定する必要が有ります。

そこでこうしてみては如何でしょうか。

SwitchTaskを優先度2、LCDTaskを優先度3とし、LCDTaskはそのまま、SwitchTaskのwhileループの一部にdly_tsk(100)を入れて、100m周期のポーリングとする。
スイッチは人が操作する事が前提なので、この位の周期でも充分実用になります。
Reply to #16262

Reply to #16263×

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: 3つめのタスクが動かない? (2005-09-05 13:36 by Anonymous #16264)

miwです。

hamayan様:
そうか、僕がディスパッチの設定を忘れていましたね。
なんとなく、whileループが一回でディスパッチがおこると勘違いしてました。
#BCBだと、Application->ProcessMessage()を呼び出すところですね。
教えていただいた方法でうまくいきました。
ありがとうございました。
Reply to #16262

Reply to #16264×

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