打印

问个比较初级的问题,RAM中变量定义的初值。

[复制链接]
1294|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
地瓜patch|  楼主 | 2015-2-3 11:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
ningling_21| | 2015-2-3 13:15 | 只看该作者
可能是0,也可能是随机值

使用特权

评论回复
板凳
mcu5i51| | 2015-2-3 13:28 | 只看该作者
如果是51芯片和KEIL的话,是0
一船时是和编译器有关的,有的会清零,有的不会

使用特权

评论回复
地板
地瓜patch|  楼主 | 2015-2-3 13:37 | 只看该作者
mcu5i51 发表于 2015-2-3 13:28
如果是51芯片和KEIL的话,是0
一船时是和编译器有关的,有的会清零,有的不会

与编译器还有关系?不会吧

使用特权

评论回复
5
cainiao_123| | 2015-2-3 13:50 | 只看该作者
一般是0,与编译器有关系,与变量的类型有点关系

使用特权

评论回复
6
i55| | 2015-2-3 16:39 | 只看该作者
当然是0,未初始化数据是bss段,都必须被清零。正规的编译器都是这样的。

想要不是零也可以,自己用汇编写初始化代码,把bss段写成全-1都可以,就是从复位中断到main之间的那段代码。

使用特权

评论回复
7
mcu5i51| | 2015-2-3 17:14 | 只看该作者
地瓜patch 发表于 2015-2-3 13:37
与编译器还有关系?不会吧

并不是所有的编译器在启动代码中对所有的RAM都清零,51中也是对256个基本RAM清零,ARM要看对应的启动文件,一般是厂家或编译器提供,会有些不同的.
为了可以夸平台,最好是自己对变量做好初始化工作;

使用特权

评论回复
8
地瓜patch|  楼主 | 2015-2-3 18:49 | 只看该作者
mcu5i51 发表于 2015-2-3 17:14
并不是所有的编译器在启动代码中对所有的RAM都清零,51中也是对256个基本RAM清零,ARM要看对应的启动文件, ...

对编译器真是了解的不深入。51中也是对256个基本RAM清零,这意思是不是编译器在编译程序中加了一段清零的程序。

使用特权

评论回复
9
地瓜patch|  楼主 | 2015-2-3 18:51 | 只看该作者
i55 发表于 2015-2-3 16:39
当然是0,未初始化数据是bss段,都必须被清零。正规的编译器都是这样的。

想要不是零也可以,自己用汇编写 ...

自己用汇编写初始化代码‘’‘’这里指的汇编代码是编译器里的代码么?

使用特权

评论回复
10
玄德| | 2015-2-3 21:48 | 只看该作者
本帖最后由 玄德 于 2015-2-3 21:50 编辑
地瓜patch 发表于 2015-2-3 18:49
对编译器真是了解的不深入。51中也是对256个基本RAM清零,这意思是不是编译器在编译程序中加了一段清零的 ...

编译器在编译程序中加了一段清零的程序

不是这样的。
编译器赋0,只是出于仿真的需要,总要有个明确的数字,习惯上给出 0 这个值,并没有赋值的具体代码,
或者说,生成的用户代码里面,并不存在赋0的语句。
如果像 Verilog 那样存在 x 值。。。
所以,还是要自己老老实实初始化。


使用特权

评论回复
11
mcu5i51| | 2015-2-4 09:13 | 只看该作者
51片子比较简单,你打开 \Keil\C51\LIB,找到startxxx.A51,这就是启动代码,它处理MAIN之前的操作,最后跳到MAIN去;
51一般的清零是这一段

IF IDATALEN <> 0
                MOV     R0,#IDATALEN - 1
                CLR     A
IDATALOOP:      MOV     @R0,A
                DJNZ    R0,IDATALOOP
用R0从RAM最大值到0,全部清零
ARM中也是有启动文件的,不同的芯片和编译器都有自己的方法和设计;
我以前用过的一个51的C编译器会在程序尾加入一个while(1),总之,不要把一些东西交给编译工具,自己明确才好;
在C语言中,所谓的"事实胜于雄辩",不是写一段代码,输入和输出达到要求就行的,不同的C 工具可能结果并不相同;
一般常出问题的就是"结合","优先级"等,不要怕麻烦,自己加上括号,自己给定初始值,比什么都好;

使用特权

评论回复
12
地瓜patch|  楼主 | 2015-2-4 09:36 | 只看该作者
玄德 发表于 2015-2-3 21:48
编译器在编译程序中加了一段清零的程序

不是这样的。

谢谢,感觉你说的有点问题,你意思是debug的时候清零,release的时候不清令?

使用特权

评论回复
13
地瓜patch|  楼主 | 2015-2-4 10:35 | 只看该作者
mcu5i51 发表于 2015-2-4 09:13
51片子比较简单,你打开 \Keil\C51\LIB,找到startxxx.A51,这就是启动代码,它处理MAIN之前的操作,最后跳到MAI ...

谢谢指导,pic的编译器有好多好多,其实真不了解其中的差别

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:出一块TI-PLABS-AMP-EVM

1218

主题

11978

帖子

27

粉丝