乐鑫技术交流
直播中

河神大人

8年用户 1481经验值
擅长:电源/新能源
私信 关注
[问答]

请问esp event的时序逻辑是怎样的?

我的工程大量使用了esp event, 最近的一些工作需要在某些事件发生时同时notify几个事件回调函数, 而且回调函数需要正确的执行顺序, 但我发现这些被注册的回调函数的执行顺序似乎是不可预测的.  在一个模块里, 如果notify A再notify B, 回调的执行顺序是先进入cb_B, 再进入cb_A, 看上去是一个后入先出的栈模型. 但在另一个模块里, 如果 notify C再notify D, 回调的执行顺序是先进入cb_C, 再进入cb_D, 看上去又像是先入先出的队列模型. 所以esp event底层的调用时序到底是如何确定的, 与文件的编译顺序相关吗, 与回调函数定义的先后顺序相关吗, 与notify的执行顺序相关吗

回帖(1)

五斤麻辣油

2024-6-7 17:47:58
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的时序逻辑主要取决于回调函数的注册顺序,而不是编译顺序。为了确保回调函数的正确执行顺序,您需要在系统设计和回调函数实现方面进行适当的控制。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分