(uC/OS-II学习笔记)uC/OS-II 时间管理

OSTimeDly(INT16U ticks),函数可以延迟相应的时钟节拍数。可是我发现OSTimeDly(INT16U ticks)函数一旦在任务中调用,任务就跑死了。

由于木有OS基础,感觉每前进一步都很蛋疼。

……后来发现,在kinetis的移植文件里面有这样的一个函数。

void  OS_CPU_SysTickInit (INT32U  cnts)
{
    INT32U  prio;


    OS_CPU_CM3_NVIC_ST_RELOAD = cnts - 1u;

    /* Set SysTick handler prio.                              */
    prio  = OS_CPU_CM3_NVIC_SHPRI3;
    prio &= DEF_BIT_FIELD(24, 0);
    prio |= DEF_BIT_MASK(OS_CPU_CFG_SYSTICK_PRIO, 24);

    OS_CPU_CM3_NVIC_SHPRI3 = prio;

    /* Enable timer.                                          */
    OS_CPU_CM3_NVIC_ST_CTRL |= OS_CPU_CM3_NVIC_ST_CTRL_CLK_SRC |
                               OS_CPU_CM3_NVIC_ST_CTRL_ENABLE;
    /* Enable timer interrupt.                                */
    OS_CPU_CM3_NVIC_ST_CTRL |= OS_CPU_CM3_NVIC_ST_CTRL_INTEN;
}

这个函数是初始化时钟节拍的(目前理解)

故在任务中加入

OS_CPU_SysTickInit(100000000/OS_TICKS_PER_SEC);

OS_TICKS_PER_SEC是宏定义,即每秒进入中断次数。cnts即是我们想要得到的计数次数。

OSTimeDlyHMSM()按照时、分、秒延迟。

OSTimeDlyResume(INT8U prio)恢复被延迟的任务

OSTimeGet(void)获取系统时间(进入中断次数)

OTTimeSet(void)重设系统时间。

关于任务调度,这是一个蛋疼点。

貌似uc/os-II每次进入中断都会调度一次任务。同样时间延迟也会使uC/OS-II调度任务。

OSRdyGrp变量(8位置)相应位0/1意味着OSRdyTbl[n]数组有任务就绪。

就续表中存储相关任务的优先级。

所以可以利用以下代码设置相应优先级为就绪状态

OSRdyGrp |= OSMapTbl[prio>>3];                  //y行 相应位置1

OSRdyTbl[prio>>3] |= OSMapTbl[prio&0x07];   //OSRdyTbl[y]相应元素置1

其中,OSMapTbl[N] 元素值为(1<<n)

同样如果在就绪表中删除任务

OSRdyGrp &= ~OSMapTbl[prio&0x07]; 

找出优先级最高任务

y = OSUnMapTbl[OSRdyGrp];

x = OSUnMapTbl[OSRdyTbl[y]];

OSUnMapTbl[]为查询任务优先级表

原文地址:https://www.cnblogs.com/hebaichuanyeah/p/3239728.html