找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8631|回复: 0
打印 上一主题 下一主题
收起左侧

ucosii中的systick和OSTimeDly

[复制链接]
跳转到指定楼层
楼主
ID:51024 发表于 2014-8-10 12:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    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中断服务程序中的两个函数OSTimeTickOSIntExit,每次进入systick中断都会在函数OSTimeTick中对OSTCBDly(OSTCBDly为任务调用OSTimeDly(x)函数中的x)进行减1操作,当这个值减到0的时候,uC/OS-ii会将该任务由等待状态PUSH到就绪状态(注意这里不是任务切换),OSIntExit函数会获得就绪表中优先级较高的任务的prio值,并且判断具有这个prio值的任务是不是当初那个被中断了的任务,如果不是则需要获得这个新任务的TCB指针并且执行中断级的任务切换使其处于运行状态,如果是当初那个给中断了的任务,则需要继续执行这个任务,不会进行任务切换。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表