(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[]为查询任务优先级表