首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Micrium计时器回调函数未被调用

Micrium计时器回调函数未被调用
EN

Stack Overflow用户
提问于 2015-09-16 07:01:16
回答 1查看 518关注 0票数 1

我正在使用keil编译器的arm(stm32F4)。在我的代码中,我创建了一个计时器来调用一个函数,该函数从*.lib文件中调用一个函数。

如果我使用链接器优化级别-0 (O-0),并且应用程序工作正常,则会调用该函数。如果我将优化级别更改为(O-1),则该函数不会包含在可执行文件中。

我检查了手表窗口中的计时器结构,计数器值正在更新,回调函数地址出现,它与地图文件中的地址匹配。

在keil中,我了解到在1-o1级优化中,完成了以下优化。

  • 断点不能设置在死代码上。
  • 之后,变量的值可能在其范围内不可用。 它们已经初始化了。例如,如果它们指定的位置 已经被重复使用了。
  • 没有副作用的函数可能被按顺序调用,如果不需要结果,则可以省略。

我尝试从一个任务调用lib函数。但同样的事情正在发生。由于函数是直接引用的,我怀疑编译器认为该函数没有副作用。

我怎么解决这个问题?

代码语言:javascript
复制
void LCDVsync_TMRHandler(void *ptmr, void *parg)
{
    OS_ERR err;
    OSWrappers::signalVSync();

}

void LCDFrontPorch_TMRHandler(void *ptmr,void *arg)
{
     OS_ERR err;
     HAL::getInstance()->frontPorchEntered();
     OSTmrStart(&ostmr_LCDVsync,&err);

}

创建计时器的代码。

代码语言:javascript
复制
OSTmrCreate(&ostmr_LCDVsync,"LCD vsync signalling",10,0,OS_OPT_TMR_ONE_SHOT,LCDVsync_TMRHandler,(void *)0,&err);
if(OS_ERR_NONE != err)
{
    DEBUG_ERROR_APP("ERROR: APP.C : AppTmrCreate : LCD vsync signalling tmr create failure");
}
OSTmrCreate(&ostmr_LCDFrontPorch,"LCD Front porch",0,20,OS_OPT_TMR_PERIODIC,LCDFrontPorch_TMRHandler,(void *)0,&err);
if(OS_ERR_NONE != err)
{
    DEBUG_ERROR_APP("ERROR: APP.C : AppTmrCreate : LCD vsync signalling tmr create failure");
}

启动周期性计时器的代码。

代码语言:javascript
复制
OSTmrStart(&ostmr_LCDFrontPorch,&err);

编译器控制字符串。

代码语言:javascript
复制
c --cpu Cortex-M4.fp -g -O0 --apcs=interwork -I..\platform\3rd_Party_ST\Drivers\CMSIS\Include 
-I C:\Users\bro\Desktop\Project\Charger\Workspace\some\yeah\RTE 
-I C:\Keil_v5\ARM\PACK\Keil\STM32F4xx_DFP\2.5.0 
-I C:\Keil_v5\ARM\CMSIS\Include 
-I    C:\Keil_v5\ARM\PACK\Keil\STM32F4xx_DFP\2.5.0\Drivers\CMSIS\Device\ST\STM32F4xx\Include 
-D__UVISION_VERSION="513" -DSTM32F429xx -DUSE_HAL_DRIVER -DSTM32F429xx -DUSE_STM324x9I_EVAL -DUSE_I2C1 -DUSE_SPIX -DUSE_USB_FS -DUSECB_SDOREQ -o ".\Objects\*.o" --omf_browse ".\Objects\*.crf" --depend ".\Objects\*.d" 
EN

回答 1

Stack Overflow用户

发布于 2015-09-21 10:20:57

因为它在没有优化的情况下工作,所以我建议在打开优化时欺骗编译器。具体来说,你可以这样做:

代码语言:javascript
复制
if ( funcReturnsFalse() )
{
    CallBackFcn( param1, param2 );   //  Whatever your real callback is
}

您不想实际进行调用,因为这会改变优化关闭时的工作逻辑。编译器可能足够聪明,能够理解类似if ( false ) ...的内容,因此,拥有一个函数调用( funcReturnsFalse() )可能就足以让编译器相信您将使用CallBackFcn()

我以前遇到过这个问题(不是用Micrium),这种技术对我有用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32601772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档