FreeRTOS 其它知识点

目录

一、低功耗Tickless模式

1、低功耗Tickless模式的引入

2、Tickless 具体实现

二、空闲任务

1、空闲任务相关知识点

2、钩子函数

3、空闲任务钩子函数

三、使用RTOS的好处


一、低功耗Tickless模式

1、低功耗Tickless模式的引入

        FreeRTOS 的系统时钟是由滴答定时器中断来提供的,系统时钟频率越高,那么滴答定时器中断频率也就越高。中断是可以将MCU从睡眠模式中唤醒,周期性的滴答定时器中断就会导致MCU周期性的进入和退出睡眠模式。因此,如果滴答定时器中断频率太高的话会导致大量的能量和时间消耗在进出睡眠模式中,这样导致的结果就是低功耗模式的作用被大大的削弱。

        为此,FreeRTOS 特地提供了一个解决方法——Tickless 模式,当处理器进入空闲任务周期以后就关闭系统节拍中断(滴答定时器中断),只有当其他中断发生或者其他任务需要处理的时候处理器才会被从低功耗模式中唤醒。

2、Tickless 具体实现

(1)宏 configUSE_TICKLESS_IDLE

        要想使用Tickless模式,首先必须将FreeRTOSConfig.h 中的宏 configUSE_TICKLESS_IDLE 设置为1。

(2)宏 portSUPPRESS_TICKS_AND_SLEEP()

        使能Tickless模式以后当下面两种情况都出现的时候FreeRTOS内核就会调用宏portSUPPRESS_TICKS_AND_SLEEPO来处理低功耗相关的工作:

①空闲任务是唯一可运行的任务,因为其他所有的任务都处于阻塞态或者挂起态。

②系统处于低功耗模式的时间至少大于configEXPECTED_IDLE_TIME_BEFORE_SLEEP个时钟节拍,宏configEXPECTED_IDLE_TIME_BEFORE_SLEEP默认在文件FreeRTOS.h中定 义为2,我们可以在FreeRTOSConfig.h中重新定义,此宏必须大于2!

(3)宏 configPRE_SLEEP_PROCESSING() 和 configPOST_SLEEP_PROCESSING()

        在真正的低功耗设计中不仅仅是将处理器设置到低功耗模式就行了,还需要做一些其他的处理,比如:

①将处理器降低到合适的频率,因为频率越低功耗越小,甚至可以在进入低功耗模式以后关 闭系统时钟。 

②修改时钟源,晶振的功耗肯定比处理器内部的时钟源高,进入低功耗模式以后可以切换到 内部时钟源,比如STM32的内部RC振荡器。

③关闭其他外设时钟,比如IO口的时钟。

④关闭板子上其他功能模块电源,这个需要在产品硬件设计的时候就要处理好,比如可以通 过 MOS 管来控制某个模块电源的开关,在处理器进入低功耗模式之前关闭这些模块的 电源。

        FreeRTOS为我们提供了一个宏来完成这些操作,它就是configPRE_SLEEP_PROCESSING(),这个宏的具体实现内容需要用户去编写

        如果在进入低功耗模式之前我们降低了处理器频率、关闭了某些外设时钟等的话,那在退出低功耗模式以后就需要恢复处理器频率、重新打开外设时钟等,这个操作在宏configPOST_SLEEP-PROCESSING()中完成,同样的这个宏的具体内容也需要用户去编写

(4)宏 configEXPECTED_IDLE_TIME_BEFORE_SLEEP

        处理器工作在低功耗模式的时间太短没有意义,所以我们必须对工作在低功耗模式的时间做个限制,宏configEXPECTED_IDLE_TIME_BEFORE_SLEEP就是用来完成这个功能的。

        默认情况下configEXPECTED_IDLE_TIME_BEFORE_SLEEP为2个时钟节拍,并且最小不能小于2个时钟节拍。如果要修改这个值的话可以在文件FreeRTOSConfi.h中对其重新定义。 此宏会在空闲任务函数prvldleTask()中使用!

二、空闲任务

1、空闲任务相关知识点

(1)当FreeRTOS的调度器启动以后就会自动的创建一个空闲任务,这样就可以确保至少有一任务可以运行。但是这个空闲任务使用最低优先级,如果应用中有其他高优先级任务处于就绪态的话这个空闲任务就不会跟高优先级的任务抢占CPU资源。

(2)空闲任务还有另外一个重要的职责,如果某个任务要调用函数vTaskDelete()删除自身,那么这个任务的任务控制块TCB和任务堆栈等这些由 FreeRTOS 系统自动分配的内存需要在空闲任务中释放掉如果删除的是别的任务那么相应的内存就会被直接释放掉,不需要在空闲任务中释放。

2、钩子函数

(1)FreeRTOS 中有多个钩子函数,钩子函数类似回调函数,当某个功能(函数)执行的时候就会调用钩子函数,至于钩子函数的具体内容那就由用户来编写。

(2)钩子函数是一个可选功能,可以通过宏定义来选择使用哪个钩子函数,可选的钩子函数如下表所示:

        钩子函数的使用方法基本相同,用户使能相应的钩子函数,然后自行根据实际需求编写钩子函数的内容。

3、空闲任务钩子函数

(1)要使用空闲任务钩子函数首先要在FreeRTOSConfig.h中将宏configUSE_IDLE_HOOK改为 1,然后编写空闲任务钩子函数vApplicationIdleHook()。

(2)在每个空闲任务运行周期都会调用空闲任务钩子函数,如果想在空闲任务优先级下处理某个任务有两种选择:

①在空闲任务钩子函数中处理任务。但是绝对不能在空闲任务钩子函数中调用任何可以 阻塞空闲任务的API函数,比如vTaskDelay(),或者其他带有阻塞时间的信号量或 队列操作函数。

②创建一个与空闲任务优先级相同的任务。创建一个任务是最好的解决方法,但是这种 方法会消耗更多的RAM。

(3)在空闲任务钩子函数中将处理器设置为低功耗模式,与FreeRTOS自带的Tickless模式比较:

①在空闲任务钩子函数进入低功耗模式的话每个滴答定时器中断都会将处理器从低功耗模式中唤醒,然后进入再进入低功耗;反复的进入低功耗、退出低功耗太需要时间,而且切换太频繁,系统不稳定。

②相对在空闲任务钩子函数进入低功耗模式, FreeRTOS自带的Tickless模式更加合理有效。

三、使用RTOS的好处

1、把功能按任务划分,减少功能代码之间的耦合性;

2、增加代码的扩展性,方便后期的维护,功能的添加或者删减;

3、增加代码的可读性;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/710177.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器人内部传感器阅读梳理及心得-速度传感器-数字式速度传感器

在机器人控制系统中,增量式编码器既可以作为位置传感器测量关节相对位置,又可作为速度传感器测量关节速度。当作为速度传感器时,既可以在模拟量方式下使用,又可以在数字量方式下使用。 模拟式方法 在这种方式下,需要…

5 分钟配置好 Electron 应用的图标

最近在开发博客本地客户端 HexoPress,应用做好后,需要打包,如果不希望打包出来 App 的图标用的是 Electron 默认的星球环绕的图标,那么需要自己制作图标。 制作图标 首先,你需要给各种操作系统制作一个满足要求的图标…

会声会影2024出来了吗?

近年来,随着人们对于娱乐和创意的需求不断增长,视频编辑软件也越来越受到大众的关注。其中,会声会影是一款备受欢迎的视频编辑软件,许多用户都在关注其新版本——会声会影2024。 然而,目前并没有官方宣布会声会影2024的…

虚拟机 VMware 安装 WindowsXP 系统(基于 iso 光盘镜像)

下载好对应的 iso 文件 依次点击文件 -> 新建虚拟机 选择自定义,然后下一步 默认 浏览选中我们刚才下载好的xp系统光盘镜像 iso 文件 下一步 不用输密钥,直接下一步 浏览选择存放虚拟机的位置 下一步 没必要多分处理器内核给它,默认一…

每日五道java面试题之spring篇(十)

目录: 第一题 Spring在运行时通知对象第二题 在Spring AOP 中,关注点和横切关注的区别是什么?在spring aop 中 concern 和 cross-cutting concern 的不同之处?第三题 Spring通知有哪些类型?第四题 什么是切面 Aspect&a…

一个Bug搞懂浏览器缓存策略

最近项目遇到一个问题,发版之后,用户需要清除缓存才可以访问到最新的应用,但是我们访问却可以正常。经过1天的研究搞懂了浏览器缓存的机制,记录下分析轨迹。 浏览器缓存基础知识 浏览器强缓存和协议缓存都是用来提高网页加载速度…

Linux:Makefile的相关知识

背景: 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的 规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复…

【leetcode】破解闯关密码 模板字符串

/*** param {number[]} password* return {string}*/ var crackPassword function(password) {return minNumspassword.sort((a,b)>{if(${a}${b}-${b}${a}>0){return 1;}else{return -1;}}).join(""); };巧用模板字符串对数组进行排序

Restful风格解释

示例对比 传统风格开发 Restful风格开发 结论: 传统风格开发中,前端不同操作使用不同的url来访问后端,使得访问变得麻烦restful风格中,前端使用相同的url来访问后端,但是用数据传送方式进行区分(get为请求…

STM32标准库——(13)USART串口数据包

1.HEX数据包 2.文本数据包 3.HEX数据包接收 对于固定包长的HEX数据包,我们可以定义三个状态:等待包头、接收数据、等待包尾,每个状态。都可以用一个变量来标志,例如变量S来表示。这三个状志可以依次定义为S0、S1、S2。类似于置标志位&#xf…

Android Studio level过滤查看各个等级的日志

Android Studio level过滤查看各个等级的日志 旧版as可以在下方的日志输出框选择debug、info,warn、error日志,新版的需要通过在过滤框手动/联想输入 level:xxx,过滤相应等级的日志,如图: android studio/idea返回/前进…

javaee教程郑阿奇课后答案,三年经验月薪50k我是怎么做到的

个人背景 如标题所示,我的个人背景非常简单,Java开发经验1年半,学历普通,2本本科毕业,毕业后出来就一直在Crud,在公司每天重复的工作对我的技术提升并没有什么帮助,但小镇出来的我也深知自我努…

网络工程师笔记3

IP地址类型 A类 255.0.0.0B类 255.255.0.0C类 255.255.255.0D类 E类 子网掩码:从左到右连续的确定网络位 2-4-8-16-32-64-128-256 128 : 1000 0000 64 : 0100 0000 32 : 0010 0000 16 : 0001 0000 8 &am…

Linux和Windows集群中部署HTCondor

目录 1、集群架构 2、HTCondor版本 3、Linux系统安装 3.1、HTCondor安装 3.2、中央管理节点配置 3.3、其他节点配置 4、Windwos系统安装 5、安全配置 6、参考 1、集群架构 操作系统IP地址1*Ubuntu22.04192.168.1.742Ubuntu22.04192.168.1.603Ubuntu22.04192.168.1.6…

Squid代理服务器配置

需求是:通过外网机(跳板机)访问内网机,并为内网机提供访问网络的能力。 【跳板机T】【内网机N】 公网IP:39.107.xx.xxx 跳板机IP:172.17.216.234 内网机IP:172.17.216.241 Squid代理服务器地址…

Linux磁盘设备LVM介绍和常用场景说明

Linux常见的物理设备数据备份和负载均衡模式 1. LVM技术说明2. 相关概念3. 常用命令3.1 安装lvm命令3.2 创建分区3.3 格式化成LVM3.4 其他格式化 4. 常用场景4.1 创建LVM并挂载4.2 LVM扩容4.2.1 xfs扩容4.2.2 ext4扩容 4.2 缩减逻辑卷lv4.3 缩减vg:(迁移…

设计模式(二)单例模式

单例模式:确保一个类只有一个实例,并提供了全局访问点;主要是用于控制共享资源的访问; 单例模式的实现分为懒汉式和饿汉式。 懒汉式单例在需要时才会创建,而饿汉式单例则在类加载时立即创建实例; 单例模…

印象笔记 - Markdown 入门指南

一、Markdown 是什么? Markdown 是一种轻量级的「标记语言」,创始人为约翰格鲁伯,用简洁的语法代替排版,目前被越来越多的知识工作者、写作爱好者、程序员或研究员广泛使用。其常用的标记符号不超过十个,相对于更为复…

一文速览深度伪造检测(Detection of Deepfakes):未来技术的守门人

一文速览深度伪造检测(Detection of Deepfakes):未来技术的守门人 前言一、Deepfakes技术原理卷积神经网络(CNN):细致的艺术学徒生成对抗网络(GAN):画家与评审的双重角色…

MySQL 逗号分隔查询--find_in_set()函数

业务场景: 在使用MySQL的时候,可能的某个字段存储的是一个英文逗号分割的字符串(这里我们不讨论表设计的合理性),如图所示: 我们在查询的时候需要匹配逗号分割中的某个字符串,该怎么查询呢&am…