ucos II 内核学习之五:时钟节拍

 ucos II 内核学习之二 :时钟节拍

ucos II 里,时钟节拍就好比是人的心脏一样重要,。它对于CPU能顺利在各任务间切换有着至关重要的作用。

Ucos II 需要用户提供时钟源,在muc21项目了,我使用了定时器0作为时钟源。使用时钟源有一个特别需要注意的地方:用户必须在多任务系统启动以后再开启时钟节拍器也就是在调用OSStart()之后。

Ucos II中的时钟节拍服务是通过在定时器中断服务子程序中调用OSTimeTick()实现的。

OSTimeTick()代码如下:

void OSTimeTick (void)

{

    OS_TCB *ptcb;

 

    OSTimeTickHook();                                                         (1)

    ptcb = OSTCBList;                                                         (2)

    while (ptcb->OSTCBPrio != OS_IDLE_PRIO) {                              (3)

        OS_ENTER_CRITICAL();

        if (ptcb->OSTCBDly != 0) {

            if (--ptcb->OSTCBDly == 0) {

                if (!(ptcb->OSTCBStat & OS_STAT_SUSPEND)) {               (4)

                    OSRdyGrp               |= ptcb->OSTCBBitY;               (5)

                    OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;

                } else {

                    ptcb->OSTCBDly = 1;

                }

            }

        }

        Ptcb = ptcb->OSTCBNext;

        OS_EXIT_CRITICAL();

    }

    OS_ENTER_CRITICAL();                                                      (6)

    OSTime++;                                                                  (7)

    OS_EXIT_CRITICAL();

}

我们知道,CPU总是执行就绪表中优先级最高的任务,任务有没有在就绪表中就得依靠OSTimeTick()了。OSTimeTick()很大的工作是给每个用户任务控制块OS_TCB中的时间延时项OSTCBDly减1,当某任务的任务控制块中的时间延时项OSTCBDly减到了零,这个任务就进入了就绪态。

 

下面是对以上代码的分析。

OSTimtick()先调用可由用户定义的时钟节拍外连函数OSTimeTickHook(),这个外连函数可以将时钟节拍函数OSTimetick()予以扩展[L3.2(1)]。Ucos II的作者决定首先调用OSTimTickHook()是打算在时钟节拍中断服务一开始就给用户一个可以做点儿什么的机会,因为用户可能会有一些时间要求苛刻的工作要做。OSTimtick()中量大的工作是给每个用户任务控制块OS_TCB中的时间延时项OSTCBDly减1(如果该项不为零的话)。OSTimTick()从OSTCBList开始,沿着OS_TCB链表做,一直做到空闲任务[L3.21(3)]。当某任务的任务控制块中的时间延时项OSTCBDly减到了零,这个任务就进入了就绪态[L3.21(5)]。而确切被任务挂起的函数OSTaskSuspend()挂起的任务则不会进入就绪态[L3.21(4)]。OSTimTick()的执行时间直接与应用程序中建立了多少个任务成正比。OSTimeTick()还通过调用OSTime[L3.21(7)]累加从开机以来的时间,用的是一个无符号32位变量。注意,在给OSTime加1之前使用了关中断,因为多数微处理器给32位数加1的操作都得使用多条指令。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于UCOSIII操作系统的时钟节拍实验方法步骤: 1. 准备开发板和编程工具:需要一块支持UCOSIII操作系统的开发板,以及支持C语言开发的编程工具,如Keil MDK或IAR Embedded Workbench。 2. 创建新工程:在编程工具中创建一个新的工程,配置好开发板的硬件参数和编译选项。 3. 导入UCOSIII操作系统源代码:将UCOSIII操作系统的源代码导入到工程中,并根据开发板的硬件参数进行配置。可以参考UCOSIII操作系统的官方文档进行配置。 4. 创建任务:在工程中创建两个简单的任务,分别为`Task1`和`Task2`。可以使用C语言编写任务函数,并在任务函数中使用UCOSIII提供的时钟节拍来控制任务的执行。 5. 初始化UCOSIII操作系统:在主函数中调用`OSInit()`函数来初始化UCOSIII操作系统。 6. 创建任务:在主函数中调用`OSTaskCreate()`函数来创建任务,并指定任务优先级、堆栈大小等参数。 7. 启动UCOSIII操作系统:在主函数中调用`OSStart()`函数来启动UCOSIII操作系统,开始运行任务。 8. 编译和下载程序:使用编程工具编译程序,并将程序下载到开发板中。 9. 运行实验:将开发板上电,并观察串口输出结果。可以看到`Task1`和`Task2`交替执行,并且它们的执行时间是通过UCOSIII提供的时钟节拍来控制的。 总的来说,UCOSIII操作系统时钟节拍实验需要实现任务的创建、时钟节拍的控制以及任务的执行等功能,可以通过以上步骤来实现该实验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值