微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 第十二篇?优化代码,在ucosiii下,实现同步信号亮.

第十二篇?优化代码,在ucosiii下,实现同步信号亮.

时间:10-02 整理:3721RD 点击:
考虑到rtos的特点,既然已经使用了ucosiii,那么肯定要借助她的功能,为了实现,系统的多任务实时响应,今天完成了优化之前的多任务下的轮训操作,改为任务信号量同步.本次,主要有三个任务.
task0:dma下4路adc检测,
task1:pwm检测获取输入频率
task2:获取rgb屏幕按键中断
3个任务都在等待task信号量,这里有三个中断分别给他们发送task信号量.
分别是

  1.   void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
  2.   {
  3.         static OS_ERR err;
  4.     if(hadc->Instance==ADC1)
  5.     {
  6.         OSTaskSemPost(&AppTaskObj0TCB,OS_OPT_POST_NONE,&err);
  7.     }
  8.   }

  9. /*输入捕获中断的回调函数*/
  10. void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
  11. {
  12.   static OS_ERR err;
  13.   if(htim->Instance==TIM5)
  14.   {
  15.     switch(ic_state)
  16.     {
  17.     case 0x00:ic_state=0x40;ic_value=0x00;__HAL_TIM_DISABLE(htim);__HAL_TIM_SET_COUNTER(htim,0);__HAL_TIM_ENABLE(htim);break;//捕获第一个中断
  18.     case 0x40:ic_state|=0x80;ic_value=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);
  19.     OSTaskSemPost(&AppTaskObj1TCB,OS_OPT_POST_NONE,&err);break;//捕获第二个中断,完成一次周期捕获
  20.     default:break;
  21.     }
  22.   }
  23. }

  24. void EXTI9_5_IRQHandler(void) {
  25.   static OS_ERR err;
  26.   OSIntEnter();
  27.   OSTaskSemPost(&AppTaskObj2TCB,OS_OPT_POST_NONE,&err);
  28.   __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_7);
  29.   OSIntExit();
  30. }

复制代码

而三个任务等待信号量的操作如下:

  1. while (DEF_TRUE) {
  2.             BSP_LED_Off(0);
  3.             OSTaskSemPend (
  4.                             100,
  5.                                     OS_OPT_PEND_BLOCKING,
  6.                                     NULL,
  7.                                     &os_err);
  8.             if(os_err==OS_ERR_NONE)
  9.             {
  10.             while(uline<4){
  11.             switch(uline)
  12.             {
  13.             case 0:{sprintf((char *)rstr,"PA4:%4dKg",raw_icekong[1]);break;}
  14.             case 1:{sprintf((char *)rstr,"PA5:%4dN.m",raw_icekong[2]);break;}
  15.             case 2:{sprintf((char *)rstr,"PA6:%4dcm",raw_icekong[3]);break;}
  16.             case 3:{uitemp=raw_icekong[0];ftemp=((float)uitemp)/4095*3300;ftemp=((ftemp-760.0)/2.5)+25;
  17.                     sprintf((char *)rstr,"%0.3f",ftemp);break;}
  18.             default:break;
  19.             }
  20.             LCD_ShowString(120,130+uline*80,strlen(rstr)*16,32,32,(uint8_t *)rstr);
  21.             //printf("%s\r\n",rstr);
  22.             uline++;
  23.             }
  24.             uline=0;
  25.         }
  26.             APP_TRACE_INFO(("Object test task 0 running ....\r\n"));
  27.     }

  28. while (DEF_TRUE) {
  29.             OSTaskSemPend (
  30.                             100,
  31.                                     OS_OPT_PEND_BLOCKING,
  32.                                     NULL,
  33.                                     &os_err);
  34.             if(os_err==OS_ERR_NONE)
  35.             {
  36.                          ic_state&=0x3f;
  37.                          hole_ic_value=ic_state*(0xffffffff);
  38.                          hole_ic_value+=ic_value;
  39.                          ic_value=hole_ic_value/1000;
  40.                          sprintf((char *)rstr,"PWM:%6dms...%9lldus",(int)ic_value,(long long int)hole_ic_value);
  41.                          LCD_ShowString(120,50,strlen(rstr)*16,32,32,(uint8_t *)rstr);
  42.                          printf("%s\r\n",rstr);
  43.                          ic_state=0x00;
  44.             }
  45.         APP_TRACE_INFO(("Object test task 1 running ....\r\n"));
  46.     }

  47. while (DEF_TRUE) {
  48.         OSTaskSemPend (100,
  49.                                             OS_OPT_PEND_BLOCKING,
  50.                                             NULL,
  51.                                             &os_err);
  52.         if(os_err==OS_ERR_NONE)
  53.         {
  54.         BSP_LED_On(0);
  55.         FT5206_Scan();
  56.         if(tp_dev.sta!=0)
  57.                         {
  58.                           tp_dev.sta&=0x1f;
  59.                           while(tp_dev.sta&0x01){
  60.                             upoint++;
  61.                             tp_dev.sta>>=1;
  62.                           }
  63.                           for(tp_dev.sta=0;tp_dev.sta<upoint;tp_dev.sta++)
  64.                           {
  65.                           sprintf((char *)rstr,"%dtouchpoint,x=%3d,y=%3d",tp_dev.sta,(uint16_t)tp_dev.x[tp_dev.sta],(uint16_t)tp_dev.y[tp_dev.sta]);
  66.                           if((tp_dev.x[tp_dev.sta]<800)&&(tp_dev.y[tp_dev.sta]<480))
  67.                           {
  68.                            //printf("%s\r\n",rstr);
  69.                             LCD_ShowString(300,50+3*80,32*16,32,32,(uint8_t *)rstr);
  70.                           }
  71.                           }
  72.                           upoint=0;
  73.                           tp_dev.sta=0;
  74.                         }
  75.         }
  76.         else if(os_err==OS_ERR_TIMEOUT)
  77.         {
  78.                 printf("task3 time out.\r\n");
  79.         }
  80.         APP_TRACE_INFO(("Object test task 2 running ....\r\n"));
  81.     }

复制代码

简而言之,主要适用了两个函数:

  1. OS_SEM_CTR  OSTaskSemPend (OS_TICK   timeout,
  2.                            OS_OPT    opt,
  3.                            CPU_TS   *p_ts,
  4.                            OS_ERR   *p_err)//等待信号量

复制代码


  1. OS_SEM_CTR  OSTaskSemPost (OS_TCB  *p_tcb,
  2.                            OS_OPT   opt,
  3.                            OS_ERR  *p_err)//发送信号量

复制代码

架构如下:
主任伍不断尝试获取信号量,而3路中断则发给对应的三个任务,
用插图显示如下:


完整的代码,在https://github.com/iysheng/chicken

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top