【BUG提交】vfs_uart中的代码导致串口中断异常。[IDFGH-5538]

QQ26750452
Posts: 17
Joined: Thu May 13, 2021 1:48 pm

【BUG提交】vfs_uart中的代码导致串口中断异常。[IDFGH-5538]

Postby QQ26750452 » Mon Jul 12, 2021 12:15 pm

IDF: esp-idf v4.2.2
HW: ESP32D0WD-V3
OS: Windows 10


如果开启了CONFIG_VFS_SUPPORT_SELECT特性就会“在ISR内调用flash代码”的错误。

分析过程如下:
【1】在vfs组件里,vfs_uart.c文件中定义了select_notif_callback_isr()函数,它是定位在flash中的代码片段。

Code: Select all

static void select_notif_callback_isr(uart_port_t uart_num, uart_select_notif_t uart_select_notif, BaseType_t *task_woken);
【2】而uart_start_select()被select接口调用时,执行如下代码把select_notif_callback_isr函数配置为uart驱动的select通知回调函数:

Code: Select all

uart_set_select_notif_callback(i, select_notif_callback_isr);
【3】uart.c文件中的uart_set_select_notif_callback函数定义如下:

Code: Select all

void uart_set_select_notif_callback(uart_port_t uart_num, uart_select_notif_callback_t uart_select_notif_callback)
{
  if (uart_num < UART_NUM_MAX && p_uart_obj[uart_num]) {
    p_uart_obj[uart_num]->uart_select_notif_callback = (uart_select_notif_callback_t) uart_select_notif_callback;
  }
}
【4】当uart进入ISR后,多处执行了如下代码,这实际上是调用了flash中的select_notif_callback_isr函数。

Code: Select all

if (p_uart->uart_select_notif_callback) {
  p_uart->uart_select_notif_callback(...);
}
【5】如果此时cache禁用(例如在OTA升级),flash代码不可执行,就会导致异常!

总结:ESP32由于flash用于XIP的设计,同时又用于读写用户数据和OTA。这虽然成本降低了,但引入非常多与此相关的BUG。

QQ26750452
Posts: 17
Joined: Thu May 13, 2021 1:48 pm

Re: 【BUG提交】vfs_uart中的代码导致串口中断异常。[IDFGH-5538]

Postby QQ26750452 » Tue Jul 13, 2021 6:11 am

为了方便技术人员验证,我附上map文件截图如下:
2021-07-13_140819.png
2021-07-13_140819.png (45.76 KiB) Viewed 3852 times

ESP_Gargamel
Posts: 786
Joined: Wed Nov 14, 2018 8:45 am

Re: 【BUG提交】vfs_uart中的代码导致串口中断异常。[IDFGH-5538]

Postby ESP_Gargamel » Tue Jul 13, 2021 6:35 am

感谢反馈,此问题内部已在跟进。

Who is online

Users browsing this forum: No registered users and 113 guests