OSTaskCreate(TaskLed1,(void *)0,&task1stack[stack1_size-1], TASK_LED1_PRIO );
OSTaskCreate(TaskLed2,(void *)0,&task2stack[stack2_size-1], TASK_LED2_PRIO );
OSStart();
while(1)
{
OSTaskSuspend(OS_PRIO_SELF);
}
}
而源代码是下面的切不崩,?????
static OS_STK TaskStartStk[TASK_START_STK_SIZE];
static OS_STK TaskLed1Stk[TASK_LED1_STK_SIZE];
static OS_STK TaskLed2Stk[TASK_LED2_STK_SIZE];
static void TaskCreate(void *p_arg)
{
int i,j;
(void)p_arg;
for(i=0;i<900;i++)
{
for(j=0;j<9000;j++)
{
;
}
}
BSP_Init();
#if (OS_TASK_STAT_EN > 0)
OSStatInit();
#endif
OSTaskCreate(TaskLed1,(void*)0,&TaskLed1Stk[TASK_LED1_STK_SIZE-1],TASK_LED1_PRIO);
OSTaskCreate(TaskLed2,(void*)0,&TaskLed2Stk[TASK_LED2_STK_SIZE-1],TASK_LED2_PRIO);
while(1)
{
OSTaskSuspend(OS_PRIO_SELF);
}
}
以下是OSStatInit()的源码。
#if OS_TASK_STAT_EN > 0 //允许生产OSStatInit()函数
484 void OSStatInit (void) //统计任务初始化
485 {
486 #if OS_CRITICAL_METHOD == 3 //中断函数被设定为模式3
487 OS_CPU_SR cpu_sr;
488 #endif
489
490
491 OSTimeDly(2); //调用延迟函数OSTimeDly()将自身延时2个时钟节拍以停止自身的运行
492 //这是为了使OSStatInit()与时钟节拍同步
493 OS_ENTER_CRITICAL(); //关闭中断
494 OSIdleCtr = 0L; //执行OSStartInit()时,空闲计数器OSIdleCtr被清零
495 OS_EXIT_CRITICAL(); //打开中断
496 OSTimeDly(OS_TICKS_PER_SEC); //将自身延时整整一秒
497 //(因为没有其它进入就绪态的任务,OSTaskIdle()又获得了CPU的控制权)
498 OS_ENTER_CRITICAL(); //关闭中断
499 OSIdleCtrMax = OSIdleCtr; //空闲计数器将1秒钟内计数的值存入空闲计数器最大值OSIdleCtrMax中
500 OSStatRdy = TRUE; //将统计任务就绪标志OSStatRdy设为"真",以此来允许两个时钟节拍
501 //以后OSTaskStat()开始计算CPU的利用率
502 OS_EXIT_CRITICAL(); //打开中断
503 }
504 #endif
问题解答:见黄色字体,但是原因的根源迫于能力暂且搁置。
在OS_TCB中定义了
INT16U OSTCBDly; //定义允许任务等待时的最多节拍数
414 INT8U OSTCBStat; //定义任务的状态字
415 INT8U OSTCBPrio; //定义任务的优先级
416
417 INT8U OSTCBX; //定义指向任务优先级的低3位,即=priority&0x07
418 INT8U OSTCBY; //定义指向任务优先级的高3位,即=priority>>3
419 INT8U OSTCBBitX; //定义低3位就绪表对应值(0~7),即=OSMapTbl[priority&0x07]
420 INT8U OSTCBBitY; //定义高3位就绪表对应值(0~7),即=OSMapTbl[priority>>3]
421
422 #
*********************************************************************************************************
* TASK STATUS (Bit definition for OSTCBStat)
*********************************************************************************************************
*/
#define OS_STAT_RDY 0x00u /* Ready to run */
#define OS_STAT_SEM 0x01u /* Pending on semaphore */
#define OS_STAT_MBOX 0x02u /* Pending on mailbox */
#define OS_STAT_Q 0x04u /* Pending on queue */
#define OS_STAT_SUSPEND 0x08u /* Task is suspended */
#define OS_STAT_MUTEX 0x10u /* Pending on mutual exclusion semaphore */
#define OS_STAT_FLAG 0x20u /* Pending on event flag group */
#define OS_STAT_MULTI 0x80u /* Pending on multiple events */
#define OS_STAT_PEND_ANY (OS_STAT_SEM | OS_STAT_MBOX | OS_STAT_Q | OS_STAT_MUTEX | OS_STAT_FLAG)
OSStatInit()与OSTCBSTat中的STat尽然一个代表统计,一个代表任务状态。