完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我的工程大量使用了esp event, 最近的一些工作需要在某些事件发生时同时notify几个事件回调函数, 而且回调函数需要正确的执行顺序, 但我发现这些被注册的回调函数的执行顺序似乎是不可预测的. 在一个模块里, 如果notify A再notify B, 回调的执行顺序是先进入cb_B, 再进入cb_A, 看上去是一个后入先出的栈模型. 但在另一个模块里, 如果 notify C再notify D, 回调的执行顺序是先进入cb_C, 再进入cb_D, 看上去又像是先入先出的队列模型. 所以esp event底层的调用时序到底是如何确定的, 与文件的编译顺序相关吗, 与回调函数定义的先后顺序相关吗, 与notify的执行顺序相关吗
|
|
相关推荐
1个回答
|
|
ESP Event是一个事件通知机制,用于在ESP32和ESP8266等ESP系列芯片上实现模块间的通信。它允许一个模块触发事件,而其他模块可以注册回调函数来响应这些事件。然而,ESP Event的时序逻辑可能因不同模块和编译顺序而有所不同。
首先,我们需要了解ESP Event的工作原理。当一个模块触发一个事件时,ESP Event系统会查找所有注册了该事件的回调函数,并按照注册顺序调用它们。这里的关键是“注册顺序”,而不是编译顺序。编译顺序可能会影响最终的二进制文件,但ESP Event系统关注的是回调函数的注册顺序。 关于您提到的两种不同的时序逻辑,我们可以分析如下: 1. 后入先出(栈模型):在这种情况下,当模块A触发事件后,模块B触发事件,回调函数的执行顺序是先执行B的回调,再执行A的回调。这可能是因为在模块B触发事件之前,模块A的回调函数已经被注册,所以模块B的回调函数会先被调用。 2. 先入先出(队列模型):在这种情况下,当模块C触发事件后,模块D触发事件,回调函数的执行顺序是先执行C的回调,再执行D的回调。这可能是因为在模块D触发事件之前,模块C的回调函数已经被注册,所以模块C的回调函数会先被调用。 为了确保回调函数的正确执行顺序,您可以采取以下措施: 1. 在设计系统时,确保模块之间的依赖关系清晰,避免因模块触发事件的顺序导致回调函数执行顺序的不确定性。 2. 在注册回调函数时,可以显式地指定回调函数的优先级。ESP Event系统允许您在注册回调函数时设置优先级,优先级高的回调函数会先被调用。 3. 在编写回调函数时,尽量避免使用全局变量或共享资源,以减少因回调函数执行顺序不同而导致的潜在问题。 4. 如果可能,使用同步或异步机制来控制回调函数的执行顺序,以确保在特定条件下,回调函数能够按照预期的顺序执行。 总之,ESP Event的时序逻辑主要取决于回调函数的注册顺序,而不是编译顺序。为了确保回调函数的正确执行顺序,您需要在系统设计和回调函数实现方面进行适当的控制。 |
|
|
|
只有小组成员才能发言,加入小组>>
1123 浏览 1 评论
574浏览 6评论
477浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
461浏览 5评论
462浏览 4评论
435浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 15:24 , Processed in 0.885027 second(s), Total 82, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号