質問内容
割り込みを使う際には変数に"volatile"を付けるとネットに記載されていましたが、どこまでが"volatile"を付けるべきかわかりません。
下記ソースコードには6種類の変数が使われて、そのどれに"volatile"を付ければよいのでしょうか?
serialEvent()はシリアル受信があった際に割り込まれる関数で、printFx()は割り込みピン(3)にLOW信号を受信した際に割り込まれる関数です。
①int recv
②static uint32_t before
③uint32_t current
④uint32_t a
⑤uint32_t b
⑥uint32_t gettime
ソースコード
Arduino
1#define INT_PIN 3 2 3void setup() 4{ 5 Serial.begin(9600); 6 pinMode(INT_PIN, INPUT_PULLUP); 7 attachInterrupt(digitalPinToInterrupt(INT_PIN), printFx, FALLING); 8} 9 10void loop() 11{ 12 //何もしない 13} 14 15void serialEvent() 16{ 17 int recv = 0; 18 19 //シリアル受信判定 20 if(Serial.available() > 0) 21 { 22 while(1) 23 { 24 recv = Serial.read(); //1byteずつ吐き出し 25 if(recv != -1) 26 { 27 if(recv == '1') 28 { 29 printFx(); 30 } 31 } 32 else 33 { 34 //シリアルデータなし 35 break; 36 } 37 } 38 } 39} 40 41void printFx() 42{ 43 static uint32_t before = 0; 44 uint32_t current = millis(); //ミリ秒時間取得 45 46 //2000ミリ秒経過判定 47 if(getTime(current, before) >= 2000) 48 { 49 Serial.println("Print!"); 50 before = current; 51 } 52} 53 54uint32_t getTime(uint32_t a, uint32_t b) 55{ 56 uint32_t gettime = 0; 57 58 if(a >= b) 59 { 60 gettime = a - b; 61 } 62 else 63 { 64 //オーバーフロー時 65 gettime = a + (0xFFFFFFFF - b); 66 } 67 68 return gettime; 69} 70
回答3件
あなたの回答
tips
プレビュー