软件环境: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);
}
}