zoukankan      html  css  js  c++  java
  • UCOSIII任务创建

      UCOSIII任务创建:

      首先要确保UCOSIII移植成功;

      一般以下几个步骤就行了:

      第一步:写好任务所需的   优先级、堆栈、控制块等;

        然后顺便声明下任务函数;

      第二步:开始创建函数

      源码:

      1 #include "led.h"
      2 #include "delay.h"
      3 #include "sys.h"
      4 #include "usart.h"
      5 #include "includes.h"
      6 
      7 //关于优先级的说明:
      8 //系统保留有5个任务,这五个任务占了5个优先级,用户不得使用这5个优先级
      9 //优先级0:中断服务管理任务:OS_IntQTask();
     10 //优先级1:时钟节拍任务:OS_TickTask();
     11 //优先级2:定时任务:OS_TmrTask();
     12 //优先级OS_CFG_PRIO_MAX-2(倒数第二个优先级):统计任务:OS_StatTask();
     13 //优先级OS_CFG_PRIO_MAX-1(倒数第一个优先级):空闲任务:OS_IdleTask();
     14 
     15 #define START_TASK_PRIO         3                   //任务优先级;
     16 #define START_STK_SIZE          128                 //任务堆栈大小,实际大小是:128*4字节
     17 CPU_STK START_TASK_STK[START_STK_SIZE];             //任务堆栈;
     18 OS_TCB StartTaskTCB;                                //任务控制块;
     19 //声明任务函数(一般将一个任务写成一个函数):
     20 void start_task(void *p_arg);                       //注:“p_arg”这个参数基本用不上,但必须得写上
     21 
     22 #define LED0_TASK_PRIO          4                   //任务优先级;
     23 #define LED0_STK_SIZE           128                 //任务堆栈大小,实际大小是:128*4字节
     24 CPU_STK LED0_TASK_STK[LED0_STK_SIZE];               //任务堆栈;
     25 OS_TCB Led0TaskTCB;                                 //任务控制块;
     26 //声明任务函数(一般将一个任务写成一个函数):
     27 void Led0_task(void *p_arg);                        //注:“p_arg”这个参数基本用不上,但必须得写上
     28 
     29 #define LED1_TASK_PRIO          5                   //任务优先级;
     30 #define LED1_STK_SIZE           128                 //任务堆栈大小,实际大小是:128*4字节
     31 CPU_STK LED1_TASK_STK[LED1_STK_SIZE];               //任务堆栈;
     32 OS_TCB Led1TaskTCB;                                 //任务控制块;
     33 //声明任务函数(一般将一个任务写成一个函数):
     34 void Led1_task(void *p_arg);                        //注:“p_arg”这个参数基本用不上,但必须得写上
     35 
     36 #define Printf_TASK_PRIO         6                  //任务优先级;
     37 #define Printf_STK_SIZE          128                //任务堆栈大小,实际大小是:128*4字节
     38 CPU_STK Printf_TASK_STK[Printf_STK_SIZE];           //任务堆栈;
     39 OS_TCB PrintfTaskTCB;                               //任务控制块;
     40 //声明任务函数(一般将一个任务写成一个函数):
     41 void Printf_task(void *p_arg);                      //注:“p_arg”这个参数基本用不上,但必须得写上
     42 
     43 int main()
     44 {
     45     OS_ERR err;                         //系统使用,任务错误标示保存在此变量中
     46     CPU_SR_ALLOC();                     //临界区函数使用;
     47     
     48     //外设初始化:
     49     delay_init();
     50     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);     //中断分组
     51     uart_init(115200);
     52     LED_Init();
     53     
     54     //UCOS初始化:
     55     OSInit(&err);
     56     OS_CRITICAL_ENTER();            //进入临界区;
     57     //任务创建函数:
     58     OSTaskCreate(
     59                     (OS_TCB *)    &StartTaskTCB,        //任务控制块
     60                     (CPU_CHAR*)   "start_task",         //任务名称
     61                     (OS_TASK_PTR) start_task,           //任务函数
     62                     (void *)       0,                   //此参数暂时不用
     63                     (OS_PRIO)      START_TASK_PRIO,     //任务优先级
     64                     (CPU_STK *)    &START_TASK_STK[0],  //任务堆栈基地址
     65                     (CPU_STK_SIZE) START_STK_SIZE/10,   //堆栈栈深
     66                     (CPU_STK_SIZE) START_STK_SIZE,      //堆栈大小
     67                     (OS_MSG_QTY)   0,
     68                     (OS_TICK)      0,
     69                     (void *)       0,
     70                     (OS_OPT)       OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,//选项,选择任务创建后进行的操作
     71                     (OS_ERR *)     &err                 //错误标示
     72                 );
     73     OS_CRITICAL_EXIT();                                 //退出临界区;
     74                     
     75     OSStart(&err);                                      //系统开始运行
     76 }
     77 
     78 //任务函数;注:一般将其它任务的创建放到一个专门创建任务的函数中;
     79 void start_task(void *p_arg)
     80 {
     81     OS_ERR err;
     82     CPU_SR_ALLOC();
     83     p_arg = p_arg;      //故意使用一下这个参数,否则编译器会警告说此参数没有使用
     84 
     85     CPU_Init();
     86 #if OS_CFG_STAT_TASK_EN > 0u
     87    OSStatTaskCPUUsageInit(&err);      //统计任务
     88 #endif
     89     
     90 #ifdef CPU_CFG_INT_DIS_MEAS_EN        //如果使能了测量中断关闭时间
     91     CPU_IntDisMeasMaxCurReset();
     92 #endif
     93     
     94 #if    OS_CFG_SCHED_ROUND_ROBIN_EN     //当使用时间片轮转的时候
     95     
     96     //使能时间片轮转调度功能,时间片长度为:1*5=5ms
     97     OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);
     98 #endif
     99     
    100     OS_CRITICAL_ENTER();            //进入临界区
    101     //创建LED0任务:
    102     OSTaskCreate(   (OS_TCB *)      &Led0TaskTCB,
    103                     (CPU_CHAR *)    "led0 task",
    104                     (OS_TASK_PTR)   Led0_task,
    105                     (void *)        0,
    106                     (OS_PRIO)       LED0_TASK_PRIO,
    107                     (CPU_STK *)     &LED0_TASK_STK[0],
    108                     (CPU_STK_SIZE)  LED0_STK_SIZE/10,
    109                     (CPU_STK_SIZE)  LED0_STK_SIZE,
    110                     (OS_MSG_QTY)    0,
    111                     (OS_TICK)       0,
    112                     (void *)        0,
    113                     (OS_OPT)        OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
    114                     (OS_ERR *)      &err
    115                 );
    116                  
    117     //创建LED1任务:
    118     OSTaskCreate(   (OS_TCB *)      &Led1TaskTCB,
    119                     (CPU_CHAR *)    "led1 task",
    120                     (OS_TASK_PTR)   Led1_task,
    121                     (void *)        0,
    122                     (OS_PRIO)       LED1_TASK_PRIO,
    123                     (CPU_STK *)     &LED1_TASK_STK[0],
    124                     (CPU_STK_SIZE)  LED1_STK_SIZE/10,
    125                     (CPU_STK_SIZE)  LED1_STK_SIZE,
    126                     (OS_MSG_QTY)    0,
    127                     (OS_TICK)       0,
    128                     (void *)        0,
    129                     (OS_OPT)        OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
    130                     (OS_ERR *)      &err
    131                 );
    132              
    133     //创建Printf任务:
    134     OSTaskCreate(   (OS_TCB *)         &PrintfTaskTCB,
    135                     (CPU_CHAR *)       "Printf test task",
    136                     (OS_TASK_PTR)      Printf_task,
    137                     (void *)           0,
    138                     (OS_PRIO)          Printf_TASK_PRIO,
    139                     (CPU_STK *)        &Printf_TASK_STK[0],
    140                     (CPU_STK_SIZE)     Printf_STK_SIZE/10,
    141                     (CPU_STK_SIZE)     Printf_STK_SIZE,
    142                     (OS_MSG_QTY)       0,
    143                     (OS_TICK)          0,
    144                     (void *)           0,
    145                     (OS_OPT)           OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
    146                     (OS_ERR*)          &err
    147                 );
    148     
    149     //OS_TaskSuspend((OS_TCB*)&StartTaskTCB,&err);        //挂起"start_task"任务
    150     OS_CRITICAL_EXIT();    //退出临界区
    151     OSTaskDel((OS_TCB *)0,&err);//删除任务自身;(第一个参数填写0,就是删除任务自身,要是填写别的任务的控制块,那就是删除别的任务)
    152 }
    153 
    154 //*******************************************************************************
    155 
    156 //                                  具体3个任务
    157 
    158 //*******************************************************************************
    159 
    160 //"Led0_task"任务:
    161 void Led0_task(void *p_arg)
    162 {
    163     OS_ERR err;
    164     p_arg = p_arg;          //故意使用一下这个参数,否则编译器会警告说此参数没有使用
    165     while(1)
    166     {
    167         LED0=~LED0;
    168         OSTimeDlyHMSM(0,0,0,300,OS_OPT_TIME_HMSM_STRICT,&err);
    169     }
    170 }
    171 
    172 //"Led1_task"任务:
    173 void Led1_task(void *p_arg)
    174 {
    175     OS_ERR err;
    176     p_arg = p_arg;          //故意使用一下这个参数,否则编译器会警告说此参数没有使用
    177     while(1)
    178     {
    179         LED1=~LED1;
    180         OSTimeDlyHMSM(0,0,0,300,OS_OPT_TIME_HMSM_STRICT,&err);
    181     }
    182 }
    183 
    184 //"Printf_task"任务:
    185 void Printf_task(void *p_arg)
    186 {
    187     OS_ERR err;
    188     CPU_SR_ALLOC();
    189     p_arg = p_arg;          //故意使用一下这个参数,否则编译器会警告说此参数没有使用
    190     while(1)
    191     {
    192         OS_CRITICAL_ENTER();    //进入临界区
    193         printf("Hello World!
    ");
    194         OS_CRITICAL_EXIT();        //退出临界区
    195         delay_ms(300);
    196         OSTimeDlyHMSM(0,0,0,300,OS_OPT_TIME_HMSM_STRICT,&err);
    197     }
    198 }
  • 相关阅读:
    [转]基于S2SH框架的项目—antlr-2.7.2.jar包冲突问题
    输入法那没有小键盘的图标解决方法
    Chrome百度不显示中文字体
    转:数据库范式(1NF 2NF 3NF BCNF)
    转:海明纠错码
    奇阶魔方阵
    字符串的模式匹配
    红黑树
    排序算法总结
    关于面试总结9-接口测试面试题
  • 原文地址:https://www.cnblogs.com/data-base-of-ssy/p/6413752.html
Copyright © 2011-2022 走看看