完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
这是我遇到的 SDK 中的一个小错误 (esp_iot_sdk_v0.9.5_b1):
我在 timer1 上使用计时器中断: ets_frc_timer1_intr_attach(...); tm1_edge_int_enable(); ets_frc1_intr_enable(); 每毫秒左右运行一次。 如果我同时执行 Flash 擦除/Flash 写入: spi_flash_erase_sector(...); spi_flash_write(...); 如果在闪存访问期间发生计时器中断,ESP 似乎会崩溃并重新启动。 当然,这可以通过在访问 Flash 时禁用中断来解决。但是,如果我已经在 user_init() 中启动定时器中断,我会遇到类似的问题:如果我这样做,esp 将重新启动。只有当我在 ESP 连接到 wifi 网络后启用计时器中断时,一切正常。我猜这是由同样的问题引起的:固件从闪存页 7c-7f 读取存储的配置数据。不幸的是,我无法在发生这种情况时暂时禁用中断,因为它发生在您的 SDK 代码中。 |
|
相关推荐
1个回答
|
|
在这种情况下,我们需要解决在 SPI Flash 操作期间计时器中断导致的崩溃问题。以下是一些建议和解决方案:
1. **禁用中断**:在访问 SPI Flash 时,暂时禁用中断。这可以通过调用 `ets_intr_lock()` 和 `ets_intr_unlock()` 函数来实现。在访问 Flash 之前调用 `ets_intr_lock()`,访问完成后调用 `ets_intr_unlock()`。这样可以确保在 Flash 操作期间不会触发计时器中断。 ```c void IRAM_ATTR user_init() { // 初始化代码 ets_intr_lock(); spi_flash_erase_sector(sector); spi_flash_write(offset, data, length); ets_intr_unlock(); } ``` 2. **调整中断优先级**:如果可能的话,尝试调整计时器中断的优先级,使其低于 Flash 操作的优先级。这样可以确保在 Flash 操作期间,计时器中断不会被处理。 3. **使用软件中断**:考虑使用软件中断来处理计时器中断。这样,你可以在 Flash 操作完成后手动触发中断处理。这可以通过调用 `xthal_set_ccompare(1, xthal_get_ccount() + 1000);` 来实现,其中 1000 是中断触发的时间间隔。 4. **优化 Flash 操作**:检查你的 Flash 操作是否可以优化,以减少所需的时间。这可能包括减少写入的数据量、使用更快的写入模式等。 5. **使用任务调度**:考虑使用 FreeRTOS 的任务调度功能来处理计时器中断。这样,你可以在 Flash 操作完成后,将中断处理任务添加到任务队列中,而不是直接在中断服务例程中处理。 6. **升级 SDK**:你提到的 SDK 版本较旧(esp_iot_sdk_v0.9.5_b1),可能存在一些已知的问题。尝试升级到较新的 SDK 版本,看看问题是否得到解决。 7. **查看错误日志**:在出现问题时,查看 ESP8266 的错误日志,以获取更多关于崩溃原因的信息。这可以帮助你更好地了解问题所在,并找到合适的解决方案。 |
|
|
|
只有小组成员才能发言,加入小组>>
545浏览 6评论
457浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
437浏览 5评论
441浏览 4评论
411浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 08:21 , Processed in 0.875024 second(s), Total 82, Slave 64 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号