OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
12
返回列表 发新帖
楼主: Pony279

不知有没有人对C++开发STM32感兴趣的,来讨论些问题

[复制链接]

4

主题

117

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2013-8-20
在线时间
0 小时
发表于 2013-12-31 21:08:36 | 显示全部楼层
C++的封装特性我是这样用的,写C时,外部使用的函数,我在.h中声明,外部不用的我在.c中头部声明,并且声明为static
正点原子逻辑分析仪DL16劲爆上市
回复 支持 反对

使用道具 举报

4

主题

117

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2013-8-20
在线时间
0 小时
发表于 2013-12-31 21:10:39 | 显示全部楼层
我的SPI声明(部分)
//初始化SPI
void SPI_Init(void** ppTHIS, u8 nSPIIndex);
//SPI速度设置
void SPI_SetSpeed(void* pTHIS, u8 SpeedSet);
//SPI读写一个字节
u8   SPI_ReadWriteByte(void* pTHIS, u8 TxData);
//SPI读写一组较短数据
void SPI_ReadWriteArray(void* pTHIS, u8* pData, u16 nLen);
回复 支持 反对

使用道具 举报

4

主题

117

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2013-8-20
在线时间
0 小时
发表于 2013-12-31 21:17:03 | 显示全部楼层
说明下pTHIS的构造思路:
首先,pTHIS对象对外是不透明的(黑盒子)
因为动态分配内存的问题,所以我是在SP_Init中分配给它的SPI_init(&spi, 1)   相当于  spi = new SPI(1)
在.c中给它分配实际的东西,我在SPI中,由于我SPI实际没有私有变量,所以Init中如下:
SPI_TypeDef* spi;
spi = SPI1;
*ppTHIS = spi;
在USART中则有比较复杂的私有变量,所以
static USART_OBJECT usart_object[USART_MAX_NUM];

USART_OBJECT *pObject;
pObject = &usart_object[usart_no-1];
*ppTHIS = pObject;

其中,usart_object中我在.c中定义的结构体
回复 支持 反对

使用道具 举报

4

主题

117

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2013-8-20
在线时间
0 小时
发表于 2013-12-31 21:23:37 | 显示全部楼层
C++的继承要用,就要改变方式了
你写一个usart.c是支持多个的
再写个usmart.c,是直接调用usart的(调试)
再写个gprs.c,也是直接调用usart的(GSM芯片的GPRS通讯)

那么你说你的c实现了类的继承,也可以说的,只是用得比较简单些

另外,用C++也好,用C#也好,在单片机里用,基本上以纯理论研究为更合适些,如果你在实际工程项目中完完全全地用,请三思
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2013-9-11
在线时间
2 小时
发表于 2014-1-1 08:18:30 | 显示全部楼层
感谢楼主的回帖,以及楼上细致的分析。
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2201
金钱
2201
注册时间
2012-2-8
在线时间
35 小时
 楼主| 发表于 2014-1-1 11:40:03 | 显示全部楼层
回复【50楼】lanny_cn:
---------------------------------
C++ 的 try catch 设计是非常值得吐槽的,在google C++ style中也没建议使用这个特性。
至于其他特性(标准C++里面定义的特性,不包括微软自己加的乱七八糟的那些),其实几乎是没有什么额外开销的。在需要的时候使用就可以。
话说回来,其实C++中大部分设计都是可以被吐槽的(可以google 出无数的文章讨论这些),例如运算符重载,又例如一个很矬很简陋的标准库设计,估计标准协会那帮人是想让C++什么都能做,结果到头来什么都不是。当然优点还是有的,C++里面最实用的东西可以说是RAII,直接简化了原本C语言里面需要手动释放资源的代码,这个问题JAVA都没办法解决,所以才有了finally。最失败的地方就是兼容了C语言,太多的历史包袱让这个语言停滞不前。
https://github.com/roxma
回复 支持 反对

使用道具 举报

4

主题

117

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2013-8-20
在线时间
0 小时
发表于 2014-1-1 12:04:13 | 显示全部楼层
回复【56楼】Pony279:
---------------------------------
C++不兼容C就是C#啦
单片机使用C++主要还是RAM问题,只要用到虚函数,就必须生成额外RAM空间,这个我觉得才是麻烦点,而虚函数是多态性的重要基石。
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2201
金钱
2201
注册时间
2012-2-8
在线时间
35 小时
 楼主| 发表于 2014-1-1 17:15:04 | 显示全部楼层
回复【57楼】lanny_cn:
---------------------------------
“就必须生成额外RAM空间”  就 RAM 开销来说,是每个带虚函数的对象增加 4 字节,不带虚函数的对象无开销,这个无所谓吧。。。ROM开销也是有的,但是很小。

补充,原理见 33 楼。
https://github.com/roxma
回复 支持 反对

使用道具 举报

1

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2016-8-9
在线时间
29 小时
发表于 2016-8-15 14:01:21 | 显示全部楼层
观望,观望
回复 支持 反对

使用道具 举报

1

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1183
金钱
1183
注册时间
2015-5-28
在线时间
149 小时
发表于 2016-8-15 16:14:50 | 显示全部楼层
我觉得对驱动和应用层进行分离,应用C++,驱动还是交给C做最好,最大的问题还是内存吧~有些MCU只有几K,运行C++力不从心啊~C++最大的意义还是面向对象吧,可以方便的设计出大的框架
回复 支持 反对

使用道具 举报

69

主题

495

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2197
金钱
2197
注册时间
2015-11-14
在线时间
542 小时
发表于 2016-9-10 18:00:28 | 显示全部楼层
吃饭没
回复 支持 反对

使用道具 举报

14

主题

62

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7773
金钱
7773
注册时间
2011-10-14
在线时间
708 小时
发表于 2016-9-11 10:27:24 | 显示全部楼层
学习了
回复 支持 反对

使用道具 举报

0

主题

125

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2728
金钱
2728
注册时间
2015-10-29
在线时间
428 小时
发表于 2016-9-11 11:26:54 | 显示全部楼层
都是大牛,受益了,这贴生存几年了,都没沉
回复 支持 反对

使用道具 举报

4

主题

211

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2600
金钱
2600
注册时间
2016-7-6
在线时间
546 小时
发表于 2016-9-12 00:11:01 | 显示全部楼层
都是大牛,受益了。搞得我都想去看看C++长什么样了!
把复杂的事,做简单!
回复 支持 反对

使用道具 举报

13

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2016-6-20
在线时间
121 小时
发表于 2016-9-12 08:02:52 | 显示全部楼层
厉害!!!
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2016-9-12
在线时间
8 小时
发表于 2016-11-8 17:18:03 | 显示全部楼层
本帖最后由 搞机不搞基 于 2016-11-8 17:20 编辑
正点原子 发表于 2012-3-9 17:27
看我们的usart.c就知道原因了.

原子哥,我用C++编写程序。在uart.h头文件加入了extern "C"那段代码,可是uart.c关于支持printf支持的一段函数总是报错,该如何解决呢?
捕获.PNG
回复 支持 反对

使用道具 举报

12

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2016-9-20
在线时间
56 小时
发表于 2016-11-8 17:21:47 | 显示全部楼层
这帖子没法收藏啊
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2016-8-10
在线时间
16 小时
发表于 2016-12-20 23:33:57 | 显示全部楼层
Pony279 发表于 2012-3-9 17:25
补充一下,以前用的是STM32最小系统板,照着不完全手册做,用printf函数的时候出了点问题,
百度后得知微 ...

有用过其他的编译器自定义bool数据类型也会报错(不是stm),后来我都不会把数据定义为bool
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2016-8-10
在线时间
16 小时
发表于 2016-12-20 23:37:17 | 显示全部楼层
学习了,在学校是也是主攻C++,很感兴趣也非常刻苦。后来出到单位用的全是C,C++也就落下了,但内心一直想把C++用回来
回复 支持 反对

使用道具 举报

18

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
177
金钱
177
注册时间
2014-4-18
在线时间
13 小时
发表于 2017-1-3 22:04:14 | 显示全部楼层
很好。。。
回复 支持 反对

使用道具 举报

0

主题

20

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
288
金钱
288
注册时间
2016-4-8
在线时间
51 小时
发表于 2017-1-5 23:02:00 | 显示全部楼层
路过景仰大神
回复 支持 反对

使用道具 举报

3

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2017-9-6
在线时间
45 小时
发表于 2018-7-24 17:01:08 | 显示全部楼层
Pony279 发表于 2012-10-17 20:17
回复【40楼】Tardis:
---------------------------------

没学过 C#,学过点 JAVA,感觉 J ...

好像支持STL库并不需要做特别的一些东西,引入头文件就可以了,之前在STM32上测试过STL的链表,发现效率很低,我的是原子F7板
回复 支持 反对

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3566
金钱
3566
注册时间
2016-1-8
在线时间
544 小时
发表于 2018-7-24 18:58:53 | 显示全部楼层
正点原子 发表于 2012-3-9 17:21
我也是学的c++.现在完全c了....
倒是c++还给老师了...

厉害。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 10:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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