IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> FreeRTOS-Tickless模式 -> 正文阅读

[嵌入式]FreeRTOS-Tickless模式

FreeRTOS-Tickless模式

  • 很多场合中对功耗要求很严格,并且很多MCU都带有低功耗模式,合理地使用这些低功耗模式可以降低系统的功耗。同时,FreeRTOS也提供了Tickless功耗模式,这样软件和硬件相结合,可以更进一步降低系统功耗,并且配置也很简单。

STM32低功耗模式

  • STM32本身支持低功耗模式,它有休眠、停止、待机三种低功耗模式,相比来说,待机模式功耗最低,休眠模式功耗最高,但是相应地,睡眠模式唤醒延迟最低。下表给出三种模式的对比。
模式开启方式唤醒方式对1.2v域时钟影响对VDD域时钟影响调压器
休眠WFI或WFEWFI时,任意中断唤醒;WFE时,事件唤醒CPU时钟关闭,其他时钟无影响无影响开启
停止PDDS和LPDS位+SLEEPDEEP位+WFI位或WFE位任意EXTI线所有1.2v域时钟都关闭HSI和HSE振荡器关闭开启或处于低功耗模式
待机PDDS为+SLEEPDEEP位+WFI位或WFEWKUP引脚上升沿、RTC相关事件或中断所有1.2v域时钟关闭HSI和HSE振荡器关闭关闭

睡眠模式

  • 进入睡眠模式有两种指令:WFI(等待中断)和WFE(等待事件)。CMSIS中提供了两个函数来操作指令WFI和WFE,我们可以直接使用这两个函数,分别是__WFI和__WFE,FreeRTOS系统使用的是WFE进入休眠模式。
  • 如果使用WFI进入休眠模式,那么休眠期间 任意一个中断都会将MCU从休眠状态只用唤醒;使用WFE进入休眠模式,那么当有事件发生的话就会退出休眠模式。STM32进入休眠模式的时候,CM3内核停止运行,但是其他外设都正常。

Tickless模式

  • 在前面时间信息统计那一章节中,我们曾经统计了各个任务运行占用的时间,结果发现,处理器大部分时间都在处理空闲任务,而空闲任务一般都是不重要的任务,所以这期间可以进入低功耗模式。FreeRTOS就是通过这样来降低功耗的,一般会在空闲任务的相关钩子函数中进行一些相关低功耗处理,比如关闭外设时钟、降低系统主频等等。但是这里有个问题就是,既然FreeRTOS使用的是WFI,如果不关闭Systick只要有中断发生就会退出低功耗模式,这样对降低功耗极其不利。如果关闭SyStick那么会导致系统时钟停止运行,系统时钟都停止运行了,FreeRTOS系统就没办法正常工作了。所以,为了解决这个问题,我们还需要另一个定时器,该定时器只需要将系统节拍停止这段时间补偿上去就可以了,如果使用的MCU自带低功耗定时器,那么可以使用这个低功耗定时器来完成这项任务。不幸的是,STM32F1没有这个定时器,那是不是意味着就不能使用Tickless模式了?照样可以使用,只是我们会继续使用滴答定时器来完成这个工作,不过此时的滴答定时器工作模式有所变化。这时候当进入低功耗模式前,将会计算下一个任务的执行时间,根据这个计算时间,滴答定时器只需要在该时间点将系统唤醒,而不需要每个节拍都唤醒,然后再将这段时间补偿到系统实拍中就可以解决了。那么如何计算下一个任务的唤醒时间呢?值得庆幸的是,FreeRTOS已经帮我们提前做好了。我们只需要完成相关配置即可。下面讲述配置过程。

Tickless模式配置

  • 首先开启低功耗模式,也就是使能宏:configUSE_TICKLESS_IDLE 为1。
  • 开启低功耗模式以后,当满足空闲任务是唯一可运行的任务并且系统处于低功耗模式的时间大于configEXPECTED_IDLE_TIME_BEFORE_SLEEP个时钟节拍系统才会进入低功耗模式,为什么要有这个条件呢?其实容易想到,如果低功耗模式时间过短,刚进入低功耗模式就推出了,那就完全没有必要进入了。这个最小节拍可以有用户自己定义。系统默认定义如下
#ifndef configEXPECTED_IDLE_TIME_BEFORE_SLEEP
	#define configEXPECTED_IDLE_TIME_BEFORE_SLEEP 2
#endif
#if configEXPECTED_IDLE_TIME_BEFORE_SLEEP < 2
	#error configEXPECTED_IDLE_TIME_BEFORE_SLEEP must not be less than 2
#endif
  • 从上面可以看出,低功耗持续时间最小是2个节拍。
  • 满足上述条件后,系统会调用vPortSuppressTicksAndSleep()这个函数,该函数会使系统进入睡眠模式,并进行任务补偿,需要注意的是,在进入低功耗模式前和退出低功耗模式后,系统都会调用两个函数来做一些低功耗的处理,这两个函数分别是configPRE_SLEEP_PROCESSING()和configPOST_SLEEP_PROCESSING(),这两个函数需要用户自己定义,其完成的功能可以是使能或除能相应外设,降低或回复系统时钟频率等。这里我们定义如下:
  • FreeRTOSConfig.h文件
extern void PreSleepProcessing(u32 xExpectedIdleTime);
extern void PostSleepProcessing(u32 xExpectedIdleTime);	

#define configPRE_SLEEP_PROCESSING  		PreSleepProcessing
#define configPOST_SLEEP_PROCESSING  		PostSleepProcessing
  • 函数定义
//进入低功耗模式前的工作
void PreSleepProcessing(TickType_t xExpectedIdleTime)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,DISABLE);
	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);
}

//退出低功耗模式后的工作
void PostSleepProcessing(TickType_t xExpectedIdleTime)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	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);
}

  • 低功耗相关的配置就讲述完了,这一章只是讲了如何使用和配置Tickless模式,一些深入的内容这里没有分析。
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-12 13:19:13  更:2021-09-12 13:21:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 11:41:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码