当前位置: 首页 > news >正文

【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:先进行芯片整片擦除,在尝试下载。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • iOS——方法交换Method Swizzing
  • 安防监控视频打手机检测算法核心技术打手机检测算法源码、模型简介
  • Centos安装配置Gitea(Ubuntu等系统也可参考)
  • 香港一带一路研究院国际事务研究中心副主任陈景才阐述香港在一带一路建设及区块链金融领域的关键作用
  • Mindspore 初学教程 - 3. Tensor 张量
  • NextJs-react开发者的全栈最佳选择(从0-1的react全栈入门指南)
  • ElasticSearch-ELK
  • modelsim 关闭 warning 的方法
  • Linux系统下载并配置vscode(无废话)写C++
  • Spring事务和事务传播机制(下)
  • RK3588 系列之4—入门级完整demo项目
  • 银行创新技术应用系统概览(一)
  • linux基础IO——动静态库——实现与应用学习、原理深入详解
  • 【C语言可变参数函数的使用与原理分析】
  • 搭建VUE+VScode+elementUI环境遇到的问题
  • 【笔记】你不知道的JS读书笔记——Promise
  • CentOS7简单部署NFS
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • ES6系列(二)变量的解构赋值
  • Go 语言编译器的 //go: 详解
  • golang 发送GET和POST示例
  • JavaScript学习总结——原型
  • Java深入 - 深入理解Java集合
  • MySQL-事务管理(基础)
  • React+TypeScript入门
  • SpiderData 2019年2月13日 DApp数据排行榜
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • 编写高质量JavaScript代码之并发
  • 排序(1):冒泡排序
  • 嵌入式文件系统
  • 移动端解决方案学习记录
  • 智能网联汽车信息安全
  • 白色的风信子
  • !$boo在php中什么意思,php前戏
  • # Redis 入门到精通(九)-- 主从复制(1)
  • #include
  • #数据结构 笔记三
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (二)Eureka服务搭建,服务注册,服务发现
  • (回溯) LeetCode 40. 组合总和II
  • (回溯) LeetCode 78. 子集
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (学习总结16)C++模版2
  • (循环依赖问题)学习spring的第九天
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)ORM
  • 、写入Shellcode到注册表上线
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .dwp和.webpart的区别
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • .NET值类型变量“活”在哪?