找回密码
 FreeOZ用户注册
查看: 4007|回复: 28
打印 上一主题 下一主题

[论坛技术] 将c++应用于单片机的体会

[复制链接]
跳转到指定楼层
1#
发表于 18-3-2010 13:25:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?FreeOZ用户注册

x
因为俺的工作是单片机,最近又学习了c++,所以最近尝试将c++应用于单片机开发。

基本思想是将单片机上各硬件资源都抽象为class,比如将i/o口抽象成一个base class,然后具体单片机上的每个实际的i/o口,就继承自这个base class。一些通用功能,比如键盘矩阵扫描,就可以通过polymorphism机制,适用于各个i/o口。

经过尝试,想法是可行的,但是现在的问题是代码效率问题。比如目的是向i/o口写入一个值,在汇编中只需要1条语句,但如果要实现polymorphism特性,相应的over head使得这个操作的代码量变成了10条语句左右。

我做了一个小程序,读写i/o口,直接操作i/o口的话,大概只需要50字节的代码量,但如果使用多态性(polymorphism是叫多态性吧?),一下就变成了600多字节。

lowend的单片机的rom空间基本在1-4k,似乎这种开销有点吃不消,不过,对于高端的单片机,rom在几十k的,我想c++所带来的好处就超过了这些负面因素了。
回复  

使用道具 举报

2#
发表于 18-3-2010 13:45:51 | 只看该作者

回复 #1 四香油饼 的帖子

单片机的很多操作实时性要求很高,我也担心C++的效率影响实时性,而且移植到不同的单片机上,也是一个问题。

但是用过高级语言之后,确实不想写汇编,除非是万不得已(需要高效运算的时候)。

我认为c是c++和asm之间的一个balance,更适合在单片机上开发所用。
回复  

使用道具 举报

3#
发表于 19-3-2010 01:11:11 | 只看该作者

回复 #1 四香油饼 的帖子

4k左右的单片机初始化一下就差不多没空间了吧?

我觉得在大点的系统里面,单片机可以用来传送数据给PC+做简单的逻辑控制,之后的信号处理和核心控制全部由PC完成,这样单片机上用C,PC上用Java,就是很完美的结合了
回复  

使用道具 举报

4#
 楼主| 发表于 19-3-2010 11:09:39 | 只看该作者
跟编译器的质量有很大关系,昨天另外用一个好点的编译器重新编译了一下后,就只有300多字节了。

其实这300多字节,基本是一次性的开销,我将在这个project中坚持使用c++,看看到底能不能完成任务。我选用的单片机型号的ROM容量是2K。

c++编程的好处不言而喻,而且现在高端的单片机和低端的arm界限已经比较模糊,ROM容量在几十K到几百K之间,c++绝对大有用武之地。
回复  

使用道具 举报

5#
发表于 19-3-2010 12:15:37 | 只看该作者
用C吧,C++编译出来的东西肯定大,C有时候基本和ASM没多少区别,我们设备容量比拟大多了,也不用C++,可能在高端一些的智能系统才要用,尤其是驱动程序,别费心思搞C++,本来也不需要把简单的事情复杂化,用C写完接口,给应用层的C++程序调用就好了。
回复  

使用道具 举报

6#
 楼主| 发表于 19-3-2010 13:00:41 | 只看该作者
我还是坚持我的看法,c++之所以大,是因为带来了额外的好处。在对容量要求不是很严格的地方,我觉得还是值得的。
回复  

使用道具 举报

7#
发表于 19-3-2010 14:30:29 | 只看该作者
其实c也可以写出很好的面向对象的程序,就是难些,所以出来了c++.
好的编译器可以把c代码编的比汇编还要小。前提是汇编技巧不足。
C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, it blows away your whole leg. --Bjarne Stroustrup

[ 本帖最后由 kukri 于 19-3-2010 14:37 编辑 ]
回复  

使用道具 举报

8#
发表于 19-3-2010 23:35:11 | 只看该作者
油饼哥能介绍我进你们公司吗?我就在一个芯片公司写c++芯片开发工具
我们一般还是用汇编写硬件接口的宏指令,c++通过编译器调用这些宏指令。c++好像也能直接编译成汇编的,但是需要手动去精简
回复  

使用道具 举报

9#
 楼主| 发表于 20-3-2010 11:19:32 | 只看该作者
原帖由 蒙面超人 于 19-3-2010 23:35 发表
油饼哥能介绍我进你们公司吗?我就在一个芯片公司写c++芯片开发工具
我们一般还是用汇编写硬件接口的宏指令,c++通过编译器调用这些宏指令。c++好像也能直接编译成汇编的,但是需要手动去精简


真的呀,那我还想去你们公司呢  你再什么公司阿?

评分

参与人数 1威望 +30 收起 理由
蒙面超人 + 30 在国内,你有兴趣?嘿嘿

查看全部评分

回复  

使用道具 举报

10#
发表于 20-3-2010 12:34:36 | 只看该作者
提示: 作者被禁止或删除, 无法发言
据我所知有些SOC(System On Chip)的COS(Chip Operation System)代码目前还用汇编写,开发工作量十分大。但是代码效率很高,占用系统程序区存储空间小。
SOC专用芯片中存储器的面积大概是整个芯片面积的三分之二左右,所以节省了存储器面积即可以有效的减少芯片面积,芯片的面积减少就是减少芯片的制造成本。
还有些专门的工作人员专门负责把C/C++代码人工翻译成汇编代码以增加代码效率,这也是十分繁琐的工作。
所以对于存储空间比较敏感的项目,用汇编或者C还是主流

[ 本帖最后由 horseman98 于 20-3-2010 12:44 编辑 ]
回复  

使用道具 举报

11#
发表于 20-3-2010 15:26:56 | 只看该作者
这要看到底要干什么了
我一般不用汇编写GUI
也不要用c++写驱动了
回复  

使用道具 举报

12#
发表于 20-3-2010 17:32:56 | 只看该作者
这么多单片机高手啊!
幸会!!

搞单片机开发,我还是喜欢汇编。因为我的项目多是控制温度,压力,速度,位移等,没有像手机一样的人机界面。而且我已经积累了很多可用程序模块,也没感觉开发进度慢。51,98,PIC,AVR,MSP430,ARM等汇编学好一个后再学第二个就很容易。

虽然说C语言的容易移植,但也确实存在编译效率问题。有些我用汇编很容易实现的功能,当我用C来实现时确发现很困难。所以,较好的方法是用C调用汇编。

评分

参与人数 2威望 +60 收起 理由
ubuntuhk + 30 谢谢分享!
蒙面超人 + 30 你太有才了!

查看全部评分

回复  

使用道具 举报

13#
发表于 20-3-2010 20:49:40 | 只看该作者
我开发单片机十几年了, 从来只用C和ASM语言, 个人觉得C++效率太低了.

换一个角度来看, LZ你自己觉得什么时候会碰到不同平台的代码移植呢?

即使真的要代码移植,一个良好架构的C代码也很容易啊.
回复  

使用道具 举报

14#
发表于 26-3-2010 12:19:58 | 只看该作者
看来单片机同行也有不少啊。
俺主要在PIC、AVR、430、STM32、小AMR7上做东西,主要就是C,除了极其个别的模块用汇编写(对时间有要求的),然后用C调用汇编。
自从俺8年前在AVR上搭出了个草台子,这么多年来,公司的产品有一半都是修修改改做出来的,模块也是积累的越来越多,很多产品的程序都是搬一些底层的程序过来,再找一个功能类似的主程序,把界面部分改改就完成了。
回复  

使用道具 举报

15#
发表于 26-3-2010 12:39:23 | 只看该作者
所以说要在适当的场合用适当的工具做适当的事情。
除非自己学着玩,不用考虑那么多。
回复  

使用道具 举报

16#
发表于 26-3-2010 13:24:25 | 只看该作者
用.net的无视程序存储空间男飘过  
回复  

使用道具 举报

17#
 楼主| 发表于 26-7-2010 15:23:02 | 只看该作者
报告大家一个好消息,我将c++应用于单片机取得成功!

在最新的一个项目中,两个独立的MCU均采用纯C++编程,已经开发完成。两个MCU均为MSP430系列,最后的程序大小,一个约1.3k, 一个约2k。最后程序虽不大,但基本上使用到了芯片上的所有资源: 计时器,外部中断,a/d,pwm,SPI, UART, selfprogramming 等等。实践证明使用c++的效率一点也不比c差。

通过这次实践,也基本上从无到有,摸索出了将c++应用在单片机编程的方法。网上还很少见将c++应用于单片机编程的文章,俺是不是一不小心又走在了时代的前面啊 ,大言不惭一下。

应用到的c++特性包括继承和虚函数,但模板没有用,因为embedded c++不支持模板,还有标准库函数也没用到,俺的理解,在单片机应用中,库函数基本不太适合,因为空间太有限了,而且单片机所要处理的任务也相对简单。

评分

参与人数 2威望 +60 收起 理由
ubuntuhk + 30 你太有才了!
coredump + 30 恭喜你!

查看全部评分

回复  

使用道具 举报

18#
发表于 26-7-2010 17:56:05 | 只看该作者
祝贺 四香油饼。
能不能把平台,开发工具等等,详细介绍一下阿,学习学习。
回复  

使用道具 举报

19#
 楼主| 发表于 26-7-2010 17:59:00 | 只看该作者
原帖由 GPS 于 26-7-2010 16:56 发表
祝贺 四香油饼。
能不能把平台,开发工具等等,详细介绍一下阿,学习学习。


开发平台是IAR WORKBENCH FOR MSP430, 再有就是TI的仿真器,没别的了.
回复  

使用道具 举报

20#
发表于 28-7-2010 13:35:45 | 只看该作者
油饼哥现在在澳洲还是国内啊?你是自己做实验还是公司的项目?
回复  

使用道具 举报

21#
 楼主| 发表于 28-7-2010 13:55:57 | 只看该作者
原帖由 janova 于 28-7-2010 12:35 发表
油饼哥现在在澳洲还是国内啊?你是自己做实验还是公司的项目?


在澳洲。是俺的私活

评分

参与人数 1威望 +20 收起 理由
trisun + 20 你太有才了!

查看全部评分

回复  

使用道具 举报

22#
发表于 28-7-2010 15:01:47 | 只看该作者
澳洲嵌入式/单片机类的工作很难找吧?能不能大概介绍一下情况和就业前景,因为小弟目前也是从事该行业,但正犹豫要不要往上层软件(c++甚至java)转一转,还是说继续深化这方面的经验比较好?多谢啦!

[ 本帖最后由 janova 于 28-7-2010 14:09 编辑 ]
回复  

使用道具 举报

23#
发表于 28-7-2010 15:23:45 | 只看该作者
原帖由 四香油饼 于 28-7-2010 12:55 发表


在澳洲。是俺的私活


在这儿还能找到这种私活 ,做板子怎么办呢?
我在国内找人做板子,也是单片机,在做一个GPS跟踪器,然后带过来。
回复  

使用道具 举报

24#
 楼主| 发表于 29-7-2010 10:51:32 | 只看该作者
原帖由 janova 于 28-7-2010 14:01 发表
澳洲嵌入式/单片机类的工作很难找吧?能不能大概介绍一下情况和就业前景,因为小弟目前也是从事该行业,但正犹豫要不要往上层软件(c++甚至java)转一转,还是说继续深化这方面的经验比较好?多谢啦!


说实在的不是特清楚。因为我没跳过槽。不过我认识一个哥们做嵌入式linux的,先找了个ad的工作,后来又找回悉尼去了,似乎还挺好找的。
回复  

使用道具 举报

25#
 楼主| 发表于 29-7-2010 10:52:36 | 只看该作者
原帖由 trisun 于 28-7-2010 14:23 发表


在这儿还能找到这种私活 ,做板子怎么办呢?
我在国内找人做板子,也是单片机,在做一个GPS跟踪器,然后带过来。


反正我们公司的电路板都是在中国做的
回复  

使用道具 举报

26#
发表于 29-7-2010 13:03:48 | 只看该作者
做电路板也容易,价格也不贵,也可以直接找国内的厂家做完,发货过来
回复  

使用道具 举报

27#
 楼主| 发表于 29-7-2010 13:37:44 | 只看该作者
原帖由 wishpolo 于 29-7-2010 12:03 发表
做电路板也容易,价格也不贵,也可以直接找国内的厂家做完,发货过来


能提供点更详细的信息不?
回复  

使用道具 举报

28#
发表于 29-7-2010 14:28:21 | 只看该作者

回复 #27 四香油饼 的帖子

国内的你可以看看www.fast-pcb.com 找他们做过一次,还不错,数量多少都给做

澳洲本土的
Entech ( www.entechelectronics.com.au),在SA,Entech做过一次,双面板$275+GST
还有www.pcbco.com.au,在VIC

评分

参与人数 2威望 +99 收起 理由
trisun + 50 谢谢分享!
四香油饼 + 49 谢谢分享!非常有用

查看全部评分

回复  

使用道具 举报

29#
发表于 29-7-2010 15:40:57 | 只看该作者
程序大小不是问题,可以外置存储器来扩展。
问题在编译器上,编译出来的硬件操作代码会比较复杂,导致硬件操作时间过长,很多器件的操作有严格的时间限制,这样的情况下还是要嵌入汇编程序。
回复  

使用道具 举报

您需要登录后才可以回帖 登录 | FreeOZ用户注册

本版积分规则

小黑屋|手机版|Archiver|FreeOZ论坛

GMT+11, 25-11-2025 10:43 , Processed in 0.032926 second(s), 48 queries , Gzip On, Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表