zoukankan      html  css  js  c++  java
  • (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调试,观摩任务堆栈实际使用情况。
  • 相关阅读:
    你试过不用if撸代码吗?
    Chrome开发者工具Debug入门
    我为什么推荐Prettier来统一代码风格
    使用JSDoc自动生成代码文档
    Async/Await是这样简化JavaScript代码的
    C#泛型约束 (转载)
    DateTime , DateTime2 ,DateTimeOffset 之间的小区别 (转载)
    允许跨域资源共享(CORS)携带 Cookie (转载)
    C#中如何利用操作符重载和转换操作符 (转载)
    EF Core 2.1 Raw SQL Queries (转自MSDN)
  • 原文地址:https://www.cnblogs.com/hebaichuanyeah/p/3233465.html
Copyright © 2011-2022 走看看