完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
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。 |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
408浏览 6评论
340浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
324浏览 5评论
324浏览 4评论
311浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-17 20:51 , Processed in 1.287333 second(s), Total 41, Slave 35 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号