ucosii中的systick和OSTimeDly
时间:04-08 13:45 阅读:2496次
*温馨提示:点击图片可以放大观看高清大图
简介:OSTimeDly(x)函数和SYSTick系统时钟,这两个为整个系统的关键点,同时也是我开始学习uC/OS-ii到现在碰到的最难理解的问题,可能是一直都处于裸机奔跑状态,对OS还是感觉到很陌生,一时间很难去接收这样一个非常伟大的东西。
首先是systick的介绍,systick为系统时钟,作为uC/OS-ii的嘀嗒时钟,也许有人会问什么是嘀嗒时钟?就是这个时钟不会停止,一直在运行,它好像是uC/OS-ii的心脏一样,保证它不会死掉,可能又有人问,一般的单片机不是有时钟嘛,代码一样在运行,为什么要要这么个玩意---嘀嗒时钟!我开始学习uC/OS-ii的时候也是这种感觉,当时没有人去讲解,自己不停的在那里想,看书啥的,后来通过写一个2个任务的代码就明白了这个嘀嗒时钟的重要性,如果系统中移植了OS,那么就得把OS和用户应用程序代码(也就是任务)作为2个部分看待,所以我们可以看作系统需要两个时钟,我是这么理解的,具体是怎么样的,在以后的博文中会细细说来!
假如我们将systick设置为10ms(根据处理器的clock而定),也就是每10ms的时候会进入systick中断,systick这个功能可由一般的定时器取代,在这个中断服务程序中会执行OSTimeTick和OSIntExit两个函数(可能结合源代码看)。
在介绍这两个函数之前需要先对OSTimeDly(x)进行相应的说明,OSTimeDly(x)为系统延时,假如在某个任务中对其进行调用,表示这个任务已经由运行状态转换到等待状态了(任务比较常规的状态为等待、就绪和运行这3个,另外2个:休眠和中断相对那3个状态而言显得就不是这么突出了),并且会做一次任务调度(什么是调度?不用纠结很多,就是把处于就绪态的任务通过某一算法转移到运行态),使就绪态中(所有的任务通过OSTaskCreate()函数使其处于就绪状态)最高优先级的任务处于运行状态,同时会将该任务TCB中的OSTCBDly参数设置为x(注意是全局变量),系统任务的状态转移如下图1所示,这个转移图非常重要,如果还没有意识到它的重要性,那么表示看书看的还不够,还得继续:
图1:uC/OS-ii状态转移图
前面提到了systick中断服务程序中的两个函数OSTimeTick和OSIntExit,每次进入systick中断都会在函数OSTimeTick中对OSTCBDly(OSTCBDly为任务调用OSTimeDly(x)函数中的x)进行减1操作,当这个值减到0的时候,uC/OS-ii会将该任务由等待状态PUSH到就绪状态(注意这里不是任务切换),OSIntExit函数会获得就绪表中优先级较高的任务的prio值,并且判断具有这个prio值的任务是不是当初那个被中断了的任务,如果不是则需要获得这个新任务的TCB指针并且执行中断级的任务切换使其处于运行状态,如果是当初那个给中断了的任务,则需要继续执行这个任务,不会进行任务切换。