This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430F5438A:Z-Stack/OSAL 2.5.1事件计时器从 HW ISR 启动

Guru**** 1635420 points
Other Parts Discussed in Thread: Z-STACK
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1301532/msp430f5438a-z-stack-osal-2-5-1-event-timer-start-from-hw-isr

器件型号:MSP430F5438A
主题中讨论的其他器件: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 的好处、因为使用轮询而不是中断是有效的做法...

是否有简洁的解决方案?

谢谢。

伊尔卡

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [quote userid="510775" url="~/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1301532/msp430f5438a-z-stack-osal-2-5-1-event-timer-start-from-hw-isr 似乎系统在 ISR 之后进入睡眠模式,

    您是否在 ISR 中包含用于退出低功耗模式的代码? MSP430将在从中断返回时恢复之前的模式、除非您已完成更改。 例如包括"LPM4_EXIT"。 (也称为"_BIC_SR_REGISTER_ON_EXIT (LPM4_BITS)")

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Ilkka、

    我不确定 Z-stack 是如何实现的、因为我们不支持 Z-stack 上的 MSP430、因为该解决方案是为支持 ZigBee 的器件实现的。 因此、在此处使用 Z-stack 可能存在根本问题、会导致 MSP430效率低下。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我回到使用 io_pins.c 中现成的端口2中断处理程序、并且有一个__low_power_mode_off_on_exit ()应清除 SR 寄存器位、从而根据我的理解禁用 ISR 退出中的低功耗模式。 (这有点误导 Pins_Set Function()中的备注是" *\param lowPower -如果为 true,LOW_POWER_MODE_ON_EXIT ()在中断中被调用",而我认为相反,当调用 lowPower=true 时,实际上意味着当退出 ISR 时,时钟应该正在运行)。


    无论如何,尽管低功耗模式保持激活是有意义的,但如果我使用 osal_start_timerEx()启动一个定时事件(例如在一秒后),即使在退出 ISR 时低功耗模式保持激活状态,也不应该启动该事件? 我可以通过 osal_next_timeout()看到下一个超时被更新,但可能也需要其他东西(?)。 调用 osal_adjust_timers()似乎没有什么区别。 似乎在随机时间后执行发出的事件。

    值得注意的是、我在端口1中有一个 HW 中断、它以相同的方式利用 IO_PINS.c 中的 ISR 处理程序、它似乎正常工作。 在端口2中、我有两个中断引脚、似乎只有这些中断引脚会出现问题。 我使用 IAR C/C++编译器、并且使用 Port1的代码是用 C 编写(编译)的、而有问题的 Port2中断与一些 C++代码(.cpp 源代码)组合在一起。 我想知道 IAR 编译器是否会让这里变得有趣...(?)

    我可以看到、使用 ISR 进入和退出的操作正是如此、实际上与某些 TimerB 硬件中断代码组合在一起。 此外、任务-事件机器按照预期的方式工作(与 C++组合)、也就是说、事件不是从 ISR 本身启动的。