Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在基于Eclipse的IDE中,全局变量初始化为错误值-疑难解答_C - Fatal编程技术网

在基于Eclipse的IDE中,全局变量初始化为错误值-疑难解答

在基于Eclipse的IDE中,全局变量初始化为错误值-疑难解答,c,C,问题 我正在使用基于Eclipse的编译器对微控制器进行编程。在main()函数外部初始化为0的一个全局变量被初始化为某个任意值。在debugger视图中,每当我手动重新初始化变量并通过按“从头开始”按钮重新启动代码而不重新构建代码时,所述变量将保留该值-这很难解释,但可能是一个线索。此外,它周围的其他全局变量可以很好地初始化,但它们被设置为除0以外的值——这可能是第二个线索 到目前为止,我们已经做了哪些工作来找出原因 简言之,不是很多:)由于经验有限,我所能做的就是查找一些答案——这些答

问题


我正在使用基于Eclipse的编译器对微控制器进行编程。在
main()
函数外部初始化为
0
的一个全局变量被初始化为某个任意值。在debugger视图中,每当我手动重新初始化变量并通过按“从头开始”按钮重新启动代码而不重新构建代码时,所述变量将保留该值-这很难解释,但可能是一个线索。此外,它周围的其他全局变量可以很好地初始化,但它们被设置为除
0
以外的值——这可能是第二个线索


到目前为止,我们已经做了哪些工作来找出原因


简言之,不是很多:)由于经验有限,我所能做的就是查找一些答案——这些答案实际上有答案,但不幸的是,我无法理解它。我将在何处查找此类问题的疑难解答,以及如何在编译器创建的所有文件中找到.bss信息?下面是我在试图找出问题所在时发现的一些东西


一些线索


我观察到这个问题有一些奇怪的地方。首先,全局变量声明如下所示:

uint16_t compareValue1 = (0U);
uint16_t compareValue2 = (600U);
uint16_t pwm_compareValue = (0U);
compareValue1
是一个初始化为任意值的变量(尽管在构建和调试代码时初始化为232的情况似乎更常见)
pwm\u compareValue
是我目前没有使用的变量,因此无法在调试视图中查看,除非我在代码中的某个地方使用它。这里是有趣的部分-每当我在我的代码中使用
hrpwm\u compareValue
时,两个
hrpwm\u compareValue
compareValue1
都被初始化为各自的
0
值。如上所述,
compareValue2
被一致且无错误地初始化为
600

这里还有一个-以下代码片段来自
main.o.lst
文件:

 446 0000 5802       .short 600
 447                 .global compareValue1
 448                 .section .bss.compareValue1,"aw",%nobits
 449                 .align 1
 452                compareValue1:
 453 0000 0000       .space 2
 454                 .global compareValue2
 455                 .section .data.compareValue2,"aw",%progbits
 456                 .align 1
 459                compareValue2:
 460 0000 5802       .short 600
 461                 .global pwm_compareValue
 462                 .section .bss.pwm_compareValue,"aw",%nobits
 463                 .align 1
 466                pwm_compareValue:
如果该变量是从
main()
函数内部初始化的,那么它将按照预期值假定
0


现在,我将更深入地研究这个问题,以进一步理解它,然而我希望从这个问题中得到的是我如何处理这些问题?我可以从上面的代码片段中提取有用的信息吗?在这种情况下,预处理标志是否有用?如果是,我如何使用它们?以前有人遇到过同样的问题吗?一般来说,是什么导致了这样的程序行为

微控制器必须在每次复位后调用
main()
之前进行初始化。初始化函数由启动代码调用。这是你应该找的地方

例如,keil编译器包装了一个启动时调用的
\u main
函数,该函数初始化全局变量,清除全局零初始化变量,然后调用用户的
main

问题是,您使用的是哪种微控制器,使用的是哪种启动代码


此链接必须澄清:

这些是定义,而不仅仅是声明。这与eclipse无关。正如所问的,它似乎甚至与C无关。请看,这与它是基于Eclipse或IDE的事实无关,事实上,禁用优化。确保完全重置。@EugeneSh。谢谢你们两位的澄清-我这么问是因为在这一点上,我不知道该在哪里寻找解决方案,也不知道它是否与IDE相关。使用您的硬件调试器在global上放置一个write watch?良好的响应和极好的链接-尽管我还没有弄清楚这个问题,但网站上的文章内容非常丰富。我正在使用基于ARM Cortex M4的micro,其启动代码由制造商提供。简言之,它似乎按照您建议的顺序进行操作—它首先初始化并将初始化数据加载到RAM中,然后转到
.bss
部分以加载零初始化数据。是否有任何方法可以检查每个变量初始化时使用的值(可能来自
.elf
文件)。你在变量上设置写表有困难吗?我还没有尝试观察点-我会让你知道这是怎么回事。到目前为止,我已经尝试对对象文件进行解汇编,以查看给定变量初始化为哪些值——除了一些有趣的信息之外,没有其他方法。在这种情况下,它是否有任何用处,或者监视点是首选的调试方法?