【1】uC/OS-III应用开发————>创建任务(STM32F767)

  1. 简述:
    1. uC/OS任务分为2种:系统任务和用户任务
    2. 任务组成:
      1. 任务程序代码(函数)
      2. 任务堆栈
      3. 任务控制块
    3. 任务的状态:
      1. 睡眠:任务没有配备任务控制块或被剥夺了任务控制块时的状态
      2. 就绪:系统为任务配备了任务控制块且在任务就绪表中进行了就绪登记,任务具备了运行的充分条件
      3. 运行:处于就绪状态的任务经调度器判断获得了CPU的使用权,则任务就进入了运行状态
      4. 等待:正在运行的任务,需要等待一段时间或需要等待一个事件发生再运行时,该任务就会把CPU的使用权让给其他任务而使任务进行等待状态
      5. 中断服务态:一个正在运行的任务一旦响应中断申请就会中止运行转而去执行中断服务程序,此时这个任务就会被挂起,进入中断服务态
    4. 硬件初始化:
      1. 模仿官方例程,把所有的外设初始化都放在bsp.c文件中的bsp_init()函数
      2. 本章节只用到led和串口
      3. 代码如下:
        /**************************************************
         * 函数名:void  BSP_Init (void)
         * 描述  :外设初始化
         * 输入  :无
         * 输出  :无
         * 返回  :无 
         * 调用  :内部调用 
         **************************************************/
        void  BSP_Init (void)
        {
        	Cache_Enable();                 //打开L1-Cache
        	HAL_Init();				        //初始化HAL库
        	Stm32_Clock_Init(432,25,2,9);   //设置时钟,216Mhz 
            
        //    delay_init(216);
            uart_init(115200); //串口初始化
        
            BSP_LED_Init(); //led 初始化
        }

         

    5. 定义任务堆栈大小
      1. /*
        *********************************************************************************************************
        *                                            任务堆栈大小 
        *********************************************************************************************************
        */
        
        #define  APP_TASK_START_STK_SIZE                     256u
        
        #define  APP_TASK_LED_STK_SIZE                       512u
        #define  APP_TASK_USART_STK_SIZE                     512u

         

    6. 定义任务优先级
      1. /*
        *********************************************************************************************************
        *                                            任务 优先级
        *********************************************************************************************************
        */
        
        #define  APP_TASK_START_PRIO                           2u
        
        #define  APP_TASK_LED_PRIO                             3u
        #define  APP_TASK_USART_PRIO                           3u

         

    7. 定义任务控制块
      1. /*
        *********************************************************************************************************
        *                                         任务控制块TCB
        *********************************************************************************************************
        */
        static OS_TCB   AppTaskStartTCB;    //起始任务控制块
        
        static OS_TCB   AppTaskLedTCB;      //led任务控制块
        static OS_TCB   AppTaskUsartTCB;    //串口任务控制块

         

    8. 定义任务主体函数
      1. /*
        *********************************************************************************************************
        *                                         函数原型
        *********************************************************************************************************
        */
        static void AppTaskStart(void *p_arg);      //起始任务函数
        
        static void AppTaskLed(void *p_arg);        //led任务函数
        static void AppTaskUsart(void *p_arg);      //串口任务函数

         

    9. 创建任务
      1. /**************************************************
         * 函数名:static  void  AppTaskStart (void *p_arg)
         * 描述  :起始任务
         * 输入  :无
         * 输出  :无
         * 返回  :无 
         * 调用  :内部调用 
         **************************************************/
        static  void  AppTaskStart (void *p_arg)
        {
            CPU_INT32U  cpu_clk_freq;
            CPU_INT32U  cnts;
            OS_ERR      err;
        
        
           (void)p_arg;
        
            BSP_Init();                                                 /* Initialize BSP functions                             */
            CPU_Init();                                                 /* Initialize the uC/CPU services                       */
        
            //初始化滴答计数器
            cpu_clk_freq = BSP_CPU_ClkFreq();                           /* Determine SysTick reference freq.                    */
            cnts         = cpu_clk_freq                                 /* Determine nbr SysTick increments                     */
                         / (CPU_INT32U)OSCfg_TickRate_Hz;
            OS_CPU_SysTickInit(cnts);                                   /* Init uC/OS periodic time src (SysTick).              */
            //内存管理,堆内存池,内存池表
            Mem_Init();                                                 /* Initialize memory managment module                   */
        //    Math_Init();                                                /* Initialize mathematical module                       */
        
        
        #if OS_CFG_STAT_TASK_EN > 0u
            OSStatTaskCPUUsageInit(&err);                               /* Compute CPU capacity with no task running            */
        #endif
        
        #ifdef CPU_CFG_INT_DIS_MEAS_EN
            CPU_IntDisMeasMaxCurReset();
        #endif
        
        	/* 创建led任务 */
            OSTaskCreate((OS_TCB     *) &AppTaskLedTCB,                             //任务控制块地址
                         (CPU_CHAR   *) "App Task Led",                             //任务名称
                         (OS_TASK_PTR ) AppTaskLed,                                 //任务函数
                         (void       *) 0,                                          //传递给任务函数(形参p_arg)的实参
                         (OS_PRIO     ) APP_TASK_LED_PRIO,                          //任务的优先级
                         (CPU_STK    *) &AppTaskLedStk[0],                          //任务堆栈的基地址
                         (CPU_STK_SIZE) APP_TASK_LED_STK_SIZE / 10,               //任务堆栈空间剩下1/10时限制其增长
                         (CPU_STK_SIZE) APP_TASK_LED_STK_SIZE,                    //任务堆栈空间(单位:sizeof(CPU_STK))
                         (OS_MSG_QTY  ) 5u,                                         //任务可接收的最大消息数
                         (OS_TICK     ) 0u,                                         //任务的时间片节拍数(0表默认值OSCfg_TickRate_Hz/10)
                         (void       *) 0,                                          //任务扩展(0表不扩展)
                         (OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), //任务选项
                         (OS_ERR     *)&err); 
                         
        	/* 创建串口任务 */
            OSTaskCreate((OS_TCB     *) &AppTaskUsartTCB,                             //任务控制块地址
                         (CPU_CHAR   *) "App Task Usart",                             //任务名称
                         (OS_TASK_PTR ) AppTaskUsart,                                 //任务函数
                         (void       *) 0,                                          //传递给任务函数(形参p_arg)的实参
                         (OS_PRIO     ) APP_TASK_USART_PRIO,                          //任务的优先级
                         (CPU_STK    *) &AppTaskUsartStk[0],                          //任务堆栈的基地址
                         (CPU_STK_SIZE) APP_TASK_USART_STK_SIZE / 10,               //任务堆栈空间剩下1/10时限制其增长
                         (CPU_STK_SIZE) APP_TASK_USART_STK_SIZE,                    //任务堆栈空间(单位:sizeof(CPU_STK))
                         (OS_MSG_QTY  ) 5u,                                         //任务可接收的最大消息数
                         (OS_TICK     ) 0u,                                         //任务的时间片节拍数(0表默认值OSCfg_TickRate_Hz/10)
                         (void       *) 0,                                          //任务扩展(0表不扩展)
                         (OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), //任务选项
                         (OS_ERR     *)&err);
        
            OSTaskDel(&AppTaskStartTCB, &err);  //删除起始任务             
        }

         

    10. 任务应用
      1. /*
        *********************************************************************************************************
        *                                         任务函数实现
        *********************************************************************************************************
        */
        /**************************************************
         * 函数名:static void AppTaskLed(void *p_arg)
         * 描述  :led应用
         * 输入  :无
         * 输出  :无
         * 返回  :无 
         * 调用  :内部调用 
         **************************************************/
        static void AppTaskLed(void *p_arg)
        {
            OS_ERR err;
            (void)p_arg;
            
            for(;;)
            {
         		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);	//PB1置1
        		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);	//PB0置1
        		printf("灯亮了\r\n");
                OSTimeDly ( 500,OS_OPT_TIME_DLY,&err);
                
        		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);	//PB1置0
        		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);	//PB0置0
        		printf("灯灭了\r\n");
                OSTimeDly ( 500,OS_OPT_TIME_DLY,&err);          
            }
        }
        /**************************************************
         * 函数名:static void AppTaskUsart(void *p_arg)
         * 描述  :串口打印
         * 输入  :无
         * 输出  :无
         * 返回  :无 
         * 调用  :内部调用 
         **************************************************/
        static void AppTaskUsart(void *p_arg)
        {
            OS_ERR err;
            (void)p_arg;
            
            for(;;)
            {
        		printf("灯亮了\r\n");
                OSTimeDly ( 500,OS_OPT_TIME_DLY,&err);
                
        		printf("灯灭了\r\n");
                OSTimeDly ( 500,OS_OPT_TIME_DLY,&err);          
            }
        }

         

    11. 下载验证
      1. 省略
    12. 总结
      1. 任务的5个状态、任务构成、任务创建流程、用户任务与系统任务
    13. 参考资料:
      1. 正点原子《STM32F767 UCOS开发手册》
      2. 野火《uC/OS-III内核应用与开发》
      3. 《嵌入式实时操作系统 uC/OS-III原理及应用(第二版)》
      4. 官方源码
    14. 硬件平台:
      1. 正点原子阿波罗F767
    15. 软件平台:
      1. MDK5.2.5
    16. 库版本:
      1. TM32Cube_FW_F7_V1.4.0
    17. uC/OS-III版本
      1. UCOSIII 3.04
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值