你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM8L使用中全局变量自动更改问题

[复制链接]
wanyisq 提问时间:2018-7-31 18:48 /
问题是这样的,我在使用STM8L的时候,定义了一个全局变量A,只在初始化的时候赋了一个初值A=5,在整个程序生命过程中,没有任何一个地方改变这个初值。目前遇到在程序运行中,读出的这个A的值为0,请问是否可以确定为内存溢出或者其他什么问题
有遇到类似情况的吗,求指导
收藏 评论6 发布时间:2018-7-31 18:48

举报

6个回答
toofree 回答时间:2018-7-31 22:08:38
上程序吧,在这里猜没意义。
很有可能是你的变量被优化掉了,之前有坛友遇到过这种问题。
一切以编译出来的汇编代码为准。

要想不被优化,要么调低优化等级;要么,在变量定义加上 volatile 修饰

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

wanyisq 回答时间:2018-8-1 08:48:44
toofree 发表于 2018-7-31 22:08
上程序吧,在这里猜没意义。
很有可能是你的变量被优化掉了,之前有坛友遇到过这种问题。
一切以编译出来的 ...

谢谢你 不过应该是RAM溢出导致有些变量清零了
wanyisq 回答时间:2018-8-1 08:49:19
问题找到了,应该是内存溢出,导致有一些变量被清零了。把程序中定义的一些数组大小改小之后,就正常了。顺便说一下,stm8l152c6的RAM只有2K
大家有什么看法可以交流一下
结帖

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2 结帖奖励

查看全部评分

toofree 回答时间:2018-8-1 09:20:52
wanyisq 发表于 2018-8-1 08:49
问题找到了,应该是内存溢出,导致有一些变量被清零了。把程序中定义的一些数组大小改小之后,就正常了。顺 ...

把你的程序发上来。
如果是你所说的问题的话,可能还不能叫内存溢出。一般编译器会分配指定内存空间,编译时会自行判断内存够不够。如果内存不够,则编译出错。
内存溢出是指在使用的过程中,内存开销越来越大,只动态分配内存,而没有及时回收。
用数组也没问题,但如果把数组用指针方式使用,则需要用户自己判定界限。
wanyisq 回答时间:2018-8-1 14:49:38
本帖最后由 wanyisq 于 2018-8-1 14:54 编辑
toofree 发表于 2018-8-1 09:20
把你的程序发上来。
如果是你所说的问题的话,可能还不能叫内存溢出。一般编译器会分配指定内存空间,编 ...
  1. <div class="blockcode"><blockquote>void ByteToHexStr(const uint8_t* source, uint8_t* dest, uint8_t sourceLen)  
  2. {  
  3.     uint16_t i;  
  4.     uint8_t highByte, lowByte;  
  5.   
  6.     for (i = 0; i < sourceLen; i++)  
  7.     {  
  8.         highByte = source[i] >> 4;  
  9.         lowByte = source[i] & 0x0f ;  
  10.   
  11.         highByte += 0x30;  
  12.   
  13.         if (highByte > 0x39)  
  14.                 dest[i * 2] = highByte + 0x07;  
  15.         else  
  16.                 dest[i * 2] = highByte;  
  17.   
  18.         lowByte += 0x30;  
  19.         if (lowByte > 0x39)  
  20.             dest[i * 2 + 1] = lowByte + 0x07;  
  21.         else  
  22.             dest[i * 2 + 1] = lowByte;  
  23.     }  
  24.     return ;  
  25. }

  26. void SendCharStr(void)
  27. {
  28.         uint8_t sour[ 250 ]  =  {0};
  29.         uint8_t dest[ 500 ] = {0};       
  30.         uint8_t str[2];
  31.        
  32.         /*
  33.                 省略中间从flash读出数据,赋值给sour数组的过程
  34.         */
  35.         sprintf((char *)str,"%d", UsartType.TX_Size);
  36.         USART_WriteString(USARTX, (uint8_t *)str);
  37.         USART_WriteString(USARTX, (uint8_t *)",");

  38.         ByteToHexStr(sour , dest , UsartType.TX_Size);
  39.         USART_WriteData(USARTX , dest , (UsartType.TX_Size * 2));
  40.         USART_WriteString(USARTX, "\r\n");
  41. }
复制代码

代码就是上面这点,因为通讯模块需要发送字符串数据,所以要把flash里面存储的hex数据读出来,转换为字符串发送出去。问题解决就是把dest数组大小改成100、sour数组大小改的小点就没问题,程序正常执行,之前的全局变量也没有被清零。

帮我看看是不是怀疑的问题。
谢谢你
wanyisq 回答时间:2018-8-1 14:55:31
本帖最后由 wanyisq 于 2018-8-1 15:11 编辑
toofree 发表于 2018-8-1 09:20
把你的程序发上来。
如果是你所说的问题的话,可能还不能叫内存溢出。一般编译器会分配指定内存空间,编 ...

代码发上来了,请帮我看一下另外确定了问题在,程序运行到SendCharStr函数,声明了两个数组变量后,全局变量A就立马被清零了。
更改了两个数组大小后,再仿真,就没有这个问题了
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版