一、ucos中断管理:
(1)、在ucos中当中断在运行时,如果有更高优先级的任务就绪,要等到中断结束后再运行该任务。
我们在编写 UCOSIII 的中断服务程序的时候需要使用到两个函数 OSIntEnter()和OSIntExit()。
代码上就是中断服务函数前加个Enter结尾加个Exit
(2)、UCOSIII 对从中断发布消息或者信号的处理有两种模式:直接发布和延迟发
布两种方式。我们可以通过宏 OS_CFG_ISR_POST_DEFERRED_EN 来选择使用直接发布还是
延迟发布。宏为0是直接发布。
((1))、直接发布:通过关中断的方式对临界代码段进行保护。但是这样因为时钟节拍的中断也被关了导致整个系统的会有延时。
((2))、延迟发布:通过调度器上锁的方式来对临界代码进行保护
在延迟发布模式下,UCOSIII 在访问中断队列时,仍然需要关闭中断,但这个时间是非常
短的。
(3)临界区:有一些代码我们需要保证其完成运行,不能被打断,这些不能被打断的代码就是临界段代码,也叫临界区。我们在进入临界段代码的时候使用宏 OS_CRITICAL_ENTER(),退出临界区
的时候使用宏 OS_CRITICAL_EXIT()或者 OS_CRITICAL_EXIT_NO_SCHED()。
把以上的函数加在代码段的开头和结尾。
二、软件定时器:定时器其实就是一个递减计数器,当计数器递减到 0 的时候就会触发一个动作,这个动作就是回调函数,当定时器计时完成时就会自动的调用这个回调函数。因此我们可以使用这个回
调函数来完成一些设计。
定时器的分辨率由我们定义的系统节拍频率 OS_CFG_TICK_RATE_HZ 决定,比如我们
定义为 200,系统时钟周期就是 5ms(1/200),定时器的最小分辨率肯定就是 5ms。
注:但是定时器的实际分 辨 率 是 通 过 宏 OS_CFG_TMR_TASK_RATE_HZ 定 义 的 , 这 个 值 绝 对 不 能 大 于OS_CFG_TICK_RATE_HZ。
(1)、单次定时器:使用 OSTmrCreate()函数创建定时器时把参数 opt 设置为 OS_OPT_TMR_ONE_SHOT,就是创建的单次定时器。创建一个单次定时器以后,我们一旦调用 OSTmrStart()函数定时器就会从创建时定义的 dly 开始倒计数,直到减为 0 调用回调函数。
即:每次start都只会定时一次,可以在没有计数完前,再次start
(2)、周期定时器:分有延时和无延时。区别就是第一次运行是否会有周期,因为在定时器第一次的周期与第二次周期运行的不同
三、信号量:这个比较重要
(1)、信号量:信号量像是一种上锁机制,代码必须获得对应的钥匙才能继续执行,一旦获得了钥匙,也就意味着该任务具有进入被锁部分代码的权限。
信号量分二进制信号量和计数型信号量,二进制信号量只能取0/1,计数型可以取很多,换句话说,若有多个任务请求同一个信号量,二进制就只能同意一个,计数型可以同意多个。
注:请求完信号量一定要释放。
(2)、互斥信号量:当优先级一,二的任务没有请求信号量,三请求到了,然后三运行一会,一开始运行,到一请求信号量,但信号量在三这里,怎么办,一就等着。然后这时二好了,二运行,二结束,三继续。没一会,二又运行了,三停。直到三释放信号量,一才可以继续。这就导致了一个优先级翻转。所以启用互斥信号量。
(3)、作用原理:三先请求信号量,然后一运行,当一需要信号量时,直接去运行三,即暂时将三的优先级拉到与一相同。
(4)、内嵌信号:每个任务都有自己的内嵌信号,可以节省代码量。向该任务发送信号量,请求本任务的信号量,释放。
(5)、实现信号同步:字面意思。比如当一个任务接收到信号后,向另一个任务发送信号,原本该信号是没有信号量的,这时请求就可以得到信号量了。该任务进行下一步动作。
注:只有任务可以申请信号量,中断不可以
UCOSIII学习总结(中)
最新推荐文章于 2022-11-18 15:58:08 发布