uCOSIII软件定时器创建注意点

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a1598025967/article/details/82015065

软件环境:C语言;MDK-5.15;uCOSIII3.03.01

硬件环境:STM32F1

问题:在MDK从代码最高优化降级到不优化时程序运行会出现硬错误

原因:创建软件定时器时定义软件定时器对象使用的局部变量

解决方案:将局部变量改为全局变量或者静态局部变量

下面给出软件定时器创建代码:

static 
    void CreatTmr2(void);/*创建一个软件定时器*/
static 
    void Tmr2CallBack(OS_TMR *p_tmr, void *p_arg);/*软件定时器任务回调函数*/

/*创建软件定时器*/
static void CreatTmr2(void)
{
  OS_ERR err;
  static OS_TMR Tmr2;/*软件定时器对象*/
    
  OSTmrCreate((OS_TMR               *)    &Tmr2,              /*定时器对象*/
              (CPU_CHAR             *)    "Tmr2",             /*定时器名*/
              (OS_TICK               )    0,                  /*初始延迟*/
              (OS_TICK               )    10,                 /*重装载值,定时器时基为100hz,即10ms*10触发一次*/
              (OS_OPT                )    OS_OPT_TMR_PERIODIC,/*周期性定时*/
              (OS_TMR_CALLBACK_PTR   )    Tmr2CallBack,       /*回调函数*/
              (void                 *)    0,                  /*回调函数参数*/
              (OS_ERR               *)    &err);              /*错误类型*/
                    
  if(err == OS_ERR_NONE)
  {
    OSTmrStart((OS_TMR        *)    &Tmr2,/*开启软件定时器*/
               (OS_ERR        *)    &err);
  }
  else
  {
    #if DEBUG_ENABLE
    PRINTF_Dbg("create tmr2 failed..\n");
    #endif
  }
}
/*软件定时器回调函数*/
static void Tmr2CallBack(OS_TMR *p_tmr, void *p_arg)
{
    (void)p_tmr;
    (void)p_arg;
}

注意CreatTmr2();函数最好放在任务中执行,不放在任务创建函数中执行,例:

/*xxx任务*/
static void AppTask_xxx(void *p_arg)
{
    OS_ERR err;
  
    /*创建软件定时器*/
    CreatTmr2();
  
    while(DEF_TRUE){
        
        OSTimeDlyHMSM(0,0,0,10,OS_OPT_TIME_PERIODIC | OS_OPT_TIME_HMSM_STRICT,&err);
    }
}

猜你喜欢

转载自blog.csdn.net/a1598025967/article/details/82015065