(uC/OS-II学习笔记)uC/OS-II在kinetis K60上移植与任务建立
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_IEC61508 if (OSSafetyCriticalStartFlag == OS_TRUE) { OS_SAFETY_CRITICAL_EXCEPTION(); return (OS_ERR_ILLEGAL_CREATE_RUN_TIME); } #endif #if OS_ARG_CHK_EN > 0u if (prio > OS_LOWEST_PRIO) /* Make sure priority is within allowable range */ { return (OS_ERR_PRIO_INVALID); } #endif OS_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);
OSTaskCreateExt 建立任务,需要栈底地址、堆栈容量(用于堆栈检验)、ID及OPT(允许检验、是否清零、允许浮点运算)参数。
OSTaskStkChk(INT8U prio,OS_STK_DATA *pdata)函数可以检验堆栈的实际使用空间。
OS_STK_DATA为结构体变量。存储任务堆栈的使用空间。
通过Jlink调试,观摩任务堆栈实际使用情况。