c++ - 无法写入串口

标签 c++ c freertos rtos esp32

我正在将 ESP32 DevKitC-v1(克隆)与 FreeRTOS 结合使用,并尝试将字节写入串行端口。

我的代码(如下)导致以下异常:

Guru Meditation Error: Core  0 panic'ed (LoadProhibited). Exception was unhandled.
Core 0 register dump:
PC      : 0x400ea8fe  PS      : 0x00060730  A0      : 0x800eb825  A1      : 0x3ffdfdf0  
A2      : 0x00000001  A3      : 0x00000055  A4      : 0x00000001  A5      : 0x00000000  
A6      : 0x00000002  A7      : 0xff000000  A8      : 0x00000000  A9      : 0x60010000  
A10     : 0x00000055  A11     : 0x00000001  A12     : 0x3ffdfd54  A13     : 0x3ffd1068  
A14     : 0x00000000  A15     : 0x00000000  SAR     : 0x00000004  EXCCAUSE: 0x0000001c  
EXCVADDR: 0x00000055  LBEG    : 0x400014fd  LEND    : 0x4000150d  LCOUNT  : 0xffffffff  

Backtrace: 0x400ea8fe:0x3ffdfdf0 0x400eb822:0x3ffdfe10 0x400ebf0d:0x3ffdfe50 0x400e1511:0x3ffdfe80

Rebooting...
ets Jun  8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0018,len:4
load:0x3fff001c,len:6372
load:0x40078000,len:11276
load:0x40080000,len:6084
entry 0x4008032c

我能够找到有关 FreeRTOS 和 UART 操作的有限信息,但如果我错过了一些明显的信息,我提前表示歉意。我已经尝试自行解决该问题大约 3 天了。

我的代码:

#define ECHO_TEST_TXD  (GPIO_NUM_17)
#define ECHO_TEST_RXD  (GPIO_NUM_16)
#define ECHO_TEST_RTS  (UART_PIN_NO_CHANGE)
#define ECHO_TEST_CTS  (UART_PIN_NO_CHANGE)    



static void prvSerialRelayMQTTCommand()
{
    const TickType_t xFiveSeconds = pdMS_TO_TICKS( 5000UL );
    /* Configure parameters of an UART driver,
     * communication pins and install the driver */
    uart_config_t uart_config = {
        .baud_rate = 9600,
        .data_bits = UART_DATA_8_BITS,
        .parity    = UART_PARITY_DISABLE,
        .stop_bits = UART_STOP_BITS_1,
        .flow_ctrl = UART_HW_FLOWCTRL_DISABLE
    };
    uart_param_config(UART_NUM_2, &uart_config);
    uart_set_pin(UART_NUM_2, ECHO_TEST_TXD, ECHO_TEST_RXD, ECHO_TEST_RTS, ECHO_TEST_CTS);
    uart_driver_install(UART_NUM_2, BUF_SIZE * 2, 0, 0, NULL, 0);

    while (1) {
        uart_write_bytes(UART_NUM_2, 0b00000000, 1);
        vTaskDelay(xFiveSeconds);
        uart_write_bytes(UART_NUM_2, 0b00000001, 1);
        vTaskDelay(xFiveSeconds);
        uart_write_bytes(UART_NUM_2, 0b00000011, 1);
        vTaskDelay(xFiveSeconds);
        uart_write_bytes(UART_NUM_2, 0b00000111, 1);
        vTaskDelay(xFiveSeconds);
        uart_write_bytes(UART_NUM_2, 0b00001111, 1);
        vTaskDelay(xFiveSeconds);
    }
}

最佳答案

无效的指针参数

uart_write_bytes() 的第二个参数应该是 const char * (参见 reference )。您向其传递了一个无效的指针。

改变

uart_write_bytes(UART_NUM_2, 0b00000000, 1);

char c = '\0';
uart_write_bytes(UART_NUM_2, &c, 1);

其他调用也类似。

但是,这不一定是您唯一的问题。

FreeRTOS 任务的堆栈大小

当 ESP32 尝试读取或写入无效内存地址时,会发生 LoadProhibited 错误。相关地址存储在EXCVADDR寄存器中 - 在本例中我们可以看到是0x00000055。这意味着您对 uart_write_bytes() 的调用(即使无效)并不是重置的原因 - 因为您没有在任何调用中传递地址 0x00000055

我怀疑您的问题是您没有为 FreeRTOS 任务分配足够大的堆栈。例如,如果您创建堆栈大小为 configMINIMAL_STACK_SIZE 的任务,则这可能不足以使用 UART。堆栈溢出也会导致 LoadProhibited 错误。

堆栈大小是传递给xTaskCreate() 的第三个参数。尝试验证它是否至少为 1024,并根据需要增加。

关于c++ - 无法写入串口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56535629/

相关文章:

c++ - gcc 在错误的目录下搜索头文件

c++ - GLL Parser Combinator or Generator in/for C or C++

c - C 中的可变大小数组和数组指针

c - 如何确保 C 内核模块只有一个实例正在运行(单例)?

c++ - 将 shared_ptr 与 FreeRTOS 队列一起使用

freertos - 如何在 FreeRTOS 中进行文件处理

c++ - 传递 boost discrete_interval 作为此参数会丢弃限定符 [-fpermissive]

c++ - Mat& 与 Mat opencv 2 c++

c - "Array Subscript is not an integer"c

c - stm32l4 RTC HAL 不工作