zoukankan      html  css  js  c++  java
  • UCOSIII(一)常用函数积累

    UCOSIII任务初始宏定义

    #define TASK_PRIO        3       //任务优先级
    
    #define TASK_STK_SIZE    128     //任务堆栈大小    
    
    OS_TCB TASKTCB;                  //任务控制块
    
    CPU_STK TASK_STK[TASK_STK_SIZE]; //任务堆栈    
    
    void task(void *p_arg);          //任务函数

    创建开始任务函数

    OS_ERR err;    //创建返回任务错误的变量
    CPU_SR_ALLOC();//为临界区申请变量
    
    
    //在主函数开始这个任务
    
    OSInit(&err);          //初始化UCOSIII
    OS_CRITICAL_ENTER();   //进入临界区
    
        //创建开始任务
        OSTaskCreate((OS_TCB     * )&TASKTCB,       //任务控制块,用存储任务信息
                     (CPU_CHAR    *)"task",         //任务名字
                     (OS_TASK_PTR  )task,           //任务函数
                     (void       * )0,              //传递给任务函数的参数
                     (OS_PRIO      )TASK_PRIO,      //任务优先级
                     (CPU_STK   *  )&TASK_STK[0],   //任务堆栈基地址
                     (CPU_STK_SIZE )TASK_STK_SIZE/10, //任务堆栈深度限位
                     (CPU_STK_SIZE )TASK_STK_SIZE,  //任务堆栈大小
                     (OS_MSG_QTY   )0,              //任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息
                     (OS_TICK      )0,              //当使能时间片轮转时的时间片长度,为0时为默认长度,
                     (void       * )0,              //用户补充的存储区
                     (OS_OPT       )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR|OS_OPT_TASK_SAVE_FP, //任务选项,为了保险起见,所有任务都保存浮点寄存器的值
                     (OS_ERR     * )&err);          //存放该函数错误时的返回值
     OS_CRITICAL_EXIT();    //退出临界区     
     OSStart(&err);      //开启UCOSIII

     在开始任务中定义其他任务

    void start_task(void *p_arg)
    {
        OS_ERR err;
        CPU_SR_ALLOC();
        p_arg = p_arg;
    
        CPU_Init();
    #if OS_CFG_STAT_TASK_EN > 0u OSStatTaskCPUUsageInit(&err); //统计任务 #endif #ifdef CPU_CFG_INT_DIS_MEAS_EN //如果使能了测量中断关闭时间 CPU_IntDisMeasMaxCurReset(); #endif #if OS_CFG_SCHED_ROUND_ROBIN_EN //当使用时间片轮转的时候 //使能时间片轮转调度功能,设置默认的时间片长度 OSSchedRoundRobinCfg(DEF_ENABLED,1,&err); #endif OS_CRITICAL_ENTER(); //进入临界区 //创建TASK1任务 //此处省略 //创建TASK2任务 OS_CRITICAL_EXIT(); //退出临界区 OSTaskDel((OS_TCB*)0,&err); //删除start_task任务自身 }

    其他任务函数

    void task1_task(void *p_arg)
    {
        
        OS_ERR err;
        CPU_SR_ALLOC();
        p_arg = p_arg;
        
        
        OS_CRITICAL_ENTER();
        
        OS_CRITICAL_EXIT();
    while(1) { OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s } }

     main函数

      OS_ERR  err;
      CPU_SR_ALLOC();
        
      Stm32_Clock_Init(360,25,2,8);   //设置时钟,180Mhz   
      HAL_Init();                     //初始化HAL库
      delay_init(180);                //初始化延时函数
      uart_init(115200);              //初始化USART
      LED_Init();                     //初始化LED 
      OSInit(&err);
        
      OS_CRITICAL_ENTER();//进入代码临界保护区
        
      OSTaskCreate (&START_TASK_TCB, (CPU_CHAR *)"start_task",start_task,0,START_TASK_PRIO,START_TASK_STK,START_TASK_STK_SIZE/10,START_TASK_STK_SIZE,0, 0,0,OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,&err);
        
      OS_CRITICAL_EXIT();//退出代码临界保护区
      OSStart(&err);      //开启UCOSIII
      while(1);
  • 相关阅读:
    Jenkins+gitlab自动化构建部署
    浅尝CI/CD,真香
    各种奇葩,我感觉我快窒息了,来吐吐槽...
    用SMART原则来创建一个好的OKR
    用OKR改变个人能力得不到明显提升的困境
    承诺型与愿景型,什么样的OKR适合你?
    OKR文化:关键成果必须具备的五个特点
    为什么不能完全用OKR替代KPI?
    OKR的激励方式应该注意什么?
    OKR如何与绩效考核并行?
  • 原文地址:https://www.cnblogs.com/CaiFengYuanXing/p/13704487.html
Copyright © 2011-2022 走看看