• 締切済み

C言語によるウェイト

C言語による正確な時間を定めたウェイト(例えば100msのウェイト)の挿入方法を探しています。 C言語でのウェイトの挿入方法を調べたところ、for文等で挿入できるのはわかったのですが、時間の求め方までわかりませんでした。 時間の求め方で調べたところ、アセンブラなら命令のステート数とクロック周波数より求める方法を知りました。 ですがアセンブラでの方法ではなく、C言語での時間の計算方法を覚えたいと思います。 些細な事でもかまいませんので、ご回答頂ければと思います。 どうぞ宜しくお願いします。

みんなの回答

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.12

>そうはいっても、やはりタイマ割り込みがサンプルに入っていればそれを利用するのが手っ取り早いのですが・・・ 確かにその通りなんですけど質問者さん次第ですね。 質問者さんが、今タイマ機能に挑戦する気があればですが、初めての人に割り込み機能は難易度高く見えますからね。

全文を見る
すると、全ての回答が全文表示されます。
  • matyrcry
  • ベストアンサー率47% (101/213)
回答No.11

そうはいっても、やはりタイマ割り込みがサンプルに入っていれ ばそれを利用するのが手っ取り早いのですが・・・ ベタ待ちで計時するなら、十分な長い時間を費やすループを作っ てストップウォッチで測るのがいいです。 LEDの明滅でループの開始と終了を確認できるようにしておけ ば、目視計測できますよね。 計測誤差は0.5秒以下として、1分くらいの時間を計測すれば 誤差1%以下で測ることができますから、結果を見てループ回数 を調整すればいいだけです。 みみっちい時間を計時する時はオシロスコープでLEDの信号線 を読むことが多いですが、それほど厳密でないならこういうアバ ウトな方法もよく使いますよ。

全文を見る
すると、全ての回答が全文表示されます。
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.10

>マイコン環境なら、CPUのタイマモジュールを使って10ms程度の定周期割り込みを作ってありませんか? AKI-H8-USBですので、そのまま使っているとカーネルと言うかOSは走っていないと思います。ですのでタスクとかsleepとか使えません。>matyrcryさん。>lringollさん。 質問者さんが自分でOS入れていれば別ですが、質問者のhemuruさんの状況ではCPUループで回しても害が無いかと。

全文を見る
すると、全ての回答が全文表示されます。
  • matyrcry
  • ベストアンサー率47% (101/213)
回答No.9

マイコン環境なら、CPUのタイマモジュールを使って10ms程度 の定周期割り込みを作ってありませんか? 一定時間の待ち処理には、ベタ処理ループを回して時間を稼ぐ方法と、 スリープ、セマフォなどのカーネル制御によるタスク休眠があります。 カーネル制御の関数はタイムアウト時間を設定できるものが用意され ているはずなので、休眠時に時間設定して、他所から起床コールを行 わなければ指定時間経過で起床します。 ベタ処理で経過時間を計測したいのであれば、タイマ割り込みで経過 時間をグローバル変数を使ってカウントし、下層のタスクでカウント が整うまでの待ちループを作れば時間待ちになりますが、ベタの待ち 処理はそれ以下のタスクの時間資源を食いつぶすので注意が必要です。

全文を見る
すると、全ての回答が全文表示されます。
回答No.8

邪道な回答になるので,あくまで参考程度に. 私も0.1msec単位のループ制御をしたいと思っていたのですが, sleepではどうやら(分解能は1msecですが)10msec程度の精度しかなく困っていました. アッセンブラを用いた方法を見つけはしたのですが,アッセンブラの理解もなく,手詰まりになりかけました. で,私が取った道は, 『ファンクションジェネレータ(信号発生器)とカウンタボードを組み合わせて時間の管理をする』 といった方法です. プログラミングを専門とされている方からすると色々あるのでしょうが,機械系の学生なのでそんな方法を取らせていただきました. 現状,0.1msecならまったく問題なく処理できています. この方法の利点は,アッセンブラなどを使わなくても簡単に高精度な時間管理が出来ることです. しかし,FGとカウンタボードが無いとできないことと,あまり美しいものではないと思います. 少し的外れだったかもしれませんが,参考になれば.

hemuru
質問者

お礼

今回の状況からしますと、ご回答頂いた内容のことまではできないのですが、 一つの方法として頭に留めておきたいと思います。 ご回答ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.7

>数nsのウェイト H8マイコンでは気にしなくて良いです。高速なマイコンやFPGAやCPLDで制御するなら気にしてほしいですが。SC1602では、それよりも長いウェイトが必要な制御がありますよ。 ともかく実際に使っている方のサイトが参考になると思います。 http://tokyo-ct.net/usr/kosaka/for_students/H8/AKIH8_LCD/AKIH8_LCD_gcc.html 簡単に検索できるサイトですが、こういうのは参考にならないんでしょうか?

hemuru
質問者

お礼

数nsのウェイトについては ご回答読ませていただいた後解決する事ができました。 LCDの駆動については 最初の返信後自らも調べ、現在実際に動かしながら学習しているところです。 添付していただいたサイトも参考にさせて頂きたいと思います。 最初質問させて頂いた際、手元にあった本とLCD説明書ばかり読んでいた事と、本にあったプログラムで上手くいかなかった事からこのような内容になってしまいました。 今回学ばせていただいた事今後役立てていきたいと思います。 再度ご回答ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.6

> 各信号間で数nsのウェイトが必要とあったので AKI-H8/3048Fでは、最大でもクロック周波数が16MHzしかありません。 したがって、nop命令1つでも数十ns以上かかるので、数ns精度のウェイトを入れるのは無理です。 > 各信号間で そもそもそれらの信号はソフトウェアで制御すべきものなのですか?

hemuru
質問者

お礼

参考としてURLを添付させていただいたうちのLCD説明書に 各信号の制御がこの条件を満たすようにプログラミングしてください。 とあり、ソフトウェアでの制御が必要と思っていました。 数nsのウェイトについてですが 1サイクル62.5nsとあり不可能であることに 読んでいたにも関わらず質問していた事、申し訳有りませんでした。 再度ご回答ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.5

処理系を特定しないのであれば、time関数を用いてウェイトをかけるしかありません。 なお、clock関数はCPU使用時間なので、実時間を計測するには不向きです。

hemuru
質問者

お礼

たくさんのご回答ありがとうございます。 大変申し訳有りませんが、こちらのご回答にまとめさせて頂きます。 補足について 現在、AKI-H8-USBという開発キットを用いLCDの制御プログラムを製作しようとしていました。使用している環境としまして、 CPU:H8/3048 コンパイラ:GCC(関係あるかわかりませんが、PCのOSはXP使用) LCD:SC1602BS*S となっています。 ご回答の中に無駄に資源を使わないとありましたが、 LCDの説明書の書き込みタイミングのところにおいて、各信号間で数nsのウェイトが必要とあったので、C言語で正確なウェイトを持たせる方法を質問させて頂いたところでした。 H8/3048を使用しているので内蔵タイマについて調べてみようと思いますが、内蔵タイマについてもご回答いただけるようであれば幸いです。 補足においても足りない事がありましたら追記していきたいと思いますので宜しくお願いします。 AKI-H8-USB開発ボードキット http://www.aki-den.jp/kit_manual/%83%7D%83C%83R%83%93%8A%D6%8CW/A16_H8-USB.pdf H8/3048ハードウェアマニュアル http://www.mech.ibaraki.ac.jp/~masuzawa/j602093_h83048.pdf LCD説明書 http://www.oaks-ele.com/oaks_board/oaks16/data/lcd/man_sc1602.pdf

全文を見る
すると、全ての回答が全文表示されます。
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.4

>C言語でのウェイトの挿入方法を調べたところ、for文等で挿入できるのはわかったのですが、 今時のCPUではこの方法は推奨されませんと言うか出来ません。Z80マイコンレベルなら可ですが。 環境がgccならsleep()やusleep()でウェイトさせます。ただし、マルチプロセスで動いているので正確には時間を刻めません。 組み込み系マイコンなら内蔵タイマを利用して正確に時間をコントロールするのが一般的です。ともかく開発の環境が正確に分らないと答えようが無いですね。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

「CPU の処理時間」という貴重な資源を「なにもしない」ということに無駄に使ってはいけません. 使っている「C言語」によりますが, #2 に言われるように sleep系かタイマイベント系の API を使うのがきっと正しい. もちろん「厳密に正確なウェイト」は入らないけど, 今どきのプロセッサならそれはどんな方法を使っても同じこと. だいたい, キャッシュとかはいったらその時点でもう「正確なステート数」は無意味に近い.

参考URL:
http://ja.wikipedia.org/wiki/%E3%83%93%E3%82%B8%E3%83%BC%E3%82%A6%E3%82%A7%E3%82%A4%E3%83%88
全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 割り込みベクターをC言語で書きたい

     皆さん、有難う御座います。時々質問させて頂いています。  今回は、ベクターアドレスをC言語で書く方法について質問します。  ルネサスのH8マイコンを使っています。モニターを使うとRAM上に割り込みの仮想ベクターを作れます。  仮想ベクターには、割り込みのジャンプ先アドレスが書かれます。  現在アセンブラで書いているのですが、C言語で書く方法は無いでしょうか。  二つの方法で書きたいと思っています。  アセンブラで次の二つの方法に相当するC言語命令を知りたい。 (1)ORGとEQU命令を使った方法 (2)ムーブ(Z80ならロード)命令で関数のアドレスをメモリに書く方法  ルネサスにはHEWと言うソフトが有りますが、HEW特有の命令によらず、一般的なコンパイラが持っている機能で実現したい。  以上宜しくお願いします。

  • アセンブラ言語がわかりません。

    初心者です。まとを得ていない質問でしたらすみません。 C言語は理解できる程度なのですが、アセンブラのコードを書く事ができません。 今アセンブラ言語を学び始めた所ですが、「jr」「jarl」「jmp」などの分岐命令の指定の方法がわかりません。 C言語でいうとどういうコードを書いた時に、このような命令を出力できますでしょうか。 本を読んでも、この上記の命令の意味は書いてあるのですが、実際出力が出来なかったもので。 またアセンブラ言語を学ぶためにいい方法などありましたらお教えく頂けないでしょうか。 よろしくお願いします。

  • C、C++、Peal、PHPその他「高級言語」といわれる言語について

    僕はPICマイコン(16シリーズ)を趣味で使っており 言語はアセンブラを使っています。 で、質問なんですが最近ホームページを作りたくなり LINUXの勉強も含め自宅サーバーを立ち上げCGIをやってみようと思いました。 で、CGIといえばPealだろと思っていたので、その手の入門書や ネットの情報を見ると冒頭には大抵「大して難しくない」的な事が 書いてありました。 実際にやってみたんですがチンプンカンプンでした。 イメージとしては下記のような感じなんだと思うんですが マイコンのアセンブラと比べたらよっぽど低級言語な気がしてなりません。 アセンブラ=低級言語=人間にわかり難い C、C++等=高級言語=人間に解り易い アセンブラもはじめはチンプンカンプンでしたが、ある程度理解してしまえばそれなりに使いこなせるようになりました。 マイコンのアセンブラは命令数も少ないしイエスかノーだけで「もしも~」とかないので単純といえば単純なんですが・・・ 質問1 高級言語の「人間に判りやすい」っていうのは具体的にどういうことなんでしょうか? 質問2 最近やたらとPHPが流行ってる気がします。 もうPealは廃れてしまったんでしょうか?

    • ベストアンサー
    • Perl
  • マイコンのステート数

    こんばんわ。今、マイコンを勉強しています。 使用しているマイコンはATC-80ZIIです。 マイコンでプログラムを組んで実行した時にかかる時間(実行時間)を計算で求める方法を調べています。実行時間を求める方法はステート数にクロック周期(クロック周波数の逆数)をかけるという事は知っているのですが、各命令に対してかかるステート数がわかりません。例えば00HをAレジスタに転送する場合、(LD A,00H)のステート数は7らしいです。本に載っていると思って調べてみたんですが見つからなかったのでここに質問しました。どこかに表とかに一覧で載っていないでしょうか? よろしくお願いします。

  • アセンブリ言語について。

    CPUを直接操作するうなプログラムは高水準言語では作れないので低水準言語が必要になります。 CPUをスリープ状態にするHLT命令はアセンブラにはありますがC言語などの高水準言語には無い機能ですから、アセンブラを使ってプログラムを書かないと実現できません。というのは、合っていますでしょうか?教えていただけないでしょうか?すみません。

  • C言語でPICマイコン開発

    今までずっとアセンブラを使い開発していたのですが、XC8コンパイラ+MPLABで C言語を使い開発したいと思っています。 以下の点について教えていただければ助かります。 ・タイマー割り込みについて アセンブラで書く場合、プリスケーラの設定などから計算して 一回の割り込み内で何命令まで書けるかがわかるため割り込みの最中に 再度割り込みが発生するようなことは避けられますが Cで書く場合はどのように回避するのでしょうか? ・コンフィギュレーションの設定の仕方 アセンブラでは__CONFIG _HS_OSC & _CP_OFF ・・・のように書きますが Cではどのように書くのでしょうか。 C言語はわかるので取っ掛かりの部分がわかれば後はすいすいいけると思うのですが。。。 上記とあわせてお勧めの書籍やページなどがありましたら教えていただけないでしょうか。 よろしくお願いします。

  • アセンブラからC言語に変換するにはどうすればいいのでしょうか?

    アセンブラのプログラムをどうにか解読して、C言語に置き換えようとこつこつ行っています。 ですが、プログラム量が多いので解読に時間を要してしまいます。 どうにかして変換したいのですが、手早く変換できる方法はありませんでしょうか? また、自分で調べても分からない単語があります。(見落としているかもしれませんが)  .EQU   .BEQU この二つのコマンドが何を示しているのかがわからないのでこれについても教えてもらえたらうれしいです。

  • C言語とアセンブラ言語による計算プログラミング

    "AB間の距離を求めなさい。" 下の画像において、AC=r1、BC=r2、∠ACB=α°とするとき、AB間の距離dを求めなさい。 上記の問題について困っております。 この問題の解答については、C言語とアセンブラ言語によるプログラミングで考えるようになっており、FPU(MATH COPROCESSOR)を使用し、C言語側で変数や関数宣言、printfなどでの計算結果出力を記述し、アセンブラ言語側で計算するプログラム問題です。 原則として、C言語側で計算してはいけない仕様になっています。 そして、2つのオブジェクトファイルをリンクさせ、実行可能ファイル(.exe)を作成し、コマンドプロンプト に計算結果を表示する。とういう問題です。 ・アセンブラ言語側での使用する命令のプロセッサアーキテクチャのタイプは「.386」 ・作成するオブジェクトのメモリモデルは、Windowsなので「FLAT」 図の画像は添付してあるので、どうかご回答のほどよろしくお願い致します。

  • 目標言語→C#

    私はアセンブラ言語の知識とCを少しかじったくらいの経験しかないのですが、独学でC#の習得は出来るでしょうか?最初はJAVAやVBを勉強しようと思ってたのですが、某サイトではC#のほうがJAVAやVB、C++の長所を引き継いでいるので良いと書いてたので悩んでいます。あとどれくらいの時間があれば習得できるかもしりたいです。どなたかアドバイスお願いします。

  • ステート数とは

    これからz80アセンブラの勉強を始めようとしています。 ステート(数)という言葉の定義を教えてください。 1命令にかかるCPU処理時間という認識でいるのですが正しいでしょうか?