uC/OS-II在kinetis上的移植代码,可以在官网上下到。复制到kinetis的工程中即可。
OS_STK *FirstTask_Add;
void main()
{OSInit(); //初始化uC/OS
FirstTask_Add = (OS_STK *)malloc(sizeof(OS_STK));OSTaskCreate(FirstTask_LED,(void *)0,FirstTask_Add,4); //创建任务
OSStart(); //启动多任务管理
}
OS_STK为任务堆栈类型 占四个字节的空间
uC/OS-II每个任务都有唯一的优先级。可以建立0~63优先级的任务。通常保留4个最高优先级以及4个最低优先级。系统初始化时会自动产生两个任务:一个是空闲任务,它的优先级最低,该任务仅给一个整形变量做累加运算;另一个是统计任务,它的优先级为次低,该任务负责统计当前cpu的利用率。
OSTaskCreate 函数源代码
INT8U OSTaskCreate (void (*task)(void *p_arg),void *p_arg,OS_STK *ptos,INT8U prio)
{OS_STK *psp;INT8U err;
#if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */OS_CPU_SR cpu_sr = 0u;
#endif#ifdef OS_SAFETY_CRITICAL_IEC61508if (OSSafetyCriticalStartFlag == OS_TRUE){OS_SAFETY_CRITICAL_EXCEPTION();return (OS_ERR_ILLEGAL_CREATE_RUN_TIME);}
#endif#if OS_ARG_CHK_EN > 0uif (prio > OS_LOWEST_PRIO) /* Make sure priority is within allowable range */{return (OS_ERR_PRIO_INVALID);}
#endifOS_ENTER_CRITICAL();if (OSIntNesting > 0u) /* Make sure we don't create the task from within an ISR */{OS_EXIT_CRITICAL();return (OS_ERR_TASK_CREATE_ISR);}if (OSTCBPrioTbl[prio] == (OS_TCB *)0) /* Make sure task doesn't already exist at this priority */{OSTCBPrioTbl[prio] = OS_TCB_RESERVED;/* Reserve the priority to prevent others from doing ... *//* ... the same thing until task is created. */OS_EXIT_CRITICAL();psp = OSTaskStkInit(task, p_arg, ptos, 0u); /* Initialize the task's stack */err = OS_TCBInit(prio, psp, (OS_STK *)0, 0u, 0u, (void *)0, 0u);if (err == OS_ERR_NONE){if (OSRunning == OS_TRUE) /* Find highest priority task if multitasking has started */{OS_Sched();}}else{OS_ENTER_CRITICAL();OSTCBPrioTbl[prio] = (OS_TCB *)0;/* Make this priority available to others */OS_EXIT_CRITICAL();}return (err);}OS_EXIT_CRITICAL();return (OS_ERR_PRIO_EXIST);
}
任务函数
void FirstTask_LED(void *pdata)
{U8 aa = 1;pdata = pdata; init_LED();while(1){Delay(300);LED2(aa);aa = !aa;}
}
FirstTask_LED任务,使LED灯闪烁(延迟300毫秒)。
亦可以使用OSTaskCreateExt建立任务。
OSTaskCreateExt(Task_LED1,(void *)0,&Task_Stk[STARTUP_TASK_STK_SIZE-1],5,5,&Task_Stk[0],128,(void *)0,OS_TASK_OPT_STK_CHK || OS_TASK_OPT_STK_CLR);