ラズパイ・ピコのmillisとmicros、なぜか遅い!?
ラズパイ・ピコをArduino IDEで動かそうとしたけど のコメントで、
「なんとなくloop時間が長いぞ」っと記しましたが、
millisとmicrosの処理時間をテストしてみました。
void setup() {
pinMode(2, OUTPUT); // GP2
pinMode(3, OUTPUT); // GP3
}
uint32_t t;
void loop() {
if(millis() != t){ // 1ms変化?
digitalWrite(2, HIGH); // GP2
t = millis();
digitalWrite(2, LOW);
}
digitalWrite(3, HIGH); // GP3 H/L
digitalWrite(3, LOW); // loopでパルス
}
まずmillis。
処理に10us以上かかっています。
microsはちょっと速くなりました。
こんな具合に1ms経過をチェック。
if((micros() - t) >= 1000){ // 1ms変化
:
どんな処理をしているのか探してみましたが、探し切れていません。
<common.h>
unsigned long millis(void);
unsigned long micros(void);
void delay(unsigned long);
void delayMicroseconds(unsigned int us);
<wiring.cpp>
unsigned long millis(){
return duration_cast<milliseconds>(lowPowerTimer.elapsed_time()).count();
}
unsigned long micros() {
return timer.elapsed_time().count();
}
この中の、
lowPowerTimer.elapsed_time()).count();
timer.elapsed_time().count();
この処理がどうなっているのか不明っす。
※追記 Arduino-UNOと比較
それじゃっと、16MHzクロックのArduino-UNO(ATmega328p)と
比較してみました。
こんなスケッチ。
// ポート出力 H/L (digitalWriteだと遅いので)
#define PD2_H (PORTD |= (1 << PD2))
#define PD2_L (PORTD &= ~(1 << PD2))
#define PD3_H (PORTD |= (1 << PD3))
#define PD3_L (PORTD &= ~(1 << PD3))
void setup() {
pinMode(2, OUTPUT); // D2
pinMode(3, OUTPUT); // D3
}
uint32_t t;
void loop() {
if(millis() != t){ // 1ms変化
PD2_H; // PD2 H/L
t = millis(); // millis処理の時間
PD2_L;
}
PD3_H; // PD3 H/L
PD3_L;
}
確認用のパルス出力はdigitalWriteを使わず、ポートの直叩きで
スピードアップします。
結果の波形。
millisの処理が1.3usほど。
約2usでloopを回っています。
loopで出しているパルス(PD3)。
それが、いったん止まります。
その原因がタイマー0のオーバーフロー割り込み。
millisはタイマー0のオーバーフロー割り込みでカウントアップ
していますんで、その直後のloopで1ms経過を検知している
様子が見えています。
ラズパイ・ピコの速度、はてさて・・・
※関連
・割り込みで処理させるwordデータの扱い
Arduino-UNOでのmillisの中味を解説しています。
| 固定リンク
「Arduino」カテゴリの記事
- 「UART←→IrDA」変換IC、MCP2122のクロック供給(2022.06.20)
- 秋月の赤外光送受信モジュール(AE-RPM851A)を使ってみる(IrDAを試す) #2(2022.06.18)
- 秋月の赤外光送受信モジュール(AE-RPM851A)を使ってみる(IrDAを試す)(2022.06.17)
- 4046・VCO回路の直線性改善方法その2(2022.06.13)
- 「ダイソーの観覧車」を回せ! 回路図(2022.05.08)
「ラズパイ・ピコ」カテゴリの記事
- マイコン出力ポートのプルアップ、プルダウン問題 誤パルス出力を避けるために(2022.05.02)
- Raspberry Pi Pico リセット起動後のポートはプルダウン抵抗が有効に(2022.05.01)
- Arduino IDEでRaspberry Pi Pico:シリアル受信バッファを増やす(2022.04.20)
- Arduino IDEでRaspberry Pi Pico:millisをwordで処理した時の異常(2022.04.19)
- Arduino IDEでRaspberry Pi Pico:BSch3V部品ライブラリ(2022.04.18)
コメント