KEIL下LPC1114代码运行问题

2019-03-25 20:45发布

用keil编码1114的i2c,我在设置了编译优化选项之后出现了巨大的问题。索性,在取消掉所有的优化选项后i2c通信已经正常。   可惜结果仍然不正确,我就跟代码。这时候才发现一个无法理解的问题。我在funcA()里调用funcB()时传入一个静态myVar的指针。这个指针在funcB()中进行第一步读i2c操作xxx_II2C_Read32()完成后,再进行第二次读i2c操作xxx_II2C_Read16()时,传入的指针变量pParam这个指针本身居然发生了改变。这样的变化直接导致了i2c操作失败。 这只是个前后台的程序,变量myVar也并没有出现在任何的中断服务程序中。 我是非常的费解,有请各位看官大大帮忙瞧瞧,可能出现的问题在哪里? 我用的版本是RealView MDK-ARM 4.10b。   static struct type_a myVar; void funcA(void)
{
 /* set myVar */
 ......................
 funcB(&myVar);
}   int funcB( struct type_a *pParam)
{
 int r;
 unsigned short uiReadValue;
 unsigned int uiTemp;  r = xxx_II2C_Read32((unsigned short)(pParam->m_SlaveAddr), offset_1, &uiTemp);
 r |= xxx_II2C_Read16((unsigned short)(pParam->m_SlaveAddr), offset_2, &uiReadValue);  return r;
} 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
jolyku
1楼-- · 2019-03-27 00:04
 精彩回答 2  元偷偷看……
zhaojun_xf
2楼-- · 2019-03-27 00:55
你可以单步调试,看在什么地方被篡改!!
jolyku
3楼-- · 2019-03-27 06:30
篡改的地方就是在funcB()中,“xxx_II2C_Read32()完成后,再进行第二次读i2c操作xxx_II2C_Read16()时,传入的指针变量pParam这个指针本身居然发生了改变”。
栈指针是对的,但是形参pParam的指针值却没有恢复。
jolyku
4楼-- · 2019-03-27 08:30
问题已经暂时解决:
keil的优化问题,在c/c++设置中调整代码优化选项仍然无法解决问题,最后只能在每个出问题的地方,申明一个volatile指针拷贝形参指针值后再未发现类似错误(PS:此时,形参仍然我行我素的变化(@.(@)。

继续关注代码优化相关问题。
zhaojun_xf
5楼-- · 2019-03-27 08:41
如果是在中断中使用的变量,必须用volatile申明。
jolyku
6楼-- · 2019-03-27 12:29
没有在中断中出现问题。

一周热门 更多>