« ラズパイ・ピコのポートを高速でH/L | トップページ | Arduino IDEでラズパイ・ピコ:Serial出力がバッファされていないぞ »

2022年4月 4日 (月)

ラズパイ・ピコのmillisとmicros、なぜか遅い!?

ラズパイ・ピコをArduino IDEで動かそうとしたけど のコメントで、
なんとなくloop時間が長いぞ」っと記しましたが、
millismicros処理時間をテストしてみました。

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
B000_20220404175301
処理に10us以上かかっています。

microsはちょっと速くなりました。
こんな具合に1ms経過をチェック。
  if((micros() - t) >= 1000){ // 1ms変化
    :
B001_20220404175401

どんな処理をしているのか探してみましたが、探し切れていません。

<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を使わず、ポートの直叩きで
スピードアップします。
結果の波形。
A000_20220405085301

millisの処理が1.3usほど
約2usでloopを回っています。

loopで出しているパルス(PD3)。
それが、いったん止まります。
その原因がタイマー0のオーバーフロー割り込み。
millisはタイマー0のオーバーフロー割り込みでカウントアップ
していますんで、その直後のloopで1ms経過を検知している
様子が見えています。


ラズパイ・ピコの速度、はてさて・・・

※関連
割り込みで処理させるwordデータの扱い
   Arduino-UNOでのmillisの中味を解説しています。


|

« ラズパイ・ピコのポートを高速でH/L | トップページ | Arduino IDEでラズパイ・ピコ:Serial出力がバッファされていないぞ »

Arduino」カテゴリの記事

ラズパイ・ピコ」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




« ラズパイ・ピコのポートを高速でH/L | トップページ | Arduino IDEでラズパイ・ピコ:Serial出力がバッファされていないぞ »