76

帖子

0

TA的资源

一粒金砂(初级)

121
 
引用 113 楼 knate 的回复:

不错.这只不过是一些编程的规范化问题.是习惯问题不是编程水平.只不过是些放之天下皆准的习惯,说难听点只不过是照本宣读.
单片机编程的真正的水平应该是那些对硬件接口的操作.对可怜的有限ram和rom进行有效稳定的分配和操作.
什么模块化,可维护性,易读性,封装等等方面,就现在普遍的单片机编程人员来讲,应该都是知道的.知道是一回事,能不能用上就是另一回事.
有限的硬件较苛刻条件下,这些只能进行妥协.时间,空间,实时性,硬件稳定性,哪方面不需要考虑?
(遇到过rom差几行不够用的情况嘛?我朋友用的是汇编写的.弄得他整个项目代码估计30%重写,他工作时间不长,只不过5年尔尔.鄙人没有遇过,比较幸运,大部分项目可以自己定芯片型号^_^)


“不错.这只不过是一些编程的规范化问题.是习惯问题不是编程水平.只不过是些放之天下皆准的习惯,说难听点只不过是照本宣读.”
我之所以要把我写的代码贴上来就是不想泛泛而谈,那样很空洞没有说服力。难道knate对贴上来的代码视而不见吗?怎么就得出了个“照本宣科”的结论?

“什么模块化,可维护性,易读性,封装等等方面,就现在普遍的单片机编程人员来讲,应该都是知道的.知道是一回事,能不能用上就是另一回事.”
我想更主要的原因是“知道是一回事,想不想用上就是另一回事”吧?从来就不去考虑怎么可能做到呢?我也一再强调,程序的可读性、模块化等的实现很多时候是举手之劳的事情,不是需要考察调研最后费时费力完成的事情。难就难在是否有一根神经想着这件事。

“遇到过rom差几行不够用的情况嘛?我朋友用的是汇编写的.弄得他整个项目代码估计30%重写,他工作时间不长,只不过5年尔尔.”
这个例子可以说有说服力,也可以说很没有说服力。没有说服力的理由如下:
1、工作时间和工作能力一定是线性比例关系吗?5年的工作经验就说明他能配得上五年应有的工作能力吗?
2、汇编的代码一定就比c写的ram占用小、rom占用少、运行效率高吗?
3、他又重写了30%的代码说明了什么?恰恰说明了之前他的程序结构、模块化等的问题没有考虑好,而导致了最后不得不重写。重写了之后就可以用了,这恰恰又说明了程序的优化、重构是非常重要的,不可轻视
此帖出自编程基础论坛
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

122
 
引用 120 楼 goodboy2012 的回复:
思想是不错,不过不要为辩而辩啊,别人说的地方有很多是对的,没必要针锋相对。

谢谢提醒,大家有很多观念根深蒂固,想接受一个新的东西不是很容易啊。
此帖出自编程基础论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

123
 
mark】
此帖出自编程基础论坛
 
 
 

回复

51

帖子

0

TA的资源

一粒金砂(初级)

124
 
楼主写的很好,支持 。我理解lz的意思,我现在一直在做硬件,可能是我对软件比较热爱,以前也抱书啃过很多,我自己觉得lz的东西还是相当有用的 。但可能现实就是开发周期很短,大部分人都是先以完成项目为主,真正花的写程序上的时间相对来说是很少。
此帖出自编程基础论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

125
 
up
此帖出自编程基础论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

126
 
楼主很显然是做软件出身的。代码里透着很多面向对象的思想,把一件事情做成一个对象,对象上不同的动作代表了不同的步骤。但是不要忘了很多人事从硬件转到软件的,他们熟悉的是C语言,是面向过程的思想,就是把一件事情分成一个个的步骤,每个步骤用一段子程序实现。我想问楼主一个很现实问题,假如有一天你不在你现在这个公司干了,来了个新人,没有你这么好的软件底子,只有简单的面向过程的概念,他是否能很好的理解你的这些代码?就算能理解,你的这些思维会不会让他感到很别扭?我觉得吧,注释比代码本身更重要,单片机下的代码多是控制寄存器的,大家应该尽量多的写注释,让人知道你每一步都为什么会这样做。我也来贴段代码:
//--------------------------------------------
// 端口初始化程序
//  使能UART0功能:P0.4接TX0,P0.5接RX0,P0.4为推挽输出方式
//  P0.0为推挽输出方式,选择串口发射和接收端口
//  P1.2-P1.5推挽输出:分别控制触摸屏接口Y+,X-,Y-,X+开关的状态
//--------------------------------------------
void PORT_Init (void)
{
        P0MDIN = 0XFF;                                // p0口不配置为模拟输入
        P1MDIN = 0XFF;                                // P1口不配置为模拟输入
       
        P0MDOUT = 0X12; // P0.1(控制UART发送和接收位),P0.4(UART发送位)配置为推挽输出
        P1MDOUT = 0X3C;        // P1.2-P1.5配置为推挽输出,控制触摸屏接口开关状态
       
        P0SKIP = 0X00;
        P1SKIP = 0X00;  // P0,P1口不被交叉开关跳过
       
        XBR0 = 0X01;        // 使能UART0,TX0,RX0分别接到P0.4,P0.5
        XBR1 = 0X40;        // 交叉开关使能       
}
我相信,这样的代码,会比你的代码更能让一般人看懂,符合一般人的思维逻辑。你应该要想到,看你代码的人不仅你,也许还有公司的销售,公司的售后,接替你工作的从纯硬件做上来的那些人。
此帖出自编程基础论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

127
 
我觉得单片机的C也需要考虑代码重用。但是也必须考虑代码的空间。
此帖出自编程基础论坛
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

128
 
引用 108 楼 jiqiang01234 的回复:
引用 106 楼 ubiquitious 的回复:
引用 103 楼 jiqiang01234 的回复:
引用 98 楼 csz_cmy 的回复:
我要说LZ是嵌入式菜鸟,可能你不服.

我这里通篇都是在讨论单片机c程序该怎么写,根本就没有扩大到所谓的“嵌入式”。且不说单片机归类到嵌入式是否合适,从你的话中就看到你根本就没看我后面的讨论。

单片机绝对是嵌入式的一种。
嵌入式是分深嵌入还是浅嵌入的。
如果你对次还有怀疑,
那么我也有理由怀疑你是嵌入式的菜鸟。

“单片机绝对是嵌入式的一种。
嵌入式是分深嵌入还是浅嵌入的。
如果你对次还有怀疑,
那么我也有理由怀疑你是嵌入式的菜鸟。”

我之所以没有肯定地把“单片机”归类到“嵌入式”是因为目前对于单片机和嵌入式的关系还没有达到高度的认可,所以说的比较保守。而ubiquitious所说的“深嵌入”和“浅嵌入”还是第一次听说,然后我从google想查阅一下“深嵌入”和“浅嵌入”的定义,居然没有找到相关的内容。是google搜索的内容太少没有找到合适的东西,还是“深嵌入”和“浅嵌入”根本就是自造的词汇,我不得而知。
再次,请判断一件事情之前要有足够的把握,否则说话就不要太绝对。给自己留点后路。否则我也完全可以直接怀疑“你也是嵌入式的菜鸟”。





哈哈,用google搜不到的东西你就认为不存在吗?
在你眼中google是万能的造物主吗?
你不会也是那种离了google的copy & paste就不能写代码不能生存的所谓程序员吧。

这个提法不是我的创造。
如果你真正搞过嵌入式的东西,
或者看过嵌入式相关的好书你就会知道这到底意味着什么。
你看过的东西还是太少了,只追求语言指令级的技巧已经让你误入歧途了。
遗憾。
此帖出自编程基础论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

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

2、我见过这样的代码:

假设a,b都是unsigned char类型
C/C++ codeif(a>1&& a<=10)
{
    b=0;
}elseif(a>10&& a<=20)
{
    b=1;
}elseif(a>20&& a<=30)
{
    b=2;
}elseif(...)//N多个分支来判断   .
   .
   .
这样的代码看着着实不爽,可以优化吗?当然可以,优化如下:
C/C++ code#define RANGE_TABLE_SIZE 10//假设是十个判断分支
typedef unsignedchar BYTE;


typedefstruct tagRANGE
{
    BYTE nLower;
    BYTE nUpper;
}RANGE;

codeconst RANGE g_RangeTable[RANGE_TABLE_SIZE]=
{
{1,10},
{10,20},
{20,30},
...
};//下面为判断过程BYTE i=0;for(i=0; i< RANGE_TABLE_SIZE; i++)
{if(a> RangeTable.nLower&& a<= RangeTable. nUpper)
    {
        b= i;
    }
}
我实际测试了一下,改版之前足足用了147个字节,而改版后的只是70个字节。相差竟然有一倍之多。改变前看似铺天盖地的代码,其实是非常简单的逻辑。用了表格驱动法后,无论从代码量、可读性和可扩展性来说无疑提高了非常多。


这个除一下10取整会更少代码!
此帖出自编程基础论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

130
 
不赞同lz,我只是一名菜鸟,但是我也严格遵守代码的规范,但是写单片机的时候,发现很多规范到单片机的编译器上总是莫名其妙出问题,拿参数来说吧,似乎有的编译器根本就不支持传参,只能用全局变量来代替了
此帖出自编程基础论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

131
 
dsfsd
此帖出自编程基础论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

132
 
这么久,终于看完。
封装是一个基本常识,就是持反对态度的人,我觉得也得承认,你的汇编程序中也有类似函数的结构,LZ所说,只是封装层次不同而已。个人而言,特别讨厌那种变量漫天飞的程序,深受其害。
此帖出自编程基础论坛
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

133
 
up
此帖出自编程基础论坛
 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(初级)

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

2、我见过这样的代码:

假设a,b都是unsigned char类型
C/C++ codeif(a>1&& a<=10)
{
    b=0;
}elseif(a>10&& a<=20)
{
    b=1;
}elseif(a>20&& a<=30)
{
    b=2;
}elseif(...)//N多个分支来判断   .
   .
   .
这样的代码看着着实不爽,可以优化吗?当然可以,优化如下:
C/C++ code#define RANGE_TABLE_SIZE 10//假设是十个判断分支
typedef unsignedchar BYTE;


typedefstruct tagRANGE
{
    BYTE nLower;
    BYTE nUpper;
}RANGE;

codeconst RANGE g_RangeTable[RANGE_TABLE_SIZE]=
{
{1,10},
{10,20},
{20,30},
...
};//下面为判断过程BYTE i=0;for(i=0; i< RANGE_TABLE_SIZE; i++)
{if(a> RangeTable.nLower&& a<= RangeTable. nUpper)
    {
        b= i;
    }
}
我实际测试了一下,改版之前足足用了147个字节,而改版后的只是70个字节。相差竟然有一倍之多。改变前看似铺天盖地的代码,其实是非常简单的逻辑。用了表格驱动法后,无论从代码量、可读性和可扩展性来说无疑提高了非常多。

这个代码可不可以这样优化?
b=(a-1)/10;


此帖出自编程基础论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

135
 
这里好热闹,我是个菜鸟,在用汇编写程序,不知道是c好还是汇编好,老师都叫我们用汇编,还给了我们框架程序和最小系统,不知道c好还是汇编好,c都看不懂,
此帖出自编程基础论坛
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

136
 
关注。

做底层软件的人,比做windows下开发的人要有前途,工资要高得多。
此帖出自编程基础论坛
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

137
 
有道理,正在写单片机程序
此帖出自编程基础论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

138
 
我说的照本宣读的意思不是说你乱说什么的.而是指这只不过是编程基本规范化问题.基本任何语言都一样.算了,这不和你做什么口水之争.

函数传参的确是优雅.但是传递参数是使用存储器间接寻址的,而是全局变量基本是使用寄存器间接寻址,速度差异就不说了.
传参使用更多的ram(大量使用lcall/call)(全局变量是使用更多的rom存放指令)这哪更好不好讲,
这些差异都不提了,这不是最重要的.
重要的是全局变量的使用是可预知的(程序运行前已经分配好),使用传递参数那是不可预知的.在可怜的堆栈容量下,天知道堆栈在那么多参数传递时会出什么问题.(试过BT一下传递5个参数,几乎耗了我2组寄存器,呵呵,不敢想象以后如果反复调用的,平时我传递的寥寥可数--平台8位)

为了20-30字节重写30%代码.水平嘛,呵呵,可能我认识的那人很菜也说不准,呵呵,自己想想.

算了,我看LZ你越来越像为争而争.

PS:定时器可能我理解的和你或诸位的不一样.我写的定时器复用的比较多.自己要求较为严格.基本是精确的,至少也是2指令周期之内(仅考虑中断能马上响应情况下),而且软定时一份代码都写好几个.
此帖出自编程基础论坛
 
 
 

回复

92

帖子

0

TA的资源

一粒金砂(初级)

139
 
高级
此帖出自编程基础论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

140
 
硬件产品开发对软件要求不像纯软件开发那么严格。
此帖出自编程基础论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

猜你喜欢
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖直播:当AI遇见仿真,会有什么样的电子行业革新之路?
首场直播:Simcenter AI 赋能电子行业研发创新
直播时间:04月15日14:00-14:50

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 6

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表