问题描述
需要添加一个接口,使用微秒级的周期回调,修改之后,一运行起来,代码就进入了ShutdownHook里面。
问题分析
首先通过错误值为14,得知错误类型为内存保护。调试根据堆栈得知在Gpt_LLD_Init接口里面跑飞,刚好就是初始化最新的定时器。

#define TGC_ENDIS_STAT0 ((uint32)(BIT1|BIT0))
#define BIT1 ((uint32)0x00000002UL)
#define BIT0 ((uint32)0x00000001UL)
C语言代码分析
tempIndex是一个uint32,TGC_ENDIS_STAT0是一个uint32类型的3,要左移14位再进行赋值,直接就溢出了?
明显不符合常理。
汇编代码分析
e_lwz r5,0x74(r11) 的作用是从内存地址 r11 + 0x74 处加载一个32位的值到 r5,并将 r5 的高16位清零。
这时候r11位0xF7C6 8000
R5为0
r11 + 0x74地址为0xF7C6 8074
按照地址来看也没啥,从F7C6 0000开始就是GTM的范围

结论
检查初始化过程当中发现,还没初始化GTM就调用了Gpt_Init,GPT里面可是应用到GTM的东西!
所以得先初始化GTM,才能调用Gpt_Init接口。

155

被折叠的 条评论
为什么被折叠?



