无法写入串行
Cannot write to serial
我正在将 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 = '[=11=]';
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,并根据需要增加。
我正在将 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 = '[=11=]';
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,并根据需要增加。