STM8L使用中全局变量自动更改问题
问题是这样的,我在使用STM8L的时候,定义了一个全局变量A,只在初始化的时候赋了一个初值A=5,在整个程序生命过程中,没有任何一个地方改变这个初值。目前遇到在程序运行中,读出的这个A的值为0,请问是否可以确定为内存溢出或者其他什么问题有遇到类似情况的吗,求指导
上程序吧,在这里猜没意义。
很有可能是你的变量被优化掉了,之前有坛友遇到过这种问题。
一切以编译出来的汇编代码为准。
要想不被优化,要么调低优化等级;要么,在变量定义加上 volatile 修饰 toofree 发表于 2018-7-31 22:08
上程序吧,在这里猜没意义。
很有可能是你的变量被优化掉了,之前有坛友遇到过这种问题。
一切以编译出来的 ...
谢谢你 不过应该是RAM溢出导致有些变量清零了
问题找到了,应该是内存溢出,导致有一些变量被清零了。把程序中定义的一些数组大小改小之后,就正常了。顺便说一下,stm8l152c6的RAM只有2K
大家有什么看法可以交流一下
结帖 wanyisq 发表于 2018-8-1 08:49
问题找到了,应该是内存溢出,导致有一些变量被清零了。把程序中定义的一些数组大小改小之后,就正常了。顺 ...
把你的程序发上来。
如果是你所说的问题的话,可能还不能叫内存溢出。一般编译器会分配指定内存空间,编译时会自行判断内存够不够。如果内存不够,则编译出错。
内存溢出是指在使用的过程中,内存开销越来越大,只动态分配内存,而没有及时回收。
用数组也没问题,但如果把数组用指针方式使用,则需要用户自己判定界限。 本帖最后由 wanyisq 于 2018-8-1 14:54 编辑
toofree 发表于 2018-8-1 09:20
把你的程序发上来。
如果是你所说的问题的话,可能还不能叫内存溢出。一般编译器会分配指定内存空间,编 ...
<div class="blockcode"><blockquote>void ByteToHexStr(const uint8_t* source, uint8_t* dest, uint8_t sourceLen)
{
uint16_t i;
uint8_t highByte, lowByte;
for (i = 0; i < sourceLen; i++)
{
highByte = source >> 4;
lowByte = source & 0x0f ;
highByte += 0x30;
if (highByte > 0x39)
dest = highByte + 0x07;
else
dest = highByte;
lowByte += 0x30;
if (lowByte > 0x39)
dest = lowByte + 0x07;
else
dest = lowByte;
}
return ;
}
void SendCharStr(void)
{
uint8_t sour[ 250 ]={0};
uint8_t dest[ 500 ] = {0};
uint8_t str;
/*
省略中间从flash读出数据,赋值给sour数组的过程
*/
sprintf((char *)str,"%d", UsartType.TX_Size);
USART_WriteString(USARTX, (uint8_t *)str);
USART_WriteString(USARTX, (uint8_t *)",");
ByteToHexStr(sour , dest , UsartType.TX_Size);
USART_WriteData(USARTX , dest , (UsartType.TX_Size * 2));
USART_WriteString(USARTX, "\r\n");
}
代码就是上面这点,因为通讯模块需要发送字符串数据,所以要把flash里面存储的hex数据读出来,转换为字符串发送出去。问题解决就是把dest数组大小改成100、sour数组大小改的小点就没问题,程序正常执行,之前的全局变量也没有被清零。
帮我看看是不是怀疑的问题。
谢谢你
本帖最后由 wanyisq 于 2018-8-1 15:11 编辑
toofree 发表于 2018-8-1 09:20
把你的程序发上来。
如果是你所说的问题的话,可能还不能叫内存溢出。一般编译器会分配指定内存空间,编 ...
代码发上来了,请帮我看一下另外确定了问题在,程序运行到SendCharStr函数,声明了两个数组变量后,全局变量A就立马被清零了。
更改了两个数组大小后,再仿真,就没有这个问题了
页:
[1]