UCOS III学习(五)

一、UCOS III中断管理

1、中断函数的一般形式

中断:应内部或外部异步事件的请求中止当前任务,而去处理异步事件所要求的任务的过程叫做中断。
UCOSIII中中断服务函数一般格式如下

void USART1_IRQHandler(void)
{
       OSIntEnter();			//中断进入函数
      //中断服务程序
      OSIntExit();				//中断退出函数
}  

中断进入函数的主要内容就是中断计数,对于绝大多数单片机都支持终端的嵌套,允许高优先级中断打断低优先级中断,这一关系同样适用于UCOS III ,在UCOS III中使用OSIntNestingCtr变量来保存中断嵌套层数,每进入一次中断就会进入一次中断进入函数就会对OSIntNestingCtr加1

void  OSIntEnter (void)
{
      if (OSRunning != OS_STATE_OS_RUNNING) {
	  return
      }
      if (OSIntNestingCtr >= (OS_NESTING_CTR)250u) {
            return; 
      }
     OSIntNestingCtr++;
}

与之对应的中断退出函数,会在每次退出中断前被调用,然后对OSIntNestingCtr进行减1操作。

2、中函数中的信号量与消息发布

中断函数中若出现了信号发布或者消息发布函数,UCOSIII可以选择采取两种处理方式:1直接发布2延迟发布,两种模式的选择则是通过宏OS_CFG_ISR_POST_DEFERRED_EN来选择,当宏OS_CFG_ISR_POST_DEFERRED_EN为0时,采取直接发布模式,反正宏OS_CFG_ISR_POST_DEFERRED_EN为1时,采取延迟发布模式。
两种模式的区别:当处于直接模式下,系统进入临界态是通过关闭中断的方式来进行临界段代码的保护,当系统处于 延迟模式下时,系统采取锁定任务调度器的方式进行临界段的代码保护。
要说明的是:无论哪一种模式下中断服务程序都需要执行完毕,才能进行任务的调度,此前因为中断发生而被打断的任务会进入就绪状态,等待中断指向完毕再进行一次任务调度。
1、直接发布
在这里插入图片描述
直接发布模式下,信号发布与消息发布都会直接被执行,待中断执行完毕后进行任务调度,若原来被打断的任务的优先级为最高优先级,则继续执行该任务,若有因为得到中断中发布的信号量或消息而进入就绪状态且该任务的优先级更高,则运行该任务。

2,延迟发布
在这里插入图片描述
延迟发布比直接发布稍显复杂,他不会在中断服务程序内直接执行发布消息或信号量的函数,而是将这些函数和相应的参数写入中断队列并使中断队列处理函数进入就绪状态,当中断服务程序运行结束,由于就绪状态下中断队列处理函数的优先级为0一定是最高的,因此会先执行中断处理函数,将会先锁定任务调度器,待所有的消息发布函数和信号量发布函数执行完毕,重新进行任务调度。若出现比被中断打断任务优先级更高的任务则执行新任务,若没有则继续执行原任务。

二、UCOSIII 时间管理

1、任务延迟

UCOSIII中的任务是一个无限循环并且还是一个抢占式内核,为了使高优先级的任务不至于独占CPU,可以给其他优先级较低任务获取CPU使用权的机会,UCOSIII中除空闲任务外的所有任务必须在合适的位置调用系统提供的延时函数,让当前的任务暂停运行一段时间并进行一个任务切换。延时函数有两种,OSTimeDly()和OSTimeDlyHMSM()。
OSTimeDly()函数有三种工作模式:相对模式、周期模式和绝对模式。
OSTimeDlyHMSM()函数仅在相对模式下工作。

void  OSTimeDly (OS_TICK   dly,					//延时时间片数
                 OS_OPT    opt,					//延迟选项
                 OS_ERR   *p_err)				//保存报错信息

opt选项
OS_OPT_TIME_DLY 相对模式
OS_OPT_TIME_TIMEOUT 与OS_OPT_TIME_DLY相同
OS_OPT_TIME_MATCH 绝对模式
OS_OPT_TIME_PERIODIC 周期模式

void  OSTimeDlyHMSM (CPU_INT16U   hours,				//以小时为单位
                     CPU_INT16U   minutes,				//以分钟为单位
                     CPU_INT16U   seconds,				//以秒为单位
                     CPU_INT32U   milli,				//以毫秒为单位
                     OS_OPT       opt,					//延迟选项
                     OS_ERR      *p_err)				//返回报错信息	

opt选项
包含OSTimeDly()函数的四个选项的基础上,新增两个选项,OS_OPT_TIME_HMSM_STRICT选项下小时计数范围0~99,分钟计数范围0到59,秒范围0到59,毫秒范围0到999.
OS_OPT_TIME_HMSM_NON_STRICT选项下,小时范围0到999,分钟范围0到9999,秒范围0到65535,毫秒范围0到4294967259.

2、取消延迟函数

延时任务任务可通过在其他任务中调用函数OSTimeDlyResume()取消延时而进入就绪状态,此函数最后会引发一次任务调度。

3、获取和设置系统时间:

UCOSIII定义了一个CPU_INT32U类型的全局变量OSTickCtr来记录系统时钟节拍数,在调用OSInit()时被初始化为0,以后每发生1个时钟节拍,OSTickCtr加1。
OSTimeSet()允许用户改变当前时钟节拍计数器的值,慎用!!!!!
OSTimeGet()用来获取动迁时钟节拍计数器的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值