C语言调试中出现的一些莫名其妙的问题

  1. 定义一个全局变量service_port,并附初值,在使用时总是莫名奇妙的变化成另一个值,其他地方没有任何的修改,原因没找到,但是在定义前加上const关键字修饰即可解决该问题。

  1. 定义一个全局变量static uint8_t simulation_value=0;,并附初值,但是其他地方有修改++,但是在进行其他操作时,该变量会变成并不是预期的值。当在定义时static uint8_t simulation_value,并不赋初值,即可解决该问题。

对于该问题,在网上找了其他高手的一些解释:

一、简单的讲一下原理。在嵌入式系统中,全局变量的初始化是在系统启动的过程中来做的。做法其实很简单,就是把外存(ROM或Flash等存放CODE的介质)中的全局变量空间拷贝到内存中的全局变量空间映像中。如果没有这一步正确的从外存到内存的拷贝工作,你的全局变量是没有初始化值的。

编译器如果没有生成这步代码,那你的全局变量就都是没有办法初始化的。

用const为啥能解决问题呢?因为const型的变量被Keil直接放到了外存中,也就是放到了代码段中。以后使用const实际不是访问内存而是外存!

现在说你的全局变量初始化的问题解决方案:

1. 研究编译结果,看全局变量的初值被放在了code段的哪个位置,以及全局变量在内存中的位置定义,然后在初始化过程中——进入main函数之前,把这些值拷贝过来。因为编译器是按照段来处理全局变量的,所以所有全局变量的相对位置都是一一对应的,用memcpy就可以了。

2. 不要在全局变量中这样初始化,而是通过函数来初始化,在main函数的开头用init函数来初始化所有的全局变量。

二、哪个大师说过的一句话,程序中莫名其秒的变量问题[无论局部还是全局],大都是数组越界造成的!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值