初めて質問します。
現在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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ループを途中で抜けたいのですが。
-
PIC のプログラムについて ど...
-
UWSCにてある一定の動作を無限...
-
C言語に関する質問
-
WINAPIから始まるプログラム実...
-
フラッシュ暗算
-
C++ DirectX カーソルの移動処...
-
C言語のwhile()文での大括弧の...
-
getchar()の記述
-
CASLIIについて
-
whileの途中で手続きを変化する...
-
For文の終了値を関数にしても問...
-
2÷3などの余りについて
-
Enterキーを押されたら次の処理...
-
「指定されたキャストは有効で...
-
マイナスからプラスへ転じた時...
-
二次関数と関数の違いは何ですか?
-
「Aに対するBの割合」と「Aに対...
-
C言語初心者です、、、お助けく...
-
数字以外が入力されたらエラー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ループを途中で抜けたいのですが。
-
do-while文が禁止される理由
-
break文でループを一気に抜ける...
-
For文の終了値を関数にしても問...
-
エクセルVBAで Do While (1)って?
-
入力した文字列から母音だけを...
-
for文while文の無限ループの違...
-
C言語forループが完結した場合...
-
エクセルでC言語のfor文と同じ...
-
入力した数値を倍々するプログラム
-
Cプログラムが終了しない
-
n重のfor文にするには?
-
UWSCにてある一定の動作を無限...
-
PIC のプログラムについて ど...
-
Excel VBAで年度をまたぐ期間の...
-
アルゴリズムです!四つの数字...
-
Delphiで・・・
-
While文の終わりにセミコロンが...
-
ループの特定入力終了
-
For~Nextステートメントの終了...
おすすめ情報