o11o 发表于 2011-6-27 17:04:45

怎么检查使用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,请问怎么排查问题所在?
应该和跑了操作系统有关系。但是无从下手啊。
内存是怎么被改变的应该怎么查呢?
注:数组内容在按键程序中有所改变。

TimCheng 发表于 2011-6-27 17:21:41

cSet_Time_table1如果是全局的而且有两个以上任务共享,访问时要关中断。

o11o 发表于 2011-6-27 17:22:21

smartmeter 发表于 2011-6-27 18:03:47

这种问题10有8,9就是栈空间不够用

luy3728000 发表于 2011-6-27 20:50:01

呵呵。。兄弟,我猜你的本意是先让(cSet_Time_table1/10)移位再 加 (cSet_Time_table1%10)的吧。
实际上,是 先执行 4 + (cSet_Time_table1%10);然后 执行 (cSet_Time_table1/10)<<( 4+(cSet_Time_table1%10) ),所以导致“数组内容被莫名其妙的改变为0”...

运算符优先级问题。

o11o 发表于 2011-6-28 08:47:42

回复【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)&lt;&lt;( 4+(cset_time_table1%10) ),所以导致“数组内容被莫名其妙的改变为0”...
运算符优先级问题。
-----------------------------------------------------------------------
你猜对了!原来“+”比“《”的优先级高呀?!这倒没注意。我试试看。


谢谢各位。另外,我也考虑到是不是可重入函数的问题。今天都试试。

o11o 发表于 2011-6-28 09:50:24

按照1楼和4楼所说修改了,暂时没有发现问题。

billowtust 发表于 2011-6-28 10:02:13

左移 << 的优先级很低的,楼主下次要注意

再有,写代码时不要舍不得用(),把高位和低位都用()框起来,一是容易理解,再有就是也不容易出错
页: [1]
查看完整版本: 怎么检查使用ucOSII系统所带来的内存问题?数组内容被莫名其妙改变!