迷你OS -III定时器回调函数没有被调用



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

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

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

从keil帮助中我了解到在Level 1- 01优化中完成了以下优化。

  • 断点不能在死代码上设置。
  • 变量的值在
    之后可能在其作用域中不可用它们已被初始化。例如,如果它们的指定位置
  • 没有副作用的函数可能被乱序调用,或者如果不需要结果,可以省略。

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

如何解决这个问题?

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);
}

创建计时器的代码。

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");
}

启动周期定时器的代码。

OSTmrStart(&ostmr_LCDFrontPorch,&err);

编译控制字符串。

c --cpu Cortex-M4.fp -g -O0 --apcs=interwork -I..platform3rd_Party_STDriversCMSISInclude 
-I C:UsersbroDesktopProjectChargerWorkspacesomeyeahRTE 
-I C:Keil_v5ARMPACKKeilSTM32F4xx_DFP2.5.0 
-I C:Keil_v5ARMCMSISInclude 
-I    C:Keil_v5ARMPACKKeilSTM32F4xx_DFP2.5.0DriversCMSISDeviceSTSTM32F4xxInclude 
-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" 

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

if ( funcReturnsFalse() )
{
    CallBackFcn( param1, param2 );   //  Whatever your real callback is
}

你不想实际调用,因为这会改变你在优化关闭时工作的逻辑。编译器可能足够聪明,可以理解if ( false ) ...这样的东西,所以有一个函数调用(funcReturnsFalse())可能足以让编译器相信你将使用CallBackFcn()

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

相关内容

  • 没有找到相关文章

最新更新