![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
初めて質問します。
現在pic12f675で遊んでいるのですが、
http://homepage3.nifty.com/mitt/pic/picc/picc675 …
にある、
// =================== 50uSウェイトルーチン ===============
static void wait_50uS() {
unsigned int cnt;
unsigned int i;
cnt = 2;
for(i=0 ; i<cnt ; i++) {
NOP();
}
}
の意味がわかりません。
特にfor(i=0 ; i<cnt ; i++) {
NOP();
}
の箇所です。
これでなぜ、50μsの待ち時間関数になるのでしょうか?
どなたか答えてくれませんか?
No.3ベストアンサー
- 回答日時:
PIC12シリーズでは4クロックで機械語の1命令を実行します。
(ジャンプする命令では8クロック)
この事は例示されたソースリストに
//clock4MHz
//命令1μS
と書いてあることからも分かります。
C言語のソースをコンパイラが機械語に変換した時に何命令になるかは
最適化のレベルによって変わってきます。
例示されたソースリストについて最高の最適化がなされた場合は
nop
nop
return
の3命令に変換されます。この場合は3usの時間待ちになります。
まったく最適化をなされない場合にどうなるかを考えて見ると以下のようになります。
static void wait_50uS() {
// 関数の入り口での処理
// WREGをセーブする 1CYC
// statusをWREGに入れて、RAMにセーブする 2CYC
unsigned int cnt; // 0CYC
unsigned int i; // 0CYC
cnt = 2; // WREGに2を入れ、cntにセーブ 2CYC
for (i=0 ; i<cnt ; i++) {
// 1回目のループ
// i=0 ; WREGに0を入れ、iにセーブ 2CYC
// i<cnt ; iをWREGにいれ、cntと比較、i<cntなのでNOP();を実行 4CYC
NOP(); // nop; 1CYC
// i++ 1cyc
// ループ開始へジャンプ 1CYC
}
// 2回目のループ
// i<cnt ; iをWREGにいれ、cntと比較、i<cntなのでNOP();を実行 4CYC
NOP(); // nop; 1CYC
// i++ 1cyc
// ループ開始へジャンプ 1CYC
// 3回目のループ
// i<cnt ; iをWREGにいれ、cntと比較、i<cntでないのでループを抜ける 4CYC
}
// 関数の出口での処理
// RAMにセーブした statusを元に戻す 2CYC
// セーブしたWREGを戻す 1CYC
// リターンする 1CYC
トータル29CYCなので実行時間は29usになります。
コンパイラがこのように変換しているとは限りませんが50usにはならないでしょう。
MPLABを使用しているのであればストップウォッチ機能で実行時間を測ってみてください。
なお、このようなコードはコンパイラのバージョンや最適化のレベル指定で実行時間が変わるのでアセンブラで記述するほうがいいです。
実行中に割り込みがかかると時間が延びるのでそれが不都合な場合には割り込みを禁止するかタイマーを利用するのがいいです。
この回答への補足
御返答いただきありがとうございます。
御察しの通りMPLABのv8.4を使っています。
break pointをはりつけるところまでは、調べてできたのですが、
デバッガーをクリックしても、select toolとclear memoryしか出てきません(・_・?)
もし、ご存知でしたらストップウォッチ機能の使い方を教えていただけないでしょうか?
No.4
- 回答日時:
下記のようにセッティングしてください
Debugger -> Select Tool -> MPLAB SIM
Debugger -> Settings を指定して
Osc/Trace タブを選んで Processor Frequencyに4MHzを設定
Debugger -> Stopwatch を選択
ブレークポイントのところでStopwatchウインドーの「ZERO」をクリック
ステップ実行、または次のブレークポイントまでの時間を計る。
なお、View -> Disassembly List を選択すればコンパイラがどのように機械語に変換したかが分かります。
御返答ありがとうございます。
18μsとなりました。
いろいろ勉強させてもらい、感謝至極です。
アセンブリ言語も勉強したいと思います(;^_^A アセアセ・・・
お二人とも、ほんとにありがとうございました!
No.2
- 回答日時:
まず、CPUの1クロックで1行実行出来るわけではありません。
Cプログラムの1行はコンパイラで数命令から下手すると20命令以上に
変換されます。
さらに、SH2のようにパイプライン処理で1クロック1命令を実行出来る
マイコンの場合でも、外部 DRAMのように4 waitが入ってしまうと1クロ
ック1命令も怪しくなります。
PIC16 がパイプライン処理をしているか知りませんが、こうゆうループは
実機で確認して合わせるしかないのが実情でしょう。
とゆうわけで、4MHzなら4M行/s ではなく数倍処理速度が落ちると
考えた方が実用的です。
こんな説明でいかがでしょう。
御返答ありがとうございます。
上のtadvsさんのストップウォッチ機能で確認してみます。
お付き合いいただき、ありがとうございましたm(_ _)m
No.1
- 回答日時:
この例題で使われているCPU CLOCK周波数の場合 for ループを2回
実行すると、約50マイクロ秒になるとゆう事です。
ループの実行回数はCPUの種類、クロック周波数で調整する必要が
有ります。
この回答への補足
御返答ありがとうございます。
このマイコンのクロックは4MHzですよね?
ということは
1/4000000=0.00000025=0.25μsの処理能力をもつので、必要なループの回数は200回なのではないでしょうか?
調整しているとしたら、プログラムのどこでしているのでしょうか?
回答していただければありがたいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) atcoder python コードへの助言 2 2022/08/12 15:31
- Visual Basic(VBA) 配列の勉強をしています。使用する変数の意味、検索条件の書き方が難しいです。 2 2022/09/15 14:06
- Visual Basic(VBA) Dateserialで データ抽出 2 2022/06/26 21:07
- Visual Basic(VBA) VBA Bookの表示、非表示 1 2022/09/16 20:44
- Visual Basic(VBA) VBA初心者です。 VBAで行単位で条件付き書式の色をカウントしたいです。 大量のデータがあるExc 3 2022/06/08 10:02
- Visual Basic(VBA) VBA初心者です。 VBAで行単位で条件付き書式の色をカウントしたいです。 大量のデータがあるExc 3 2022/06/08 10:00
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
入力した数値を倍々するプログラム
-
break文でループを一気に抜ける...
-
do-while文が禁止される理由
-
clock関数を利用した時間計測法...
-
ループを途中で抜けたいのですが。
-
C言語forループが完結した場合...
-
PIC のプログラムについて ど...
-
線形探索(番兵法)のプログラ...
-
While文の終わりにセミコロンが...
-
独立係数について教えて下さい。
-
Enterキーを押されたら次の処理...
-
信頼区間の1.96や1.65ってどこ...
-
2÷3などの余りについて
-
マイナスからプラスへ転じた時...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語について。
-
「Aに対するBの割合」と「Aに対...
-
正負を反転させて出力するプロ...
-
EXCELの分散分析表のP-値が....
-
大学数学の問題です。 加法群Z/...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
break文でループを一気に抜ける...
-
ループを途中で抜けたいのですが。
-
入力した文字列から母音だけを...
-
do-while文が禁止される理由
-
入力した数値を倍々するプログラム
-
C言語forループが完結した場合...
-
if文の中にfor文なのか、for文...
-
プログラミングC言語についての...
-
エクセルVBAで Do While (1)って?
-
For文の終了値を関数にしても問...
-
エクセルでC言語のfor文と同じ...
-
Delphiで・・・
-
ループの特定入力終了
-
UWSCにてある一定の動作を無限...
-
C言語、自己参照構造体のプログ...
-
C言語 数字を削除する関数
-
Cプログラムが終了しない
-
Excel VBAで年度をまたぐ期間の...
-
プログラムで関数は使わない方...
-
VBScriptでSQLに接続し、CSV出...
おすすめ情報