打印

前一段时间所做的51程序的感想说一下

[复制链接]
2576|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
草履虫|  楼主 | 2010-3-27 22:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
写51程序大家现在都用KEIL。本人于硬件工程师,偶尔客串一下软件工程师。在这个过程中,发现一些软件工程师在写C51的时候的总是喜欢使用像ARM或X86的软件风格。在这里有些感想想和大家分享一上。
1. 在使用C51的时候,要对其使用器件的资源有所了解。SP指针一般情况下,需要重新设置,不能让系统自动设置,当时根据代码情况,需要进行调整,保证堆栈不能溢出。很多时候,代码本身并没有什么问题,程序跑着跑着就飞了,问题就是由于SP的设置引起的。
2. 全局变量,尽量不要在声明的时候赋值,并且并不是所有声名的全局变量都需要赋值。需要赋值的全局变量要通过函数赋值。说到这可能就会有人拍砖了。且往下看。KEIL编译器必竟是一个软件,只要是软件就有可能存在BUG。KEIL在编译的时候,会对一些内存和变量进行初始化。当你使用的大量的全局变量并且在声名的时候进行赋值的话,KEIL编译出来的初始化代码会增加,有时候会导致内存溢出,但编译器并不报任何错误。当烧录程序后,单片机就是不工作。使用软件和硬件仿真也是一样,程序会莫名其妙的跑飞了。当你把全局变量的初始化工作放到程序中去执行的话,可以解决这个问题。并且你的程序代码量会变少,不但节约了资源,也保证了系统的可靠性。
3. 尽量不要将一个复杂的计算用一条语句完成,而是要拆成多个。写程序大家都希望看上去完观,可读性好,但是常常事与愿违。写C51常常发生这类事故。计算前参与计算的所有变量的数据都是对的,而实际计算出来的结果确是错误的。这时候就需要考虑拆分计算。(注:这里说的情况是在没有数据类型错误的情况)

相关帖子

沙发
xwj| | 2010-3-27 23:05 | 只看该作者
极不赞同第一条,
第二、第三条虽然原因说的不是很对,但做法是对的。

使用特权

评论回复
板凳
草履虫|  楼主 | 2010-3-27 23:43 | 只看该作者
本帖最后由 草履虫 于 2010-3-27 23:47 编辑

#2 说一下看法,我要纠正我的理解。理不辩不明呀。
我在写c51的时候,一般根据中断和非中断函数,大致的判断一下,大概有多少变量会被压栈。
我这次和同事在做C51的时候,确实遇到了栈溢出的情况,设置一下SP后,程序就再也没有出过问题。请指教具体何原因。

使用特权

评论回复
地板
huangqi412| | 2010-3-28 00:10 | 只看该作者
:o  LS,应该了解编译器的习性,再在编写上遵循,而不是程序员去越权干涉编译器干的事情.  这样往往会很危险.

使用特权

评论回复
5
李冬发| | 2010-3-28 00:17 | 只看该作者
这点可别学热动力,寄存器不是那么好动的。

使用特权

评论回复
6
草履虫|  楼主 | 2010-3-28 12:36 | 只看该作者
大家是否会删除START.A51之个文件呢?

使用特权

评论回复
7
古道热肠| | 2010-3-28 15:52 | 只看该作者
堆栈在程序变量Data用到200以上时尤其要小心,如有可能,尽量将变量分配到XDATA吧。

使用特权

评论回复
8
ShakaLeo| | 2010-3-28 17:37 | 只看该作者
编写C程序的时候,SP指针的位置一般是编译器根据用户程序的内存使用情况来确定的,程序可不能随便改动SP。51由于RAM比较小,有可能遇到栈溢出,那是因为ram用量太大了,但改动SP不是解决办法。如果程序改动了SP,没出问题属于幸运,出了问题就属于正常了。

使用特权

评论回复
9
学海泛舟| | 2010-3-28 19:31 | 只看该作者
谢谢,学习了~~~~~~·

使用特权

评论回复
10
luck851| | 2010-3-28 20:20 | 只看该作者
mark

使用特权

评论回复
11
冷漠| | 2010-3-28 22:12 | 只看该作者
C编译器比程序员聪明多了,C是干什么的?不就是让程序员摆脱硬件之具体么?我从不需要知道SP在哪里,C编译器会比我安排的更紧凑、更合理。什么“共享与覆盖”、“什么什么管理”概念和技术,LS把编译器看的太简单了。

同意8楼,自己出的问题恐怕就是用户干涉硬件太多了吧,和编译器一起去管理SP,结果乱套了。不信把程序拿来大家看看,KEIL的编译器不会做的那么逊,比程序员还逊。

使用特权

评论回复
12
xiaomifan| | 2010-3-28 23:42 | 只看该作者
我的现在的目的是会编一般的程序,只有第二条有点用,其他也没感触

使用特权

评论回复
13
草履虫|  楼主 | 2010-3-31 00:28 | 只看该作者
对于干涉SP的问题. 个人感觉还要看所做的系统的需要. 有的时候, 就是要干涉编译器, 让它按照自已想要的方向进行编译. 至于要干涉到什么程序, 那只能看自已的需要.

使用特权

评论回复
14
ShakaLeo| | 2010-3-31 10:03 | 只看该作者
51单片机的栈空间是向上生长的,如果楼主想用改动SP指针的方法来避免栈溢出,就只能把SP往下移动。而对于keil来说,启动代码初始化的SP下面的区域是用户定义的变量,这么改动相当于用变量区域来作为栈空间使用,改动一些变量就有可能改动栈中的内容,改动栈中的内容后果是什么不用说了吧。

使用特权

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

本版积分规则

28

主题

489

帖子

0

粉丝