欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 明星 > 【FreeRTOS】Tickless低功耗模式

【FreeRTOS】Tickless低功耗模式

2024/10/24 23:19:17 来源:https://blog.csdn.net/augu_/article/details/141941296  浏览:    关键词:【FreeRTOS】Tickless低功耗模式

Tickless低功耗模式

  • 低功耗模式Tickless
    • 宏 configUSE_TICKLESS_IDLE
    • 宏 portSUPPRESS_TICKS_AND_SLEEP()
    • 宏 configPRE_SLEEP_PROCESSING ()和 configPOST_SLEEP_PROCESSING()
    • 注意:下载出现Cannot access Memory (@ 0xe00fffe4, Read, Acc Size: 4 Byte);

低功耗模式Tickless

STM32本身支持低功耗模式,一共有三种低功耗模式:

  • 睡眠(sleep)模式
  • 停止(Stop)模式
  • 待机(Standby)模式

进入睡眠模式有两种指令:WFI(等待中断)和WFE(等待事件),在标准库中提供了两个函数来操作指令WFI和WFE,分别是**__WFI__WFE**,FreeRTOS系统会使用WFI指令进入休眠模式。

在FreeRTOS中一般在空闲任务中进入低功耗模式,并且会关闭滴答定时器,不然滴答定时器每次中断触发就要进出一次低功耗模式效率很低,并根据下一个任务的运行时间计算什么时候退出低功耗模式,将计算出来的时间节拍赋给滴答定时器重装载值,这样就不用多次触发滴答定时器中断来判断是否有任务需要执行,导致重复出入低功耗模式了。

宏 configUSE_TICKLESS_IDLE

用于设置是否启动低功耗模式,为1启动低功耗模式。

宏 portSUPPRESS_TICKS_AND_SLEEP()

该宏有一个参数,表示还有多长时间将有任务进入就绪态,当退出低功耗时会自动调用该函数,如果使用STM32的话FreeRTOS已经帮我们写好了,宏的原型为:

#ifndef portSUPPRESS_TICKS_AND_SLEEPextern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime );#define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime )vPortSuppressTicksAndSleep( xExpectedIdleTime )
#endif

本质是调用vPortSuppressTicksAndSleep()函数,在该函数中进出低功耗模式,同时计算距离下一个要执行的任务还有多长时间,以及其他操作。

宏 configPRE_SLEEP_PROCESSING ()和 configPOST_SLEEP_PROCESSING()

这两个宏才是需要我们去实现的,除了在上面的**宏 portSUPPRESS_TICKS_AND_SLEEP()**中进入低功耗以及执行一些实现低功耗的处理之外,还需要我们在做一些其他的处理,比如关闭某些不用的时钟,这些操作就可以在这两个宏的函数中执行,一个是进入低功耗之前会调用的函数,一个是退出低功耗后会调用的函数,在FreeRTOSConfig.h中可以这么定义:

/********************************************************************************/
/* FreeRTOS 与低功耗管理相关配置 */
/********************************************************************************/
extern void PreSleepProcessing(uint32_t ulExpectedIdleTime);
extern void PostSleepProcessing(uint32_t ulExpectedIdleTime);
//进入低功耗模式前要做的处理
#define configPRE_SLEEP_PROCESSING PreSleepProcessing
//退出低功耗模式后要做的处理
#define configPOST_SLEEP_PROCESSING PostSleepProcessing

然后再程序中实现这两个函数PreSleepProcessing()、PostSleepProcessing(),比如在程序中开关时钟:

//进入低功耗模式前需要处理的事情
//ulExpectedIdleTime:低功耗模式运行时间
void PreSleepProcessing(uint32_t ulExpectedIdleTime)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,DISABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,DISABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,DISABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,DISABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,DISABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG,DISABLE);
}
//退出低功耗模式以后需要处理的事情
//ulExpectedIdleTime:低功耗模式运行时间
void PostSleepProcessing(uint32_t ulExpectedIdleTime)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG,ENABLE);
}

注意:下载出现Cannot access Memory (@ 0xe00fffe4, Read, Acc Size: 4 Byte);

在使用低功耗模式时需要注意,单片机进入低功耗模式后,可能导致DAP在低功耗模式下无法烧录,需要检测FreeRTOSConfig.h中的宏configUSE_TICKLESS_IDLE是否为1,如果因为进入低功耗模式无法下载出现上面报错时,可以根据下面的解决方案:

方案1:点击下载后等待1秒然后按下复位键,或者提前按下复位键,点击下载后等待1秒然后松开。

方案2:使用其他的烧录器。

方案3:先进行芯片整片擦除,在尝试下载。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com