问题:任务函数需要680字节。申请840字节或1024x3字节,程序没有问题。但是申请1000字节或1024字节,却提示内存溢出***ERROR*** A stack overflow in task Oled has been detected.
代码如下(在第23行):
Code: Select all
#include <Arduino.h>
#include <U8g2lib.h>
static const byte pinSda = 4;
static const byte pinScl = 5;
static U8G2_SSD1306_128X64_NONAME_F_HW_I2C myOLed(U8G2_R0,pinSda,pinScl,U8X8_PIN_NONE);//构造对象
static const char * oledMenu[4] = {"Item 1","Item 2","Item 3","Item 4"};//指针数组定义菜单列表
TaskHandle_t oled = NULL;//oledTask的任务句柄
//函数前置声明
void oledTask(void * pvParam);
void displayMenu(int index);
void setup(){
Serial.begin(115200);
Serial.printf(PSTR("ToTal heap size: %d\n"), ESP.getHeapSize());
int freeHeap = ESP.getFreeHeap();
Serial.printf(PSTR("Free heap size: %d\n"),freeHeap);
xTaskCreatePinnedToCore(oledTask,"Oled",1000,NULL,2,&oled,0);//任务占用的空间实际比申请的空间多372字节,该字节用于存储TCB数据。xCreateTask申请的大小不包括TCB
freeHeap = ESP.getFreeHeap();
Serial.printf(PSTR("Free heap size: %d\n"), freeHeap);
int waterMark = uxTaskGetStackHighWaterMark(oled);//剩余空间(未使用)的最小值,返回的是字节!
Serial.printf(PSTR("Min free heap of xCreate: %d\n"),waterMark);
Serial.printf(PSTR("Used heap: %d\n"),(1000 - waterMark));
vTaskDelete(NULL);
}
void loop(){
}
void displayMenu(int index){
myOLed.clearBuffer();
myOLed.drawStr(0,12,"Menu");
myOLed.drawHLine(0,14,128);
for(int i = 0;i < 4;i++){
if(index == i){
myOLed.drawStr(5,(i + 2) * 12 + 2,">");
myOLed.drawStr(20,(i + 2) * 12 + 2,oledMenu[i]);
}
else{
myOLed.drawStr(5,(i + 2) * 12 + 2,oledMenu[i]);
}
}
myOLed.sendBuffer();
}
void oledTask(void * pvParam){
myOLed.begin();
myOLed.setFont(u8g2_font_ncenB08_tf);//设置OLed字体
while(true){
for(int i = 0;i < 4;i++){
displayMenu(i);
vTaskDelay(pdTICKS_TO_MS(500));
}
}
}