(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调试,观摩任务堆栈实际使用情况。
原文地址:https://www.cnblogs.com/hebaichuanyeah/p/3233465.html