打印

单片机初始化

[复制链接]
4230|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
h185540860|  楼主 | 2012-11-21 21:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
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,所以要想真正了解还需要看编译器说明书。

使用特权

评论回复
5
ayb_ice| | 2012-11-22 08:30 | 只看该作者
自己初始化吧,C51可以在启动文件配置

使用特权

评论回复
6
jlass| | 2012-11-22 08:50 | 只看该作者
自己初始化保险

使用特权

评论回复
7
zf_015820| | 2012-11-22 10:16 | 只看该作者
如果你是用汇编直接编写程序,就要自己清0了,因为,单片机复位时,并没有清0这个动作,其内部RAM是不确实状态,就说是:有可能是0,也有可能是其他数值;而且,汇编直接编写程序时,是直接面对单片机硬件的,故所有动作都是自己做的;但是,如果你用KEIL C语言的话,在其有一个启动配置文件:Startup.A51中,自动处理清0了;所以,你就不必担心了;总之:如果用面向机器类的语言编程,就必须自己处理所有相关的数据,比如清0,比如堆栈SP的处理,比如中断处理,都必须处理好,否则 ,会出现一些你想象不到的问题;如果是用高级语言,比如C语言或者说是用高级语言做的编译器,一般都会配置有这些启动文件,自动处理这些相关问题,而我们只需要考虑如何编写出高效、严谨的用户程序即可;呵,人个见解,希望能帮到你,共同进步

使用特权

评论回复
8
mlongze1206| | 2012-11-23 22:45 | 只看该作者
自己可以写个初始化包嘛,以后要用直接调用就可以,免得麻烦,io初始化还是蛮简单的。

使用特权

评论回复
9
dqyubsh| | 2012-11-23 22:51 | 只看该作者
不能懒到依赖编译器给你赋初值,如果哪天移植到其它编译器,你能保证它的死活吗?

使用特权

评论回复
10
blueshwu| | 2012-11-24 05:53 | 只看该作者
我的原则是保险起键,多写一句代码也累不死:-)

使用特权

评论回复
11
hdl551890| | 2012-11-24 09:59 | 只看该作者
自己写了 安心点

使用特权

评论回复
12
ohy3686| | 2012-11-26 09:56 | 只看该作者
视单片机不同而定。
一般情况下,不管系统默认如何,都应在自己在初始化程序里面设置初始值。

使用特权

评论回复
13
T_X_T| | 2012-11-26 11:07 | 只看该作者
自己初始化一下,也不麻烦

使用特权

评论回复
14
1638574407| | 2012-11-27 13:43 | 只看该作者
应该自己初始化,有时候程序会出错

使用特权

评论回复
15
zhang7676050| | 2012-12-6 14:20 | 只看该作者
自己初始化一下就好了

使用特权

评论回复
16
ytmpeigd| | 2012-12-7 17:51 | 只看该作者
自己清比较好哦,
这个不能懒。。。。

使用特权

评论回复
17
uet_cache| | 2012-12-7 19:34 | 只看该作者
赞同大家说法!

使用特权

评论回复
18
W_Controller| | 2012-12-8 08:11 | 只看该作者
很多资料都说C的全局变量是自动初始化为0,看来我对这个的认识还是不够。学习了

使用特权

评论回复
19
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

粉丝