3: 2007-01-26 (金) 14:44:41 |
4: 2007-01-26 (金) 23:09:59 |
| | | |
| COLOR(red){''疑問点:''タスクはかならずしもメモリを別セグメントにして動かすとは限らないことが上記の簡易切り替えで解った。そうなるとメモリ用に1個として、理屈ではタスクは8,190個以上は絶対に作れないということでOKなのか?} | | COLOR(red){''疑問点:''タスクはかならずしもメモリを別セグメントにして動かすとは限らないことが上記の簡易切り替えで解った。そうなるとメモリ用に1個として、理屈ではタスクは8,190個以上は絶対に作れないということでOKなのか?} |
| + | |
| + | ***自動的にタスクを行き来 [#yf41a433] |
| + | -P300のソースはわかりやすい。HariMainがtask_a。task_b_mainはtask_bと見る。 |
| + | -実際のソースよりすこし整理して端折ったソースを載せる。 |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | void HariMain(void) |
| + | { |
| + | (中略) |
| + | |
| + | /*タイマー timer_tsを新設。*/ |
| + | struct TIMER *timer, *timer2, *timer3, *timer_ts; |
| + | |
| + | (中略) |
| + | |
| + | /*新設したタイマーを初期化*/ |
| + | timer_ts = timer_alloc(); |
| + | timer_init(timer_ts, &fifo, 2); /* タイムアウトしたら「2」をFIFOに送るよう設定 |
| + | timer_settime(timer_ts, 2); /* タイムアウト時間を0.02秒に設定 |
| + | |
| + | (中略) |
| + | |
| + | /* 上記は設定。ここ以下のforループがtask_aの本質部分*/ |
| + | for (;;) { |
| + | |
| + | (中略) |
| + | /* FIFOに2が来たら(timer_tsがタイムアウトしたら */ |
| + | if (i == 2) { |
| + | farjmp(0, 4 * 8); /*タスクをtask_bに切り替える |
| + | timer_settime(timer_ts, 2); /*ここに復帰した時、再度タイマーをセットする |
| + | } else if (256 <= i && i <= 511) { /* キーボードデータ */ |
| + | |
| + | (中略) |
| + | |
| + | } |
| + | |
| + | |
| + | void task_b_main(void) |
| + | { |
| + | struct FIFO32 fifo; /*これら構造体は、タイマーを使う |
| + | struct TIMER *timer_ts; /*ために必要なもの。 |
| + | int i, fifobuf[128]; |
| + | |
| + | fifo32_init(&fifo, 128, fifobuf); /*FIFOを初期化して準備する。 |
| + | timer_ts = timer_alloc(); /*そうしないとタイマーが使えないから |
| + | timer_init(timer_ts, &fifo, 1); /*タイムアウトすると1を返してくるタイマー。 |
| + | timer_settime(timer_ts, 2); |
| + | |
| + | for (;;) { |
| + | |
| + | (中略) |
| + | |
| + | i = fifo32_get(&fifo); /*FIFOから一つ数値を得る。 |
| + | io_sti(); |
| + | if (i == 1) { /* タスクスイッチ */ /*もしその通知が1ならタスクスイッチ! |
| + | farjmp(0, 3 * 8); |
| + | timer_settime(timer_ts, 2); |
| + | |
| + | } |
| + | } |
| + | } |
| + | } |
| + | |
| + | -・・・だめだ・・・P304がどうしても理解できない・・・・orz |
| + | |
| + | -「とにかくこの方法でsht_backの値をtask_b_mainに渡せる」と理解しておこう。(これ以上は無理) |
| + | |
| + | |
| + | ***自動タスクスイッチ [#i203f197] |
| + | -上記のソースを見ての通り、これまではお互いのタスクが相手のタスクに切り替わるという動作をしていたが、こういうプログラム部をなくしてもフルオートで切り替えが出来ないものだろうか? |
| + | |
| + | -タスクスイッチ専用の特殊なタイマーを1個確保したと考えればよい。 |