SilentCのCreateTimer関数の使い方 [ColdFire V2]
SilentCには、システムコールと呼ばれる関数が定義されています。 その中にタイマ機能というものがあり、CreateTimer()関数で起動するとされています。 今日は、このタイマ機能の使い方を探ります。
Interface誌の記述に従う
インターフェース誌には、CreateTimerの定義が一覧表にちょっとだけ書いてあります。 funcには、文字列で関数を指定するのですね。
main(){ char th; th=CreateTimer(0,100,"Main::pr"); PrNum(th);PrStr("\r\n"); #stop 0 for(;;){ if (Getc(0)=='q')break; SystemSleep(); } } pr(){PrStr("Hello World\r\n");}
タイマの作用で、1秒ごとに"Hello World"が表示されると思っていたのですが、ハングしてしまいました。 このプログラムは、CreateTimerさえ入れなければ動作します。 明らかに、CreateTimerの使い方に問題があるものと思われます。
OS-1プログラミングマニュアルに従う
サイレントシステム社のダウンロードページには、別のマイコンに実装されたSilentCのOS-1プログラミングマニュアルがあります。 このマニュアルには、システムコールの紹介とそのプログラム例が記述されています。 あれ? funcには、一般的なステートメントが書けることになっていますね。 さっそく、MCF52233付録基板用に変更して走らせて見ました。
main(){ char th; th=CreateTimer(0,100,"pr();"); PrNum(th);PrStr("\r\n"); #stop 0 for(;;){ if (Getc(0)=='q')break; SystemSleep(); } CreateTimer(th,0,0); } pr(){PrStr("Hello World\r\n");}
やっぱり、これもハングしたまま、帰って来ませんでした。
OS-1ユーザーズマニュアルに従う
サイレントシステム社のダウンロードページには、もう一つ、OS-1ユーザーズマニュアルという文書があります。 この文書には、SilentMoonのシステムコールと題してCreateTimer関数の定義が書いてあります。 ありゃりゃ? 引数が多いな。 スタックサイズを指定せよ? この書式に従って、パラメータを整えて、実行してみました。
main(){ char th; th=CreateTimer(3,Main::pr,100,0,256); PrNum(th);PrStr("\r\n"); #stop 0 for(;;){ if (Getc(0)=='q')break; SystemSleep(); } CreateTimer(0,0,0,th,0); } pr(){PrStr("Hello World\r\n");}
実行すると、"HelloWorld"と表示されました。 しかし、これは、CreateTimerの引数として"Main::pr"を与えようとしたときに"Main::pr"のアドレスを渡す代わりに"Main::pr"を実行してしまったためでした。 その後、タイマ・ハンドルとして"3"を返してきましたが、これもCreateTimer関数の第一引数が戻ってきているに過ぎません。 従って、第一引数はタイマ・ハンドルが入るべきであり、ユーザーズマニュアルに書いてある定義ではないのだろうと思われます。
もう一度プログラミングマニュアルに戻る
再度、プログラミングマニュアルに従った記法を試します。 ただし、今度は関数を与えずにカウンタの値を監視してみます。
main(){ char th; th=CreateTimer(0,100,0); PrNum(th);PrStr("\r\n"); while(GetTimerCount(th)>0){ PrChar('*'); Sleep(1); } CreateTimer(th,0,0); }
このプログラムを実行すると、一秒の間、100個のアスタリスクを表示してくれました。 どうやら、こういう使い方なら出来るようです。 でも、これではタイマを使う意味が無いから、コールバック関数を呼び出すようにしたいよな。
CreateTimerの正しい使い方、教えてください
こんなわけで、CreateTimerをうまく使う方法が見つかりませんでした。 出版社やサイレント・システムに問い合わせるのは違反らしいから、ここで吠えてみます。
参考文献
まだ、在庫あるそうです。
Interface (インターフェース) 2008年 09月号 [雑誌]
- 作者:
- 出版社/メーカー: CQ出版
- 発売日: 2008/07/25
- メディア: 雑誌
遅巻きながらCreateTimerやってみましたが、やっぱり駄目です。
引数の並びを変えてみたりしても。
なんでマニュアルで説明が異なるのでしょうかね。
と言うか、これ成功した人居るのかなぁ。
タイマーからcallbackできれば色々助かるのに。
by hamayan (2008-09-03 00:04)
hamayanさんにも、使えませんでしたか。
「カウンタの参照だけ可能なタイマ」って、何に使えるんでしょうね。
# 今週は、本業逼迫のため、休眠状態です。
by noritan (2008-09-03 08:22)
> 「カウンタの参照だけ可能なタイマ」って、何に使えるんでしょうね。
うーん、そうですね。取り敢えず羊の代わりに数えたら、よく眠れるかも。
私もblogで吠えてみよう。キャン、キャン
by hamayan (2008-09-03 09:07)
先ほど確認しましたが、 SilentC (Oct 10 2008) では、 CreateTimer のスクリプト呼び出し機能が動作するようになっていました。理由は不明です。
by noritan (2008-10-13 10:34)