Arduino,调用函数时代码以奇怪的方式挂起
Arduino, code hangs in weird way when a function is invoked
当我进行方法调用时,以下代码的行为很奇怪
#include <TimerOne.h>
#include <cppQueue.h>
#include <Arduino.h>
typedef struct Diagnostic {
String entityName;
uint16_t pin;
} Diag;
// Global setup
cppQueue q(sizeof(Diag *), 10, FIFO, false);
int ctr = 0;
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
Serial.begin(9600);
}
// Add to queue
// the loop function runs over and over again forever
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(2000); // wait for a second
Serial.println("After high");
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
// Critical Section
Diag d;
Serial.println("String assignment");
d.entityName = "Front Door";
d.pin = LED_BUILTIN;
d_ptr = &d;
Serial.println("Enqueuing one");
q.push(&d);
Serial.println("Enqueued one");
Serial.println(freeMemory());
//q.pop(&d);
//Serial.println("Dequeued one" + d.entityName);
DequeueIsr();
//Serial.println("Atomic block");
//Serial.println(q.getCount());
//Serial.println("Loop end");
}
void DequeueIsr() {
Diag di;
if (!q.isEmpty())
{
Serial.println("Queue not empty");
q.pop(&di);
Serial.println("Dequeued one" + di.entityName);
Serial.println(freeMemory());
}
}
每当我尝试在 DequeueIsr 函数中弹出我的对象时,代码在 2 或 3 次迭代后挂起,此后串行监视器上没有输出。如果我只是复制 Dequeue 方法中的代码并在主循环中 运行 它工作,它就不会卡住。当我使用字符串时也会发生这种情况,如果我从 Diag 中删除 entityName 字段,它会在方法内部工作。
我错过了一些重要的东西吗?
我真正想做的是,使用 TimerOne 库使用中断方法使队列出列。我已经删除了所有与计时器相关的代码,甚至一个简单的方法调用也不起作用。
看起来 cppQueue
使用 memcpy
复制对象,因此它仅适用于平凡可复制的对象,String
不可平凡复制,因此您的代码具有未定义的行为
当我进行方法调用时,以下代码的行为很奇怪
#include <TimerOne.h>
#include <cppQueue.h>
#include <Arduino.h>
typedef struct Diagnostic {
String entityName;
uint16_t pin;
} Diag;
// Global setup
cppQueue q(sizeof(Diag *), 10, FIFO, false);
int ctr = 0;
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
Serial.begin(9600);
}
// Add to queue
// the loop function runs over and over again forever
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(2000); // wait for a second
Serial.println("After high");
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
// Critical Section
Diag d;
Serial.println("String assignment");
d.entityName = "Front Door";
d.pin = LED_BUILTIN;
d_ptr = &d;
Serial.println("Enqueuing one");
q.push(&d);
Serial.println("Enqueued one");
Serial.println(freeMemory());
//q.pop(&d);
//Serial.println("Dequeued one" + d.entityName);
DequeueIsr();
//Serial.println("Atomic block");
//Serial.println(q.getCount());
//Serial.println("Loop end");
}
void DequeueIsr() {
Diag di;
if (!q.isEmpty())
{
Serial.println("Queue not empty");
q.pop(&di);
Serial.println("Dequeued one" + di.entityName);
Serial.println(freeMemory());
}
}
每当我尝试在 DequeueIsr 函数中弹出我的对象时,代码在 2 或 3 次迭代后挂起,此后串行监视器上没有输出。如果我只是复制 Dequeue 方法中的代码并在主循环中 运行 它工作,它就不会卡住。当我使用字符串时也会发生这种情况,如果我从 Diag 中删除 entityName 字段,它会在方法内部工作。 我错过了一些重要的东西吗?
我真正想做的是,使用 TimerOne 库使用中断方法使队列出列。我已经删除了所有与计时器相关的代码,甚至一个简单的方法调用也不起作用。
看起来 cppQueue
使用 memcpy
复制对象,因此它仅适用于平凡可复制的对象,String
不可平凡复制,因此您的代码具有未定义的行为