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 不可平凡复制,因此您的代码具有未定义的行为