本帖最后由 guo8113 于 2015-10-17 21:39 编辑
不得不说,Freescale的ksdk对于懂点MCU的小白其实是很好用的,以LPTMR为例如图所示,实现周期性延时并执行回调函数,不用去管寄存器初值、重装、中断等等一系列嵌入式中的issue,只需要几个API,注册回调OK.
但是我在使用的时候遇到了一个问题,同样的语句,如果我把LPTMR的设置与初始化拿到一个函数里实现时(如图2),遇到了神奇的hardfault。 真是百思不得其解,然后我把函数设置为inline,OK了。后来分析了下代码,问题出在lptmr_state_t这个鬼上。 typedef struct LptmrState { lptmr_callback_t userCallbackFunc; /*!< Callbackfunction that is executed in ISR. */ uint32_t prescalerClockHz; } lptmr_state_t; /*! @brief Table to save pointers tocontext data. */ extern lptmr_state_t *g_lptmrStatePtr[LPTMR_INSTANCE_COUNT]; 在驱动的实现中发现,LPTMR驱动通过全局的指针(lptmr_state_t *g_lptmrStatePtr[LPTMR_INSTANCE_COUNT];)来管理芯片上所有的LPTMR,既然是指针,如果lptmr_state_t类型的变量是局部变量,那么出了它的领地,就被干掉了,驱动自然无法按预期运行。 因此需要将lptmr_state_t类型的变量声明为static为妙。 当然其他的驱动模块也一样,都需要注意这一点。
|