怎么检查使用ucOSII系统所带来的内存问题?数组内容被莫名其妙改变!
平台:STM32F103,keil 4, GCC。volatile unsigned char cSet_Time_table1 = {0x00,0x13,0x17,0x04,0x19,0x05,0x11};
uchar i;
for(i=0; i<7; i++)
{
cSet_Time_table1 = (cSet_Time_table1/10)<<4 + (cSet_Time_table1%10);
}
请教:在执行上述语句后,数组内容被莫名其妙的改变为0,请问怎么排查问题所在?
应该和跑了操作系统有关系。但是无从下手啊。
内存是怎么被改变的应该怎么查呢?
注:数组内容在按键程序中有所改变。 cSet_Time_table1如果是全局的而且有两个以上任务共享,访问时要关中断。 顶 这种问题10有8,9就是栈空间不够用 呵呵。。兄弟,我猜你的本意是先让(cSet_Time_table1/10)移位再 加 (cSet_Time_table1%10)的吧。
实际上,是 先执行 4 + (cSet_Time_table1%10);然后 执行 (cSet_Time_table1/10)<<( 4+(cSet_Time_table1%10) ),所以导致“数组内容被莫名其妙的改变为0”...
运算符优先级问题。 回复【1楼】TimCheng
cset_time_table1如果是全局的而且有两个以上任务共享,访问时要关中断。
-----------------------------------------------------------------------
cset_time_table1的确是全局的,而且有两个任务共享。我访问时没有关中断。谢谢提醒。我试试。
回复【3楼】smartmeter
这种问题10有8,9就是栈空间不够用
-----------------------------------------------------------------------
我估计栈空间不够用的可能性比较小,我已经把栈定义的很大了。不过我会检查一下。
回复【4楼】luy3728000
呵呵。。兄弟,我猜你的本意是先让(cset_time_table1/10)移位再 加 (cset_time_table1%10)的吧。
实际上,是 先执行 4 + (cset_time_table1%10);然后 执行 (cset_time_table1/10)<<( 4+(cset_time_table1%10) ),所以导致“数组内容被莫名其妙的改变为0”...
运算符优先级问题。
-----------------------------------------------------------------------
你猜对了!原来“+”比“《”的优先级高呀?!这倒没注意。我试试看。
谢谢各位。另外,我也考虑到是不是可重入函数的问题。今天都试试。 按照1楼和4楼所说修改了,暂时没有发现问题。 左移 << 的优先级很低的,楼主下次要注意
再有,写代码时不要舍不得用(),把高位和低位都用()框起来,一是容易理解,再有就是也不容易出错
页:
[1]