FreeRTOS学习笔记(5、定时器、中断管理、调试与优化)

本文是FreeRTOS学习笔记第五部分,介绍了定时器的三要素、状态及基本使用,包括创建、开启和消抖方法;阐述了中断管理中两套API函数区别、参数使用和定时器在ISR中的应用;讲解了资源管理里临界资源的访问方式,还提及调试和优化的手段与方法。

前言

这是第五弹,由于CSDN长度的限制,所以把FreeRTOS学习分为几部分来发,这是第五部分


主要包括定时器、中断管理、调试和优化

往期学习笔记链接

第一弹FreeRTOS学习笔记(1、FreeRTOS初识、任务的创建以及任务状态理论、调度算法等)
第二弹: FreeRTOS学习笔记(2、同步与互斥通信、队列、队列集的使用)
第三弹: FreeRTOS学习笔记(3、信号量、互斥量的使用)
第四弹: FreeRTOS学习笔记(4、事件组、任务通知)
第五弹: FreeRTOS学习笔记(5、定时器、中断管理、调试与优化)

学习工程

所有学习工程
oufen / FreeRTOS学习
都在我的Gitee工程当中,大家可以参考学习

定时器

闹钟什么时候响,闹钟响了之后要做什么事情,这个闹钟是一次性的还是周期性的

定时器的三要素

  • 超时时间(定时器周期)
  • 回调函数
  • 单次触发还是周期性的触发

守护任务

  • 守护任务的作用
    • 处理命令,从命令队列中取出命令、处理
    • 执行定时器的回调函数

能否及时执行定时器中断回调函数,严重依赖于守护任务的优先级

image.png
image.png

创建定时器后,然后启动定时器

启动定时器,实质上是向队列中写入命令数据,第二个参数就是等待时间,如果队列满的话,就无法写入队列,阻塞等待

image.png

启动定时器时,会记录启动定时器的当前tick,此时的tick是初始时间,当定时器过了定时时间后,即当前时间tick>=初始tick+定时时间时,就会触发Timer

对于一次性的定时器,将会触发一次
对于周期性的定时器,将会周期性的触发

定时器回调函数应该尽快执行完,如果执行时间过长,将会阻碍其他定时器函数的执行

在定时器中断回调函数中不要使用delay,不能进入阻塞状态

可以调用在任务中使用的函数,但是等待事件要设置为0,即刻返回,不可以阻塞
否则将会影响其他任务的执行,一直堵塞在定时器中断回调函数中

触发指的是回调函数被调用,被谁调用呢?

  • tick中断中去调用回调函数 (在Linux中调用)
  • 在FreeRTOS中,只能在某个任务中执行

tick中断,每定时1次,就会判断一下,有没有超时的定时器,如果有的话将会唤醒这个任务,调用回调函数,这个任务被称为守护任务

守护任务的函数
image.png

image.png

当tick中断把守护任务唤醒之后,如果他的优先级比较高的话,最高的话就可以执行定时器的回调函数
如果优先级比较低,就会被更高优先级任务抢占,那么定时器中断回调函数就无法执行,从而阻塞

守护任务的三个宏定义,一旦使用定时器就需要定义这三个宏,分别表示守护任务的优先级、队列长度、任务分配栈的大小

image.png

守护任务执行Timer回调函数,如果其他任务想要设置Timer,只能通过队列发消息给守护任务(比如启动定时器)

image.png

用户使用定时器时,实质都是把某些命令都发送到定时器命令队列里
把数据存入队列,对方任务就会被唤醒,就会从队列里取出命令,从而修改定时器的值

写入队列,都会有等待时间

定时器的状态

定时器中有两个状态

  • Dormant状态 (休眠状态)
  • Running状态 (运行状态)

image.png

创建定时器时,这个定时器处于Dormant状态,定时器并未运行,我们可以修改定时器的,启动/复位/修改周期
然后从Dormant状态变为Running状态,这个状态在等待定时时间到,时间到了之后函数将会被调用

一次性定时器和周期性定时器不同的在于
周期性定时器被调用后,仍然处于运行状态,会等待下一个超时时间
对于一次性定时器,执行一次后,就不再等待,从Running状态变为Dormant状态

从Running状态进入Dormant状态还可以通过xTimerStop(),停止定时器

定时器的基本使用

1、创建定时器并书写中断回调函数

创建定时器时需要定义相关宏,这是关于守护任务的相关宏
image.png
image.png

#define configUSE_TIMERS 					1 					  /*定时器相关宏*/
#define configTIMER_TASK_PRIORITY 			configMAX_PRIORITIES /*守护任务优先级 设置成最大*/
#define configTIMER_QUEUE_LENGTH    		10					/*守护任务队列的长度*/
#define configTIMER_TASK_STACK_DEPTH        100				   /*守护任务队列的栈大小*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值