【4】从0到1教你写uC/OS-III————>任务定义与创建

  1. RTOS中任务的表现形式:
    1. 功能独立
    2. 无限循环
    3. 例程:
      void Task(void *parg)
      {
          for(;;)
          {
              //add user code
          }
      }
  2. 创建任务的关键参数:
    1. 定义任务堆栈
    2. 任务控制块OS_TCB
    3. 创建任务
  3. 定义任务堆栈:
    1. 多任务系统中,每个任务相互独立,互不干扰;
    2. 因此要给每个任务分配独立的栈空间,存放于RAM中;
    3. 栈的大小由设计人员决定,最低不小于128;最大取决于RAM空间; 
    4. 例程,定义两个任务堆栈大小:
      /*
      ************************************************************************************************************************
      *                                                  TCB & STACK & 任务声明
      ************************************************************************************************************************
      */
      #define TASK1_STK_SIZE      20      //任务栈大小
      #define TASK2_STK_SIZE      20
      
      static  CPU_STK     Task1Stk[TASK1_STK_SIZE];       //栈存储在数组里,地址自增/减
      static  CPU_STK     Task2Stk[TASK2_STK_SIZE];
  4. 任务控制块OS_TCB
    1. 本质上是个任务结构体
    2. 暂时只包含:堆栈指针、堆栈大小
    3. 例程:
      /*
      ************************************************************************************************************************
      *                                              OS_TCB 任务控制块
      ************************************************************************************************************************
      */    
      struct os_tcb
      {
          CPU_STK         *StkPtr;
          CPU_STK_SIZE    StkSize;
      };
      
      typedef struct  os_tcb      OS_TCB;
  5. 实现任务创建函数
    
    /*********************************************************
     * 函数名:
                 void OSTaskCreate ( OS_TCB          *p_tcb,             //任务控制块指针
                                    OS_TASK_PTR     p_task,               //任务函数名
                                    void            *parg,              //形参,用于传递参数
                                    CPU_STK         *p_stk_base,        //指向任务堆栈的起始地址
                                    CPU_STK_SIZE    stk_size,           //任务堆栈的大小
                                    OS_ERR          *p_err              //错误码
                                    );
     * 描述  :创建任务
     * 输入  :无
     * 输出  :无
     * 返回  :无 
     * 调用  :内部调用 
     **********************************************************/
    void OSTaskCreate ( OS_TCB          *p_tcb,             //任务控制块指针
                        OS_TASK_PTR     p_task,             //任务函数名
                        void            *p_arg,             //形参,用于传递参数
                        CPU_STK         *p_stk_base,        //指向任务堆栈的起始地址
                        CPU_STK_SIZE    stk_size,           //任务堆栈的大小
                        OS_ERR          *p_err              //错误码
                        )
    {
        CPU_STK     *p_sp;
        
        p_sp = OSTashkStkInit(  p_task,     //任务堆栈初始化
                                p_arg,
                                p_stk_base,
                                stk_size
                            );
        
        p_tcb ->StkPtr = p_sp;      //将剩余栈的栈顶指针p_sp保存到任务控制块TCB的第一个成员StkPtr中;
        p_tcb ->StkSize = stk_size; //任务堆栈大小保存到任务控制块TCB成员的StkSize中;
        
        *p_err = OS_ERR_NONE;       //函数执行到此表示无错误,返回OS_ERR_NONE;
    }
    
  6. 总结:

    1. 任务的形式:无限循环且无返回值 

    2. 用任务块进行管理

    3. 创建任务时,必须进行堆栈初始化;

发布了24 篇原创文章 · 获赞 1 · 访问量 1508

猜你喜欢

转载自blog.csdn.net/Linux_ARM9/article/details/105060079