アマチュア無線や電子工作,バイクの話などを徒然なるままに書き散らすメモ程度のblogです.


by jq1ocr

【mbed】wait

標準関数である wait の説明を見ると以下のように書かれています(抄訳).
void wait(float s)
マイクロ秒の分解能で s [sec] だけ NOP(なにもしないをする hi)で wait します.

すなわち,wait に与える引数は float 型で単位は「秒」です.具体的には
wait(1.0) or wait(0.001)

で,それぞれ1秒と1ミリ秒となりますが,
wait(0.000001)

以下は意味がないということですね.ちなみにms単位,us単位でもwaitは掛けられます.
void wait_ms(int ms)
void wait_us(int us)

が用意されています.が,引数はそれぞれ int 型(4バイト)であることに注意が必要です.

具体的には
#include "mbed.h"

DigitalOut led(LED1);

int main() {
while (1) {
led = 1;
wait(0.5);
led = 0;
wait(0.5);
}
}


とすると,0.5秒おきに LED1 が点灯,消灯を繰り返すわけですが,この中の wait(0.5) は 0.5sec の wait なので,500ms として wait_ms(500) や 500000us で wait_us(500000) でも同じ意味となります.
【追記】wait(#) には float の秒単位で 1us 分解能で数値を与えられると書かれていますが,wait_ms(#) や wait_us(#) には int しか与えられないことになっています.しかし,実際にはここに小数を入れてもコンパイルは通ります.ただ実際にちゃんと動いているかと言えばそうではありません.結論から言えば 0 を入れたのと同じ動作になりました.

まずは wait(0.2) と wait(0.2) の場合.(200ms/div)
d0106518_18383124.jpg

ここで,wait(0.2) と wait_ms(200) だと...(100ms/div)
d0106518_18405674.jpg

まあ妥当ですね.では wait(0.0002) と wait_ms(0.2) だとどうなるでしょう.(200us/div)
d0106518_18421718.jpg

下に落ちたところが wait_ms(0.2) の部分です.ここが異常ですね.では,wait_ms(0.2) と wait_ms(0.2) ではどうでしょう.(1us/div)
d0106518_1844292.jpg
1.5us くらい毎になってますね.ちなみに wait_us(1) にすると,1.5us くらい,wait_us(0) でも同じくらいでした.実際にはきっかり分解能が 1us というわけではなさそうです.
[PR]
by jq1ocr | 2012-04-01 18:58 | マイコン・電子工作 | Comments(0)