6 定时器 &中断管理&资源管理

发布时间 2023-09-21 21:13:13作者: 磕伴

生成函数

周期,多久触发一次定时器(从定时器启动开始计算)  触发什么呢? 回调函数被调用,被谁调用呢

1,tick中断去调用timer函数  Linux中使用这个  (定时器回调函数若执行时间过长,会阻碍其他定时器函数执行)

2,freeRTOS中

一般定时器守护函数设置优先级比较高

使用定时器的话,需要定义宏(守护任务的优先级、队列的长度、栈的深度)

队列的作用:在守护任务中执行timer函数

别的任务(用户程序)设置timer,通过队列发消息来实现,唤醒右下方的守护任务

 定时器状态=  休眠-运行

创建定时器-启动定时器,定时器到点就工作(优先级高会抢占其他任务),可看作是独立于业务逻辑的一套,

 使用定时器去除抖动:

抖动的话会进入中断,中断函数里面初始化定时器(没有超过定时器周期),抖动过程中会一直初始化定时器直到状态稳定后,定时器周期结束,计次+1

 

 

中断管理

区别:

ISR(Interrupt Service Routine)的函数不能阻塞,没有对应的等待时间,队列没满会进入,会唤醒等待队列的任务A,但不调度,只记录需要发起调度,队列满的话直接报错;为什么不在_ISR那种函数中调用呢?因为没有意义

 若是在上图中的。。。_ISR函数中,FOR循环多次调度,会调度不成功,因为优先级永远中断的比较高,所以for循环就浪费了时间,不如等到循环结束后,一次性的读取对应的标志位来触发是否进行调度(不是立刻调度),【是设置了一个优先级比较低的中断B,等到当前的正式中断执行完毕后,再执行B中断,在其中执行真正的调度】

 

没有ISR后缀的函数,写队列后会唤醒等待队列的任务A,若A的优先级更高的话,会发起调度(先运行A?); 队列满的话可以即可返回和进行阻塞(直接调度)

 

资源管理

解决的问题:多个任务使用同一通道的时候,同一时间互斥访问

 禁止任务调度,暂停任务调度器,使用一个函数即可

恢复函数后,会先检查有没有更高优先级的任务,有的话就先调度执行它

屏蔽中断(优先级比较低的那一’段位‘所有的中断,数值越低,优先级越高)

 对于具体的芯片,优先级可能没有256那么多,这数值到时会以线性映射

 在中断中屏蔽中断会记录当前时刻中断的状态,屏蔽解除后,回复其之前的状态