eval関数を実現する (2) [ColdFire V2]
前回の記事では、プログラム・ファイルを作成する方法を考えました。 今回は、ファイルを作らずに済む方法を考えます。
タイマに実行させる
ファイルを書き換えるのではなく、もっと手軽な方法はないでしょうか。 「SilentC (Oct 10 2008)版」以降のアップデート版では、 "CreateTimer" 関数で func 引数に指定したスクリプトが動作するように変更されました。 この機能のスクリプトの実行部分だけを利用させてもらいます。
char done; eval(char *func){ char *command; char th; done=0; command=MemoryAlloc(StrLen(func)+32); StrCpy(command, "{"); StrCat(command, func); StrCat(command, ";done=1;}"); PrStr(command);PrStr("\r\n"); th=CreateTimer(0,1,command); while (!done) { SystemSleep(); } CreateTimer(th); MemoryFree(command); }
このプログラムでは、スクリプトの実行が終了したことをグローバル変数 "done" でメインルーチンに知らせています。
OK Main::eval("PrStr(\"HELLO WORLD\\r\\n\");") {PrStr("HELLO WORLD\r\n");;done=1;} HELLO WORLD OK Main::eval("PrStr(\"HELLO WORLD\\r\\n\");") {PrStr("HELLO WORLD\r\n");;done=1;} HELLO WORLD OK
タイマに渡したコマンドは、 "eval" 関数で渡したスクリプトに "done" をセットするステートメントを加えたものです。
何度か実行した限りは、うまく動いているように見えますが、タイマは周期的にスクリプトを実行しようとしますので、メインルーチンが "done" を検出する前にスクリプトの二回目の実行が動いてしまう可能性もあるので、確実に一回だけ実行するためには、タイマに渡すコマンドに "done" がクリアされているときに限りプログラムを実行する仕掛けを入れなくてはならないでしょう。
タイマを使わなくても
スクリプトつき "CreateTimer" 関数でやっているのは、実行すべきスクリプトの保存と内部フラグを立てるコールバックを持ったタイマの起動の二つです。 だったら、スクリプトを保存して、すぐに内部フラグを立てたら、スクリプトが実行されるんじゃないかな。 というわけで、プログラムにしてみました。
long *LibTimerFunc =0x20007F6A; char *LibTimerFlag =0x20007F7A; eval(char *func){ char *command; command=MemoryAlloc(StrLen(func)+32); StrCpy(command, "{"); StrCat(command, func); StrCat(command, "}"); PrStr(command);PrStr("\r\n"); LibTimerFlag[3]=0; LibTimerFunc[3]=command; LibTimerFlag[3]=1; // Invoke while (LibTimerFlag[3]) { SystemSleep(); } MemoryFree(command); }
スクリプト付きタイマは、最大4個まで対応しています。 ここでは、その最後のエントリである3番目を借りました。 "LibTimerFunc" の三番目のエントリにスクリプトを格納し、 "LibTimerFlag" の三番目のエントリを1にセットしてトリガをかけると、スクリプトの実行が始まります。
OK Main::eval("PrStr(\"HELLO WORLD\\r\\n\");") {PrStr("HELLO WORLD\r\n");} HELLO WORLD OK Main::eval("PrStr(\"HELLO WORLD\\r\\n\");") {PrStr("HELLO WORLD\r\n");} HELLO WORLD OK
お、何だかうまく動いているみたいです。 これなら、ファイルも使わないので、安心して使えますね。
参考文献
Interface (インターフェース) 2008年 09月号 [雑誌]
- 作者:
- 出版社/メーカー: CQ出版
- 発売日: 2008/07/25
- メディア: 雑誌
コメント 0