不懂楼上的意思。能不能具体解释下“低级趣味”?
另强烈支持楼主前面的观点,做硬件的思想严重面对实现,对于封装理解太少。
点赞  2009-7-25 15:13
引用: 引用 18 楼 lbing7 的回复:
之前,学软件的不屑于写单片机上的程序

写单片机上的程序的工程师多都是做硬件出身

他们大多没有好的软件工程思想

像全局变量全局定义啥的那是很正常的事

呵呵,更别提代码重用了

再之一个,做硬件的思想向来也比较直接些,以实现为第一

所以这样的局面很正常


我算是一个另类吧,我的生活来源工作是些VC程序,业余写单片机程序。所以对国内单片机程序现状很是担忧,尤其是所谓的“教科书”根本就是在误人子弟。
点赞  2009-7-25 16:20
其实还有一个要考虑的问题

1K的ROM/RAM 通常来说要比2K的便宜

在PC层次的开发,大手大脚地用资源,一点都不心疼

但是,单片机层次的开发,产品以量的形态向外推

这样,硬件上省一块钱,一万台,一百万台

其节省的成本就不是一个小数目

点赞  2009-7-25 16:32
软件上的可维护,可重用,可读

这些东西基本上都是以损害资源为代价

在某些时候其实是不可取的

呵呵
点赞  2009-7-25 16:33
引用: 引用 20 楼 wangbinds 的回复:
不懂楼上的意思。能不能具体解释下“低级趣味”?
另强烈支持楼主前面的观点,做硬件的思想严重面对实现,对于封装理解太少。

总感觉纯做单片机的人更注重硬件相对可见性高的实现细节而往往忽视了软件这种比较抽象的东西。而程序其实往往是一个产品成功的关键。
我想还是视野开阔的问题,做单片机程序的视野往往停留在那些“教科书”或网上的那些经过“教科书”熏陶的代码


点赞  2009-7-25 16:36
引用: 引用 23 楼 lbing7 的回复:
软件上的可维护,可重用,可读

这些东西基本上都是以损害资源为代价

在某些时候其实是不可取的

呵呵


任何思想脱离了实际是没意义的。当前讨论的主题当然是在资源、性能、价格等多方因素下的一种折中。
在对极端苛刻的条件下当然得对很多东西进行妥协
点赞  2009-7-25 16:39
工程师不就是对各种设计进行权衡吗?

呵呵
点赞  2009-7-25 16:52
其实,还有一个很重要的问题忘了提及。那就是------优化。一个逻辑性很差的程序往往优化也不会高到哪里去。也就是说,一个较差的程序用模块化等思想再加上优化以后,不见得就比以前的rom占用多、ram占用大、速度慢。举几个例子吧:
1、对数组清零,我们可以写一个循环,也可以用memset()函数,但是性能差异可就差多了,无论从ram、rom和运行速度都是没法比的。

2、我见过这样的代码:

假设a,b都是unsigned char类型

  1. if(a > 1 && a <= 10)
  2. {
  3.     b = 0;
  4. }
  5. else if(a > 10 && a <= 20)
  6. {
  7.     b = 1;
  8. }
  9. else if(a > 20 && a <= 30)
  10. {
  11.     b = 2;
  12. }
  13. else if(...)//N多个分支来判断
  14.    .
  15.    .
  16.    .

这样的代码看着着实不爽,可以优化吗?当然可以,优化如下:

  1. #define RANGE_TABLE_SIZE 10  //假设是十个判断分支
  2. typedef unsigned char BYTE;


  3. typedef struct tagRANGE
  4. {
  5.     BYTE nLower;
  6.     BYTE nUpper;
  7. }RANGE;

  8. code const RANGE g_RangeTable[RANGE_TABLE_SIZE] =
  9. {
  10. {1, 10},
  11. {10, 20},
  12. {20, 30},
  13. ...
  14. };

  15. //下面为判断过程
  16. BYTE i = 0;
  17. for(i = 0; i < RANGE_TABLE_SIZE; i++)
  18. {
  19.     if(a > RangeTable[i].nLower && a <= RangeTable[i]. nUpper)
  20.     {
  21.         b = i;
  22.     }
  23. }


我实际测试了一下,改版之前足足用了147个字节,而改版后的只是70个字节。相差竟然有一倍之多。改变前看似铺天盖地的代码,其实是非常简单的逻辑。用了表格驱动法后,无论从代码量、可读性和可扩展性来说无疑提高了非常多。
点赞  2009-7-25 17:22
和LZ说一下,表驱动和IF-ELSE和SWITCH-CASE方式无关

这个个人觉得仅仅是技巧问题

呵呵

而且表驱动用在单纯的分支处理上,不管是从可读性还是维护性都不一定比IF-ELSE

当然,表驱动状态机在一般情况下是比分支语句处理的要漂亮些
点赞  2009-7-25 20:40
引用: 引用 28 楼 lbing7 的回复:
和LZ说一下,表驱动和IF-ELSE和SWITCH-CASE方式无关

这个个人觉得仅仅是技巧问题

呵呵


表驱动其实是面向对象里“多态”特性实现的基石,如果面向对象的多态特性都可以说是“仅仅是技巧”的话,我无话可说。
表驱动和IF-ELSE和SWITCH-CASE方式确实可以说无关,毕竟写程序依然可以各走各的路,可以不产生一丝一毫的联系。但,如果它们之间可以组合出更高效的行为,为什么不去用呢?
优化是一个很广泛的话题,有多方因素需要考虑,我们为什么要去限制自己的思路呢?
点赞  2009-7-25 20:49
引用: 引用 28 楼 lbing7 的回复:

而且表驱动用在单纯的分支处理上,不管是从可读性还是维护性都不一定比IF-ELSE

我举的那个用表驱动的例子是有些特性的,比如有明显的判断关系,很有规律可循。我仅仅使用这个比较有代表性的例子来说明一下表驱动的好处。可并没有想把所有if-else及switch-case语句全部用表驱动来代替。存在就是合理的,既然c语言有这么多关键字,那一定就有适用它们使用的地方,不可极端处理,即使是令人诟病的goto语句。
点赞  2009-7-25 20:55
hao好 我下学期就学了 我回好好看看的
点赞  2009-7-25 21:09
飘过~~~~~
点赞  2009-7-25 21:13
个人觉得面向对象的设计思想在实时性上比较差。
点赞  2009-7-25 21:23
点赞  2009-7-25 21:24
lbing7说得有道理,很多学单片机的本来都是搞硬件的,可能连C都不大会,怎么可能去让他去搞代码。单片机程序最重要的是稳定性,即使代码看上去好看了,调试起来更麻烦也会令人头疼。
点赞  2009-7-25 21:37
引用: 引用 33 楼 goodboy2012 的回复:
个人觉得面向对象的设计思想在实时性上比较差。

面向对象包括三方面的内容:封装、继承和多态。而我提倡的单片机c语言编程是鼓励“封装”,使之更具模块化。其实继承和多态也并非就是“实时性”差,只是相对于单片机资源来说比较费ram和rom。毕竟单片机还很少有支持c++的,51系列的我是闻所未闻。

从面向对象思想出现的历史中我们也可以看到,是因为当程序规模超过10万行以上时,面向过程的方法就有些难于应对了,这样才慢慢出现了面向对象的设计方法。要注意的一点是,面向对象的设计方法更适用于“规模大”的程序,而单片机程序就算用64k的rom也就是一万多行。任何技术都有它的适用范围,切不可乱用。
点赞  2009-7-25 21:42
引用: 引用 35 楼 goodboy2012 的回复:
lbing7说得有道理,很多学单片机的本来都是搞硬件的,可能连C都不大会,怎么可能去让他去搞代码单片机程序最重要的是稳定性,即使代码看上去好看了,调试起来更麻烦也会令人头疼。


我想或许有些人对我的观点理解有失偏颇,我在这里明确一下:
1、写程序第一是给人看的,然后才是给机器看的。
2、写程序稳定性、正确性是第相对于运行速度是第一位的
3、在满足稳定性、正确性、芯片性价比等多方面制约因素的前提下,程序的复用性、可扩展性、可读性必须要考虑。难道所有程序写一次以后再也不需要修改,再也不需要别人来维护?

“好代码”是满足多方要求的代码(就如我上面第三点中提到的那些要求)可并非仅仅是“看上去好”,我想goodboy2012的理解有些不妥。

既然已经自己都很明白是从硬件出身,写程序是弱项,为什么不迎头赶上?却把弱项当理由?(别告诉我时间不够用,没时间学习)
点赞  2009-7-25 21:56
好东西,学习下
点赞  2009-7-25 21:57
引用: 引用 36 楼 jiqiang01234 的回复:
引用 33 楼 goodboy2012 的回复:
个人觉得面向对象的设计思想在实时性上比较差。

面向对象包括三方面的内容:封装、继承和多态。而我提倡的单片机c语言编程是鼓励“封装”,使之更具模块化。其实继承和多态也并非就是“实时性”差,只是相对于单片机资源来说比较费ram和rom。毕竟单片机还很少有支持c++的,51系列的我是闻所未闻。

从面向对象思想出现的历史中我们也可以看到,是因为当程序规模超过10万行以上时,面向过程的方法就有些难于应对了,这样才慢慢出现了面向对象的设计方法。要注意的一点是,面向对象的设计方法更适用于“规模大”的程序,而单片机程序就算用64k的rom也就是一万多行。任何技术都有它的适用范围,切不可乱用。


LZ你有点小看编译器了,我们以前写协议的时候

四五W行代码才二十多K,嘿嘿,64K还是相当大的空间的

不信你看一下当前流行的单片机,没有多少是有64K的ROM的

另外,提一个:不是单片机支持语言

面是IDE和相关的平台支持

因为,不论什么机器,至少当前,机器只认0和1

不论什么语言最终到机器层面都是机器指令

语言层次的提高带来了对程序员来说更加友好的接口

让他们可以从更高的层次去看机器

ASM就不说了

C带来了函数,函数的调用会在栈上产生消耗

后面的面向对象语言的特性带来的是什么?

为了支持对象,让机器多去处理怎么去调用哪个函数

而这个是不可预知的

如果是一个对时间要求严格的系统,这将是灾难性的

其实,前些天一些大哥就在坛子里说KEIL已经支持CPP

至于别的支持面向对象的平台,你可以看一下IAR,在430上我试过丫的CPP(仅是试过)

相信丫8051上也有

对于代码量,不知道LZ是不是真的敲过上W行的代码(不在IDE的帮助下)

当然,我支持用面向对象的方法来规划设计系统

但是,真正编码的时候,只要架构上清晰。

一个只有一年多经验的工程师也是不会出现所谓混乱

之前看软工的书的时候,印象我也见到过说10W行代码可怕

不过实践告诉我,这个分水岭并不是绝对的。
点赞  2009-7-25 22:16
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复