单片机初始化

[复制链接]
 楼主| h185540860 发表于 2012-11-21 21:44 | 显示全部楼层 |阅读模式
各位大虾:
     如定义变量为全局变量,单片机初始化时,会自动赋初值为0不?
                                                                 谢谢
NE5532 发表于 2012-11-21 21:55 | 显示全部楼层
有的编译器在Startup文件里做了变量区的清0,但是C的规范里没有任何规定要做清0动作,为了在编译器没有做这个工作的时候,你的程序不会倒霉,建议自己清。我们吃过这个亏的。
wookongbun 发表于 2012-11-21 22:00 | 显示全部楼层
查一下bss段就知道啦
huangxz 发表于 2012-11-21 22:40 | 显示全部楼层
各种编译器处理不太一样,如pic-c18编译器就分udata,idata,mdk里面就分bss,data,所以要想真正了解还需要看编译器说明书。
ayb_ice 发表于 2012-11-22 08:30 | 显示全部楼层
自己初始化吧,C51可以在启动文件配置
jlass 发表于 2012-11-22 08:50 | 显示全部楼层
自己初始化保险
zf_015820 发表于 2012-11-22 10:16 | 显示全部楼层
如果你是用汇编直接编写程序,就要自己清0了,因为,单片机复位时,并没有清0这个动作,其内部RAM是不确实状态,就说是:有可能是0,也有可能是其他数值;而且,汇编直接编写程序时,是直接面对单片机硬件的,故所有动作都是自己做的;但是,如果你用KEIL C语言的话,在其有一个启动配置文件:Startup.A51中,自动处理清0了;所以,你就不必担心了;总之:如果用面向机器类的语言编程,就必须自己处理所有相关的数据,比如清0,比如堆栈SP的处理,比如中断处理,都必须处理好,否则 ,会出现一些你想象不到的问题;如果是用高级语言,比如C语言或者说是用高级语言做的编译器,一般都会配置有这些启动文件,自动处理这些相关问题,而我们只需要考虑如何编写出高效、严谨的用户程序即可;呵,人个见解,希望能帮到你,共同进步
mlongze1206 发表于 2012-11-23 22:45 | 显示全部楼层
自己可以写个初始化包嘛,以后要用直接调用就可以,免得麻烦,io初始化还是蛮简单的。
dqyubsh 发表于 2012-11-23 22:51 | 显示全部楼层
不能懒到依赖编译器给你赋初值,如果哪天移植到其它编译器,你能保证它的死活吗?
blueshwu 发表于 2012-11-24 05:53 | 显示全部楼层
我的原则是保险起键,多写一句代码也累不死:-)
hdl551890 发表于 2012-11-24 09:59 | 显示全部楼层
自己写了 安心点
ohy3686 发表于 2012-11-26 09:56 | 显示全部楼层
视单片机不同而定。
一般情况下,不管系统默认如何,都应在自己在初始化程序里面设置初始值。
T_X_T 发表于 2012-11-26 11:07 | 显示全部楼层
自己初始化一下,也不麻烦
1638574407 发表于 2012-11-27 13:43 | 显示全部楼层
应该自己初始化,有时候程序会出错
zhang7676050 发表于 2012-12-6 14:20 | 显示全部楼层
自己初始化一下就好了
ytmpeigd 发表于 2012-12-7 17:51 | 显示全部楼层
自己清比较好哦,
这个不能懒。。。。
uet_cache 发表于 2012-12-7 19:34 | 显示全部楼层
赞同大家说法!
W_Controller 发表于 2012-12-8 08:11 | 显示全部楼层
很多资料都说C的全局变量是自动初始化为0,看来我对这个的认识还是不够。学习了
zwz7219 发表于 2012-12-8 11:54 | 显示全部楼层
这在每个编译器的实现上是不一样的,大多数清0,有的不清0,如合泰的C编译器(现在不知道怎么样),如果编译器存在这个动作,那么它会把没有明确赋初值的全局变量和局部静态变量清0。

但有时这个动作是不需要的,甚至是“有害”的,如有一个变量用于记录显示屏的开关状态(0表示关闭),如果在程序运行过程中,操作者打开了显示屏,但由于干扰程序跑飞导致看门狗复位,那么main函数之前的启动程序会对此变量清0,造成显示屏关闭,那就会造成程序逻辑混乱。这时编译器对此变量的默认清0动作就是“有害”的。

遇到这种情况,你可以通过关键字persistent(PICC编译器,其它编译器此关键字可能不同)明确地告诉编译器,启动时不要对此变量进行任何赋值操作。但在进入main函数后首先要做的事情就是做全局初始化,如各端口和模块的初始化,当然也包括了此类变量的初始化,在初始化前可以根据单片机寄存器中的某些位来判断本次启动是哪种类型的启动(如上电复位,低电压复位,看门狗复位等等)来确定是否要对此类变量进行初始化操作。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:http://www.hq173.com/index.html

9

主题

110

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部