打印
[STM32F1]

使用RTOS和低功耗会有冲突吗?

[复制链接]
467|36
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yangjiaxu|  楼主 | 2024-8-31 22:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用RTOS和低功耗会有冲突吗?

使用特权

评论回复
沙发
flycamelaaa| | 2024-9-11 15:59 | 只看该作者
使用RTOS和低功耗设计之间并不冲突。通过合理的硬件选择、软件架构设计、利用RTOS的空闲任务和采用tickless模式等策略

使用特权

评论回复
板凳
LOVEEVER| | 2024-9-12 15:09 | 只看该作者
理论上其实是没有冲突的,主要的对于程序选择

使用特权

评论回复
地板
averyleigh| | 2024-9-13 20:55 | 只看该作者
在使用RTOS(如FreeRTOS)时,与低功耗模式可能会存在一些冲突。

使用特权

评论回复
5
公羊子丹| | 2024-9-14 07:51 | 只看该作者
RTOS(如FreeRTOS)通过时钟定时器(一般是SysTick定时器)来管理任务调度,通常需要一个周期性中断来确保任务切换。

使用特权

评论回复
6
童雨竹| | 2024-9-14 07:52 | 只看该作者
低功耗模式(如睡眠模式、停止模式、待机模式)通常会关闭或减缓时钟,以减少功耗。特别是在停止模式和待机模式下,主时钟源(如HSE、PLL)会被关闭,这会导致SysTick定时器停止工作,进而影响RTOS的任务调度。

使用特权

评论回复
7
周半梅| | 2024-9-14 07:52 | 只看该作者
STM32F1系列MCU支持多种低功耗模式:

睡眠模式:CPU停止运行,但所有外设继续工作,功耗较小。此模式对RTOS几乎没有影响,因为SysTick定时器仍然工作。
停止模式:大部分时钟(包括SysTick)被关闭,但RAM和寄存器的内容保持不变。此模式对RTOS的影响较大,需要特别处理。
待机模式:几乎所有功能都被关闭,除非通过外部中断唤醒。待机模式下RTOS无法运行,因为系统处于完全停止状态。

使用特权

评论回复
8
帛灿灿| | 2024-9-14 07:53 | 只看该作者
进入低功耗模式前暂停RTOS调度器:可以通过在进入低功耗模式之前,手动暂停RTOS调度器,这样可以确保任务调度不会在低功耗模式下发生。
FreeRTOS 提供了 vTaskSuspendAll() 和 vTaskResumeAll() 这两个函数,允许你在进入低功耗模式之前暂停调度器,并在退出低功耗模式后恢复调度。

使用特权

评论回复
9
万图| | 2024-9-14 07:53 | 只看该作者
使用睡眠模式:如果你希望RTOS在低功耗模式下继续正常工作,推荐使用睡眠模式而非停止或待机模式。在睡眠模式下,SysTick仍然工作,RTOS也能正常调度任务。

使用特权

评论回复
10
Wordsworth| | 2024-9-14 07:54 | 只看该作者
启时钟与恢复RTOS:对于停止模式或更深的低功耗模式,需要在从低功耗模式唤醒时手动重新初始化时钟系统(如重新配置HSE或PLL),并让RTOS的SysTick定时器恢复运行。
中断唤醒机制:RTOS任务往往依赖于中断进行唤醒和事件处理,因此可以配置外设(如RTC、CAN、USART等)来在进入低功耗模式时触发中断,从而唤醒系统。

使用特权

评论回复
11
Pulitzer| | 2024-9-14 07:55 | 只看该作者
reeRTOS支持Tickless Idle模式,这是一种专门设计用来减少RTOS和低功耗冲突的机制:

Tickless Idle 模式允许RTOS在系统处于空闲状态时停止定时器中断,进入低功耗模式。当有任务需要运行时,它会根据外部中断唤醒MCU,并重新启动时钟。
这种方式非常适合低功耗应用,能够显著降低功耗,同时维持RTOS的调度能力。
在FreeRTOS中启用Tickless Idle模式,步骤如下:

在FreeRTOSConfig.h中定义 configUSE_TICKLESS_IDLE:
c
#define configUSE_TICKLESS_IDLE 1
然后在vPortSuppressTicksAndSleep()函数中实现低功耗模式切换逻辑。STM32 HAL库提供了 HAL_PWR_EnterSLEEPMode() 或 HAL_PWR_EnterSTOPMode() 来控制进入低功耗模式。

使用特权

评论回复
12
Bblythe| | 2024-9-14 07:55 | 只看该作者
电源管理和任务管理的配合
空闲任务钩子函数:RTOS通常会有一个空闲任务,当系统没有其他任务需要运行时,它会进入空闲任务。你可以使用RTOS的空闲任务钩子函数(vApplicationIdleHook())来让系统在没有任务运行时自动进入低功耗模式。

void vApplicationIdleHook(void)
{
    /* 当系统空闲时进入低功耗模式 */
    __WFI(); // Wait for Interrupt指令,让MCU进入睡眠模式
}

使用特权

评论回复
13
Uriah| | 2024-9-14 07:56 | 只看该作者
考虑外设唤醒能力
确保系统进入低功耗模式时,关键外设(如RTC、USART等)能够正常唤醒系统。在STM32的低功耗模式下,一些外设(如USART、RTC、CAN等)能够继续工作,并通过中断唤醒MCU。
在使用RTOS时,可以配置中断服务例程(ISR)唤醒系统,并根据外设的需求选择合适的低功耗模式。

使用特权

评论回复
14
Clyde011| | 2024-9-14 07:56 | 只看该作者
时钟源选择
为了在从低功耗模式中唤醒后迅速恢复RTOS任务调度,你需要考虑时钟恢复的速度。例如,HSE(高速外部时钟)和PLL的恢复速度通常较慢,而使用HSI(高速内部时钟)或LSE(低速外部时钟)可以更快地恢复系统时钟。

使用特权

评论回复
15
Clyde011| | 2024-9-14 07:57 | 只看该作者
在STM32F1上,RTOS和低功耗的确存在一些潜在的冲突,但通过合理配置和使用FreeRTOS的Tickless Idle模式,可以减少RTOS对低功耗模式的影响,并有效利用低功耗模式来延长电池寿命或减少功耗。关键在于合理选择低功耗模式,并确保RTOS调度和时钟系统在进入低功耗状态和唤醒时的同步配合。

使用特权

评论回复
16
jtracy3| | 2024-9-14 10:56 | 只看该作者
RTOS通常依赖于系统时钟(如SysTick定时器)来实现任务调度和时间管理。然而,在STM32的低功耗模式下,系统时钟可能会被关闭或降低频率,这可能导致RTOS的任务调度出现问题。

使用特权

评论回复
17
jkl21| | 2024-9-14 14:43 | 只看该作者
STM32系列微控制器提供了多种低功耗模式,如Sleep、Stop和Standby模式,这些模式可以在不同程度上降低系统的能耗。

使用特权

评论回复
18
wengh2016| | 2024-9-14 16:44 | 只看该作者
关闭不使用的外围设备,或将它们置于低功耗模式,以减少整体功耗。

使用特权

评论回复
19
cashrwood| | 2024-9-14 21:17 | 只看该作者
在嵌入式系统中,低功耗设计是延长电池寿命、减少热量产生、提高系统可靠性的重要手段。STM32等微控制器提供了多种低功耗模式,如睡眠模式、停止模式和待机模式,以满足不同场景下的低功耗需求。

使用特权

评论回复
20
alvpeg| | 2024-9-15 09:23 | 只看该作者
RTOS 通常会进行任务调度,不断地切换任务执行。这可能会干扰低功耗模式的进入。例如,当系统准备进入低功耗模式时,如果有高优先级的任务突然就绪,RTOS 可能会阻止系统进入低功耗模式,以执行该任务。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:嵌入式技术专家
简介:擅长电路设计、物联网产品开发、射频产品开发,喜欢打篮球,技术交流,欢迎各位来聊~

586

主题

2402

帖子

5

粉丝