Cortex M3 - Systick NVIC 禁用 - 节能 FreeRTOS

Posted

技术标签:

【中文标题】Cortex M3 - Systick NVIC 禁用 - 节能 FreeRTOS【英文标题】:Cortex M3 - Systick NVIC Disable - Energy Saving FreeRTOS 【发布时间】:2018-07-20 09:14:21 【问题描述】:

我在 EFM32GG380F1024 上使用 FreeRTOS。 Cortex M SysTick 用于 RTOS 滴答,低能量 rtc (BURTC) 用于在睡眠期间生成定时唤醒调用。能量模式为 EM3(只是超低频仍在运行)。

一旦 Freertos 使用“suppressTicksAndSleep”回调呼叫我,我会执行以下操作:

    通过调用“__disable_irq()”进入关键部分(全局禁用 IRQ) 我通过调用寄存器“SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk;”禁用(至少我尝试过;目前不会工作)Systick 中断 我设置并启动 LowEnergy RTC (BURTC) 进入 EM3

问题是,刚进入能量模式后,SysTick 中断启动并唤醒设备:

这应该是不可能的,原因是:

    能量模式 3 禁用 HF 和 LF 时钟,因此 Systick 计数器甚至不应该增加

有人可以帮忙吗?为什么这不能正确挂起 Systick?

看看我的 tracealyzer 的截图: https://imgur.com/a/8PQ9SSb

【问题讨论】:

您确定 systick 确实被禁用了吗?具体来说,不仅是您没有亲自配置它(我相信您没有),而且没有其他人不配置它(例如 FreeRTOS 中的vPortSetupTimerInterrupt 函数)。检查 NVIC 寄存器值。 好主意。是的,目前 FreeRTOS 通过其“vPortSetupTimerInterrupt()”的弱实现为我做到了这一点。我尝试重载它并自己做。 5 分钟内反馈 :) 我不确定您是否应该这样做。我建议阅读freertos.org/low-power-tickless-rtos.html。虽然我从未在无滴答模式下使用过 FreeRTOS,但在我看来,它确实在不睡觉的时候,systick 可能必须运行 - 因此vPortSetupTimerInterrupt 配置它。但是,portSUPPRESS_TICKS_AND_SLEEP 应该在没有应用程序任务运行时禁用它(请参阅链接中附加的代码)。 “不滴答”并不是真正的“完全不滴答”。 是的,我将此作为 goto 建议。关键是,代码示例基本上就是我在做什么,“prvStopTickInterruptTimer”在我的情况下是“NVIC_DisableIRQ(SysTick_IRQn)”,但这不起作用..谢谢 我个人会尝试缩小问题所在,例如关闭 Rtos 并尝试从您自己的主循环中启用/禁用 Systick(例如,在带有您从调试器手动更改的变量的 if 下) - 看看它是否按预期运行。如果是这样,请查看portSUPPRESS_TICKS_AND_SLEEP 中的哪里中断重新启用并检查它是否被调用。查看是否再次调用计时器配置等。 【参考方案1】:
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk

没有清除CTRL 中的任何位。那行应该是这样的

SysTick->CTRL &= ~(SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk)

清除CLKSOURCEENABLE 的所有位。

【讨论】:

问题是您是要覆盖其他位还是保留它们。但无论如何。我尝试了任何可能的方法,但不起作用。要么它没有停止 systick,要么它成功停止了它,但是重新启用将不再起作用。继续... ...让我想知道的是,99% 的人是否将 systick 用作始终在线的成员?因为这个定时器没有通用库(没有用于 cortex m systick 的 API 来禁用中断、启用中断、重置计数器值,......就像任何驱动程序使用 mcu 特定的硬件定时器(EFM32、STM32、......) ) 还是每个人都忽略了 systick,而是在他们的 MCU 上使用了特定的硬件计时器(所以 systick 大部分时间根本没有使用??)? 我认为 99% 的人都不太关心节能,因此无需停止 systick。

以上是关于Cortex M3 - Systick NVIC 禁用 - 节能 FreeRTOS的主要内容,如果未能解决你的问题,请参考以下文章

FreeRTO之Cortex-M中断管理

STM32 系统定时器(SysTick)

(转)UCOSII在任务切换与出入中断时堆栈指针的使用

GPIO外部中断

什么是NVIC,其作用是什么?

使用系统定时器SysTick实现精确延时微秒和毫秒函数