我在PlatformIO中使用ESP32-IDF将此代码放到我的ESP32上:

#include <driver/gpio.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>

#define RELAY 2


void hello_task(void *pvParameter)
{
    printf("Hello world!\n");
    for (int i = 10; i >= 0; i--) {
        printf("Restarting in %d seconds...\n", i);
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
    printf("Restarting now.\n");
    fflush(stdout);
    esp_restart();
}


void led_blink(void *pvParams)
{
    printf("Resetting pin\n");
    gpio_reset_pin(RELAY);
    printf("Setting pin direction\n");
    gpio_set_direction(RELAY,GPIO_MODE_OUTPUT);
    while (1) {
        printf("Setting GPIO level low\n");
        esp_err_t error_num = gpio_set_level(RELAY,0);
        printf("error_num: %d\n", error_num);
        vTaskDelay(pdMS_TO_TICKS(500)); // Here is where the panic happens
        printf("Setting GPIO level high\n");
        error_num = gpio_set_level(RELAY,1);
        printf("error_num: %d\n", error_num);
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}


void app_main()
{
    xTaskCreate(&hello_task, "hello_task", 2048, NULL, 5, NULL);
    xTaskCreate(&led_blink,"LED_BLINK",1024,NULL,5,NULL);
}

当到达LED_BLINK中的第一个vTaskDelay时,它会死机.这就是日志(log)的最后一部分显示的内容(如果有人说有必要,我可以把整个内容放进go ):

␛[0;32mI (306) app_start: Starting scheduler on CPU0␛[0m
␛[0;32mI (311) app_start: Starting scheduler on CPU1␛[0m
␛[0;32mI (311) main_task: Started on CPU0␛[0m
␛[0;32mI (321) main_task: Calling app_main()␛[0m
Hello world!
Restarting in 10 seconds...
Resetting pin
␛[0;32mI (321) gpio: GPIO[2]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 ␛[0m
Setting pin direction
Setting GPIO level low
error_num: 0
␛[0;32mI (341) main_task: Returned from app_main()␛[0m
Guru Meditation Error: Core  0 panic'ed (LoadProhibited). Exception was unhandled.

Core  0 register dump:
PC      : 0x400869c8  PS      : 0x00060033  A0      : 0x800883ea  A1      : 0x3ffb0e50  
A2      : 0x00000001  A3      : 0x0000000a  A4      : 0x00000035  A5      : 0x00000005  
A6      : 0xb33fffff  A7      : 0xb33fffff  A8      : 0x00000001  A9      : 0x00000000  
A10     : 0x00000000  A11     : 0x80000001  A12     : 0x00000000  A13     : 0x00060023  
A14     : 0xb33fffff  A15     : 0xb33fffff  SAR     : 0x0000001e  EXCCAUSE: 0x0000001c  
EXCVADDR: 0x0000000e  LBEG    : 0x00000000  LEND    : 0x00000000  LCOUNT  : 0x00000000  


Backtrace: 0x400869c5:0x3ffb0e50 0x400883e7:0x3ffb0e70 0x40088231:0x3ffb0e90 0x40082732:0x3ffb0ea0 0x4008467f:0x3ffb5290 0x400d385f:0x3ffb52b0 0x40086726:0x3ffb52d0 0x40087c79:0x3ffb52f0

我有一个可以支持2a的电源,这远远超过了需求,所以这不是一个电源问题.我注意到日志(log)显示为OutputEn: 0,这让我认为可能是PIN设置有问题,但PIN设置的返回代码是0……

为什么会发生这样的撞车事故?基本上,我只是复制了一些教程代码并添加了一些printf语句.

推荐答案

最可能的解释是任务LED_BLINK内存不足.不幸的是,printf()&;的朋友消耗了出乎意料的大量堆栈内存,绝对超过了你分配的1KiB.对于初学者来说,将堆栈增加到2KiB,准备在调用任何其他非平凡的库时再次将其加倍.

老实说,我以8KiB或更高的速度开始任何任务堆栈,然后在堆栈使用指标从vTaskList()显示该任务实际消耗了多少堆栈后将其降低.从堆栈调试开始是一种巨大的时间浪费:)

C++相关问答推荐

由Go调用E.C.引起的内存快速增长

标准的C17标准是用括号将参数包装在函数声明中吗

在C中使用JMP_buf数组进行线程化(在xv6中测试)

编译的时候g++通常会比GCC慢很多吗?

正在try 将文件/文件夹名从目录 struct 存储到链接列表

仅在给定的大小和对齐方式下正确创建全局

在C++中头文件中声明外部 struct

从uint8_t*转换为char*可接受

使用nmake for程序比Hello World稍微复杂一些

C将数组传递给函数以修改数组

For循环不会迭代所有字符串字符吗?(初学者问题)

GCC错误,共享内存未定义引用?

C程序向服务器发送TCPRST

静态初始化顺序失败是否适用于C语言?

在文件描述符上设置FD_CLOEXEC与将其传递给POSIX_SPOWN_FILE_ACTIONS_ADCLOSE有区别吗?

如何在C中处理流水线中的a、n命令?

`%%的sscanf无法按预期工作

通过GTK';传递回调参数;s g_signal_connect()导致C中出现意外值

从管道读取数据时丢失

如何让 unlinkat(dir_fd, ".", AT_REMOVEDIR) 工作?