全局定义的 RingBuf 在 loop() 函数内不起作用

问题描述

我只能在 RingBuf 函数内使用 SdFat 库中的 setup(),但我不明白为什么。是否可以将 RingBufFile32 定义为全局并在设置期间仅配置一次?我正在开发 Teensy 4.1。

例如,此代码有效

#include "sdios.h"
#include "SdFat.h"
#include "RingBuf.h"

#define SD_CONfig  SdioConfig(FIFO_Sdio)        // Use Teensy Sdio

File32  stateFile;
RingBuf<File32,5> outRingBuff;

// SETUP function
void setup() {
  Sdfat32 sdCard;
  bool retValBool;
  
  Serial.begin(9600);                 // Teensy serial is always at full USB speed and buffered... the baud rate here is required but ignored

  Serial.println("Initialization SD card START");

  // SD Initialization
  if (!sdCard.begin(SD_CONfig)) {
    sdCard.initErrorHalt(&Serial);
    Serial.println("ERROR SD Initialization Failed!");
  } else {
    Serial.println("Initialization SD card DONE");

    // Output file opening
    retValBool = stateFile.open("aa.csv",O_RDWR | O_CREAT | O_Trunc);

    // Output file opening
    if (retValBool) {
      outRingBuff.begin(&stateFile);
      
      outRingBuff.write(',');
      outRingBuff.write(',');

      size_t numBytes = outRingBuff.writeOut(4);

      Serial.println(numBytes);

      outRingBuff.sync();
      stateFile.sync();
      stateFile.truncate();
    }
  }
}

// LOOP function
void loop() {
      Serial.print("loop");

      delay(800);
}

但是这段代码不起作用,没有检索任何类型的编译器错误、警告等

#include "sdios.h"
#include "SdFat.h"
#include "RingBuf.h"

#define SD_CONfig  SdioConfig(FIFO_Sdio)        // Use Teensy Sdio

File32  stateFile;
RingBuf<File32,');

      size_t numBytes = outRingBuff.writeOut(4);

      Serial.println(numBytes);

      outRingBuff.sync();
      stateFile.sync();
      stateFile.truncate();
    }
  }
}

// LOOP function
void loop() {
      Serial.print("loop");
      
      outRingBuff.write('A');
      outRingBuff.write('A');
      outRingBuff.write('A');
      outRingBuff.write('A');

      size_t numBytes = outRingBuff.writeOut(4);

      Serial.println(numBytes);
      
      outRingBuff.sync();
      stateFile.sync();
      stateFile.truncate();
      
      delay(800);
}

解决方法

我发现了问题。 SdFat32 对象是在 setup() 函数内部定义的,因此它在 loop() 函数内部是不可访问的。很可能,RingBufFile32 对象都不会直接调用它,因此它不会检索任何错误,但是当 SdFat32 对象被调用时,无法将数据保存在 SD 上无法访问。

我认为应该修复这种行为,我认为应该引发错误或警告。