用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;
}
此帖出自
小平头技术问答
栈指针是对的,但是形参pParam的指针值却没有恢复。
keil的优化问题,在c/c++设置中调整代码优化选项仍然无法解决问题,最后只能在每个出问题的地方,申明一个volatile指针拷贝形参指针值后再未发现类似错误(PS:此时,形参仍然我行我素的变化(@.(@)。
继续关注代码优化相关问题。
一周热门 更多>