主题中讨论的其他器件:Z-STACK
您好!
我们在功耗非常低的传感器中使用了 Z-Stack v.2.5.1 (或2.6.0.3)。
我正在尝试通过硬件中断服务启动事件。 该系统使用 power_saving、可以在几十秒的时间内处于睡眠状态。 硬件中断可以唤醒系统、并且可以正常执行其 ISR。 问题是、我有一个任务(已初始化等)、我想为 ISR 中的任务设置一个事件、该事件会在很短的时间后或退出 ISR 后立即执行。 我不能这样做;ISR 中的 SET 事件仅在下一个 之前可能不相关的计时事件被处理后才被处理。 也就是说、看起来系统在 ISR 之后进入睡眠模式、并且只唤醒之前设置的计时任务、而不是 ISR 中设置的任务。
换言之、多个任务中会处理多个定时事件。 如果我尝试在 ISR 中使用、例如 osal_set_event (MyTaskID、MYEVENT)或计时事件 osal_start_timerEx (MyTaskID、MYEVENT、100)、那么 MyTaskID 中的 MYEVENT 只有在执行之前设置的其他一些计时事件后才会被处理、这可能会在很长一段时间后发生。 看起来系统在退出 ISR 后进入睡眠状态、并且在首先执行之前设置的另一个事件之前、将不会实际处理过期任务的更新列表。
我已经找到了几种权变措施:如果我在 MyTaskID 中设置一个假 my_demut_event、它每秒为示例定期执行、那么在下次 my_demut_event 执行时、在 ISR 中设置的事件将被执行。 另外,如果 使用 osal_pwrmgr_task_state()将 MyTaskID 设置为 PWRMGR_HOLD 状态,则会立即处理 ISR 中设置的事件。 但是、这两种解决方案都很糟糕、因为它们需要过多的功率。 实际上、这消除了使用硬件 ISR 的好处、因为使用轮询而不是中断是有效的做法...
是否有简洁的解决方案?
谢谢。
伊尔卡