freeRtos学习笔记 (6)软件定时器
freeRtos学习笔记
freeRtos软件定时器
软件定时器需要注意事项
- 软件定时器的精度基于时钟节拍,例如系统时钟节拍为10ms, 软件定时器定时时间必须是10ms的整数倍,因此软件定时器一般用于对时间精度要求不高的地方。
- 软件定时器底层也是一个任务,只不过这个任务是freertos自己创建的,和空闲任务类似,因此软件定时器回调函数会被打断,在使用时注意配置好软件定时器任务的优先级,最好优先级高一点。并且千万不要在定时器回调函数中使用延时等导致任务挂起或者杜塞的API,这样会影响定时器任务,从而影响所有定时器回调函数
- 软件定时器可以创建多个,但是会消耗RAM资源,需要配置好对应的堆栈空间。
软件定时器创建
TimerHandle_t xTimerCreate(const char * const pcTimerName, /* 定时器名称 方便调试*/const TickType_t xTimerPeriod, /* 定时器周期 单位系统节拍*/const UBaseType_t uxAutoReload, /* 定时器模式 是否周期性*/void * const pvTImerID, /* 定时器ID 方便多个定时器使用相同回调函数时,进行区分*/TImerCallbackFunction_t pxCallbackFunction); /* 回调函数*/
定时器创建函数
- 第一个参数时定时器名称,方便调试时识别不同定时器
- 第二个参数为定时器周期,单位为系统节拍
- 第三个参数为定时器模式,如果为pdTRUE 则该定时器为周期模式 如果为pdFALSE 则为单次模式
- 第四个参数为定时器ID,当多个定时器公用同一个回调函数时,回调函数中可以根据ID进行区分当前为那个定时器
- 第五个参数为定时器回调函数。
- 返回值:创建成功会返回定时器句柄,否则如果heap内存不够返回NULL
软件定时器开始
BaseType_t xTimerStart(TimerHandle_t xTimer, /* 定时器句柄 */TickType_t xBlockTime); /* 成功启动定时器前的最大等待时间 单位系统节拍 */BaseType_t xTimerStartFromISR(TimerHandle_t xTimer,BaseType_t *pxHigherPriorityTaskWoken);
软件定时器启动函数
- 第一个参数是定时器句柄
- 第二个参数是成功启动定时器前的最大等待时间 单位系统节拍,软件定时器底层也是一个任务,定时器启动其实最终是给定时器任务发送一个消息,消息队列长度通过 configTIMER_QUEUE_LENGTH配置,当消息队列已满,则会进行等待。定时器任务实际执行消息队列发来的命令依赖于定时器任务的优先级,如果定时器任务是高优先级会及时得到执行, 如果是低优先级,就要等待其余高优先级任务释放 CPU 权才可以得到执行,此参数就是设置最大等待时间的。
- 第二个参数在中断中的定时器启动函数其实就是给定时器任务发送一条消息,发送该任务后,定时器任务从堵塞态进入就绪态,如果定时器任务优先级比当前运行的任务优先级高,则pxHigherPriorityTaskWoken为pdTRUE,在中断结束时可以进行任务切换。
- 返回值 返回 pdFAIL 表示此函数向消息队列发送消息失败,返回 pdPASS 表示此函数向消息队列发
送消息成功。
软件定时器停止
BaseType_t xTimerStop( TimerHandle_t xTimer,TickType_t xBlockTime );BaseType_t xTimerStopFromISR(TimerHandle_t xTimer,BaseType_t *pxHigherPriorityTaskWoken);
软件定时器停止函数
- 第一个参数是定时器句柄
- 第二个参数是成功启动定时器前的最大等待时间 单位系统节拍,软件定时器底层也是一个任务,定时器启动其实最终是给定时器任务发送一个消息,消息队列长度通过 configTIMER_QUEUE_LENGTH配置,当消息队列已满,则会进行等待。定时器任务实际执行消息队列发来的命令依赖于定时器任务的优先级,如果定时器任务是高优先级会及时得到执行, 如果是低优先级,就要等待其余高优先级任务释放 CPU 权才可以得到执行,此参数就是设置最大等待时间的。
- 第二个参数在中断中的定时器启动函数其实就是给定时器任务发送一条消息,发送该任务后,定时器任务从堵塞态进入就绪态,如果定时器任务优先级比当前运行的任务优先级高,则pxHigherPriorityTaskWoken为pdTRUE,在中断结束时可以进行任务切换。
- 返回值 返回 pdFAIL 表示此函数向消息队列发送消息失败,返回 pdPASS 表示此函数向消息队列发
送消息成功。
软件定时器复位
BaseType_t xTimerReset( TimerHandle_t xTimer,TickType_t xBlockTime );BaseType_t xTimerResetFromISR(TimerHandle_t xTimer,BaseType_t *pxHigherPriorityTaskWoken);
软件定时器复位函数
- 第一个参数是定时器句柄
- 第二个参数是成功启动定时器前的最大等待时间 单位系统节拍,软件定时器底层也是一个任务,定时器启动其实最终是给定时器任务发送一个消息,消息队列长度通过 configTIMER_QUEUE_LENGTH配置,当消息队列已满,则会进行等待。定时器任务实际执行消息队列发来的命令依赖于定时器任务的优先级,如果定时器任务是高优先级会及时得到执行, 如果是低优先级,就要等待其余高优先级任务释放 CPU 权才可以得到执行,此参数就是设置最大等待时间的。
- 第二个参数在中断中的定时器启动函数其实就是给定时器任务发送一条消息,发送该任务后,定时器任务从堵塞态进入就绪态,如果定时器任务优先级比当前运行的任务优先级高,则pxHigherPriorityTaskWoken为pdTRUE,在中断结束时可以进行任务切换。
- 返回值 返回 pdFAIL 表示此函数向消息队列发送消息失败,返回 pdPASS 表示此函数向消息队列发
送消息成功。
本文参考 freertos官方文档 https://freertos.org/a00110.html
《安富莱 STM32-V6 开发板 FreeRTOS 教程》
freeRtos学习笔记 (6)软件定时器相关推荐
- FreeRTOS学习六(软件定时器)
软件定时器允许设置一段时间,当设置的时间到达之后就执行指定的功能函数,被定时器调用的这个功能函数叫做定时器的回调函数.回调函数的两次执行间隔叫做定时器的定时周期,简而言之,当定时器的定时周期到了以后就 ...
- 【ESP32+freeRTOS学习笔记-开篇前言】
目录 前言的前言 RTOS的选择 开发与实践环境 参考资料 笔记的形式 专题文章的链接(持续更新中......) 前言的前言 单片机的开发,也有两年多了,之前一直是做一些简单应用,因此以裸机开发的方式 ...
- freeRtos学习笔记 (5)事件组
freeRtos学习笔记 freeRtos事件组 为什么要用事件组? 多任务环境下, 任务.中断之间往往需要同步操作,一个事件发生会告知等待中的任 务,即形成一个任务与任务.中断与任务间的同步.事件可 ...
- FreeRTOS学习笔记
FreeRTOS学习笔记 (这是我自己学习FreeRTOS整理的笔记,仅供参考) 第一部分:实现FreeRTOS内核 变量名: 定义变量时往往会把变量的类型当作前缀加在变量上 变量类型 前缀 char ...
- 1、野火freertos学习笔记
野火freertos学习笔记 1.任务 1.1 栈 1.2 任务的切换 taskYIELD(); 1.3 临界段 2.空闲任务 3.任务优先级 4.任务延时的表现 5.时间片 5.1抢占式.协做式 6 ...
- freeRtos学习笔记 (9) 移植和CPU利用率统计
freeRtos学习笔记 (9) 移植和CPU利用率统计 使用官方固件移植 首先准备一个能跑的裸机工程 注意,freertos需要使用systick定时器,而stm32HAL库默认使用systick作 ...
- linux系统管理学习笔记之三----软件的安装
linux系统管理学习笔记之三----软件的安装 2009-12-29 19:10:02 标签:linux 系统管理 [推送到技术圈] 版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 ...
- FreeRtos学习笔记(11)查找就绪任务中优先级最高任务原理刨析
FreeRtos学习笔记(11)查找就绪任务中优先级最高任务原理刨析 怎么查找就绪任务中优先级最高的? tasks.c中声明了一个全局变量 uxTopReadyPriority,任务从其他状态进入就绪 ...
- freeRtos学习笔记 (8) 任务通知
freeRtos学习笔记 freeRtos任务通知 任务通知的优缺点 freeRtos任务控制块中包含两个32位的变量,用于任务通知,在一些情况下,任务通知可以替代信号量和事件组,并且比信号量和事件组 ...
最新文章
- navision系统和sap区别_(三)SAP On Premise和SAP S/4 HANA Cloud的区别
- html5 canvas绘制圆形进度实例
- winform(MDI窗体容器、权限设置)
- pycharm远程和本地同时_pycharm远程开发之django配置
- SpringBoot中整合Mail实现发送带附件的邮件
- mysql中 !40000 DROP DATABASE IF EXISTS `top_server` 这中注释有什么作用?
- qt.pro转成vs程序
- python报错怎么看_python中的错误如何查看
- 了解快照隔离和行版本控制
- poj 2723 2-SAT问题
- 云服务器怎么多人进去编辑文档,服务器如何设置多人登陆
- Raki的统计学习方法笔记0x9章:EM算法及其推广
- 迅雷手机版苹果版_「9月22日」最新 苹果IOS手机迅雷Beta版证书修复版 安卓不限速...
- 靶机渗透练习21-Noob
- 计算机woyd打不开,word打不开怎么办?word文档打不开的几种解决方法
- 大学生川菜网页制作教程 学生HTML静态美食菜品网页设计作业成品 简单网页制作代码 学生美食网页作品免费设计
- html动态工艺流程,化工工艺动态流程图制作软件
- 上海互联网整体沉沦:盛大巨人全没落 8年没出一个马云
- 用ios企业证书发布ipa到服务器上扫码下载
- 转如何用C++实现自动微分
热门文章
- 用友U8 归纳采购退货结算三种情况
- T-SQL 之 表变量和临时表
- sql server服务看不到,显示为远程过程调用在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误10061...
- joomla个性定制(二)
- Gimmie — 一个创新的 GNOME 面板按次
- JavaScript函数的调用
- AndroidStudio编译提示Could not find com.android.tools.lintlint-gradle26.1.3问题的解决
- 基于eclipse创建android的helloworld工程
- Android下的数据存储与访问、权限
- “笨方法”学习Python笔记(1)-Windows下的准备