SSブログ

SilentCのCreateTimer関数の使い方 [ColdFire V2]このエントリーを含むはてなブックマーク#

2047506

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プログラミングマニュアルに従う

サイレントシステム社のダウンロードページには、別のマイコンに実装されたSilentCOS-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月号 [雑誌]

Interface (インターフェース) 2008年 09月号 [雑誌]

  • 作者:
  • 出版社/メーカー: CQ出版
  • 発売日: 2008/07/25
  • メディア: 雑誌

nice!(0)  コメント(4)  トラックバック(0)  このエントリーを含むはてなブックマーク#

nice! 0

コメント 4

hamayan

遅巻きながらCreateTimerやってみましたが、やっぱり駄目です。
引数の並びを変えてみたりしても。

なんでマニュアルで説明が異なるのでしょうかね。
と言うか、これ成功した人居るのかなぁ。

タイマーからcallbackできれば色々助かるのに。

by hamayan (2008-09-03 00:04) 

noritan

hamayanさんにも、使えませんでしたか。
「カウンタの参照だけ可能なタイマ」って、何に使えるんでしょうね。

# 今週は、本業逼迫のため、休眠状態です。

by noritan (2008-09-03 08:22) 

hamayan

> 「カウンタの参照だけ可能なタイマ」って、何に使えるんでしょうね。

うーん、そうですね。取り敢えず羊の代わりに数えたら、よく眠れるかも。
私もblogで吠えてみよう。キャン、キャン

by hamayan (2008-09-03 09:07) 

noritan

先ほど確認しましたが、 SilentC (Oct 10 2008) では、 CreateTimer のスクリプト呼び出し機能が動作するようになっていました。理由は不明です。
by noritan (2008-10-13 10:34) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。