6 定时器 &中断管理&资源管理
生成函数
周期,多久触发一次定时器(从定时器启动开始计算) 触发什么呢? 回调函数被调用,被谁调用呢
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那么多,这数值到时会以线性映射
在中断中屏蔽中断会记录当前时刻中断的状态,屏蔽解除后,回复其之前的状态