- ベストアンサー
C言語 タイマーのソースについて
C言語でタイマーを使ってprintf文を記述することで 「1秒経過」、「2秒経過」、「3秒経過」のように表示させたいのですが、どのように表示させるのでしょうか? タイマーの間隔は、できれば1 [ms]だとうれしいてす。 回答お願いします
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> まずはC言語のプログラミングでの動作を実証してみてから、 > マイコンへの書き込みを考えています。 といわれても、処理のロジックをパソコンのCで実証するということはありますけど、タイマのようなシステムよりというか、ハードウエアよりのものは、なかなか。 とはいえ、パソコンで秒単位ということであれば、 #include <stdio.h> #include <time.h> int main() { time_t last = time(0); time_t next; int pastSec = 0; while(1) { if (time(&next) != last) { last = next; pastSec++; printf("%d 秒経過\n", pastSec); } } return 0; } こんなので可能です。 同じように標準の time.h や time() 関数があれば、同じように動きますが。 と書きましたが、実際の所、このコードも、http://okwave.jp/qa/q6396223.html で書いたコードもそっくりさんではあるのですね。 time() 関数が1秒ごとに異なる数値を返せば、とりあえず、このプログラムは動くわけです。 たとえば、 volatile int m10Count; void m10Int() // この関数は 10ms 間隔で割り込まれる { m10Count++; m10Count %= 10000; // オーバーフロー対策(時間の長さによってはこれ必須) } time_t time(time_t *timer) { *timer = m10Count / 100; return *timer; } とすれば、1秒単位程度であれば、main() は、同じコードで動かすことができます。
その他の回答 (3)
> 指摘された質問と同じものです。 > まずはC言語のプログラミングでの動作を実証してみてから、 > マイコンへの書き込みを考えています。 なんとなく。 本当に必要なのは,C言語でどうこうではなくて, マイコンの周辺デバイスの使い方とか,レジスタの設定の仕方といった, 低レベル(ハードウェアに近いという意味です)な話ではないのでしょうか?
処理系に依存した方法になります。 どのような環境でしょうか? ↓と関係ありますか? http://okwave.jp/qa/q6396223.html
- rinkun
- ベストアンサー率44% (706/1571)
幾つかの課題がある。 まず、printfで書くというのは、表示ごとに行を進めていくの? それとも同じ位置で数値だけ書き換えるの? 前者だったら、タイマ周期でprintfを呼び出すだけ。後者だとコンソール依存になる。コンソールの持つカーソル制御機能を使うので。 次に、タイマーの周期。1秒周期だとsleep関数などで比較的簡単に実装できる。ミリ秒単位だとリアルタイムOSでないとタイマー待ちでは難しい。OSの最小タイマ刻みが10ミリ秒とかいうことが平気であるので。そうすると待てないのでループで時刻を監視して表示更新(いわゆるビジーウェイト)という方式になるが、これでもディスクアクセスなどOS処理にCPUが取られて1ミリ秒周期を守り続けることは難しくなる。
お礼
すばやい回答ありがとうございます。 最初にprintf文は表示ごとに行を進めたいと思っています。 また、タイマーの周期なのですが、1秒が簡単にできるのであれば、まずは周期1秒からはじめてみたいと考えています。 プログラムのソースの例だけでも、よろしかったら記述お願いします。
補足
何度も回答ありがとうございます。 指摘された質問と同じものです。 まずはC言語のプログラミングでの動作を実証してみてから、 マイコンへの書き込みを考えています。