OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 12815|回复: 62

在51和STM32单片机上使用面向对象的编程,第一篇:炫酷地点亮一盏LED灯。。持续更新!!

[复制链接]

8

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2018-5-2
在线时间
83 小时
发表于 2018-5-2 16:17:45 | 显示全部楼层 |阅读模式
本帖最后由 safu枫 于 2018-5-7 10:51 编辑

第一篇:炫酷地点亮一盏LED灯

我们学单片机,第一个程序就是点亮一盏LED灯,那么我单片机开启面向对象方式的第一步也是点亮一盏LED灯,这里主要是用到了继承和封装的2个概念;

这里我们先讲一下,使用传统的一些LED操作,并分析这些操作有什么问题:

以前我点亮一盏LED是这样的


1:我每增加一个灯,就要写一段LED初始化代码,要定义一个端口;

[mw_shl_code=c,true]#define LED1 PAout(1)
#define LED_ON  1
#define LED_OFF 0
void LED1_Init()
{
   ......;//初始化IO口之类的函数
}
LED1 = LED_ON; //点亮[/mw_shl_code]

2:我要实现LED功能的拓展不方便,比如我要实现LED的闪烁;


------------------------------------------------------------------------------------------

所以我现在这样点亮一盏LED灯,以及让它闪烁起来

首先创建一个结构体,或者我们叫做 定义一个 LED类

[mw_shl_code=c,true]typedef struct CLASS_LED
{   
  void  (* const  SetLedGPIOCMD)(struct CLASS_LED * p, GPIO_TypeDef* GPIOx, u16 GPIO_Pin);  //设置LED端口
  void  (* const  LED_SetST)(struct CLASS_LED * p,u8 LED_ST);   
  //struct CLASS_LEDBlink * LEDBlink;  //这里是继承了 LED闪烁类,我们下面再来编写,先不看,有需要详细了解的朋友,可以下载工程文件查看源码
  GPIO_TypeDef* _GPIOx;  //LED端口
  u16 _GPIO_Pin;         //LED端口
  u8 _LED_ST; //记录LED灯当前的状态
}typ_CLASS_LED;[/mw_shl_code]

  

然后我们来编写相关的函数


[mw_shl_code=c,true]void  SetLedGPIOCMD(struct CLASS_LED * p, GPIO_TypeDef* GPIOx, u16 GPIO_Pin) //初始化LED指定的端口
{
  GPIO_InitTypeDef GPIO_InitStructure;

  GPIO_InitStructure.GPIO_Pin  = GPIO_Pin ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOx, &GPIO_InitStructure);
  
  p->_GPIOx = GPIOx;
  p->_GPIO_Pin = GPIO_Pin;
}

void  LED_SetST(struct CLASS_LED * p,u8 LED_ST)
{
  switch(LED_ST)
  {
    case LED_ON:
      GPIO_ResetBits(p->_GPIOx, p->_GPIO_Pin);
      break;
    case LED_OFF:
      GPIO_SetBits(p->_GPIOx, p->_GPIO_Pin);
      break;
    case LED_RE:
      GPIO_WriteBit(p->_GPIOx, p->_GPIO_Pin,!GPIO_ReadOutputDataBit(p->_GPIOx, p->_GPIO_Pin));
    default:
      break;
  }
}  [/mw_shl_code]



然后我们来定义一个宏定义,来给这个结构体赋值(面向对象里面叫实例化这个类)

[mw_shl_code=c,true]#define NewLed()    {            \
  SetLedGPIOCMD,                 \    //这里我们把上面定义的函数名赋值过来,也就是 赋值函数指针
  LED_SetST,                     \
  NULL,                          \
  0,                             \
  0,                              \
  0\
} [/mw_shl_code]

好了,这些我们就来创建(实例化)这个LED对象,以及操作它

[mw_shl_code=c,true]typ_CLASS_LED  led0 = NewLed();  //创建了一个led0的对象
led0.SetLedGPIOCMD(&led0, GPIOB, GPIO_Pin_5); //设置指定的端口,这样是不是很方便,不用重新去写了,这就是面向对象的一个思维,把很类似的代码提取出来,减少代码的重复率
led0.LED_SetST(&led0,LED_ON);//点亮led0, 这样逻辑是不是很清楚,而且你想要增加功能,就往结构体里面增加相关的方法,比如你可以增加blink功能[/mw_shl_code]


好了,这下我们就完成了点亮一盏LED灯,虽然代码量比传统的大了很多,一开始也会觉得比较复杂,但是你想一下 我们以后这样操作就可以了,想要增加一个LED,只要定义一个LED对象,然后指定其端口就可以随意操作了(比较起来,好像传统的方式也可以,但是这主要是一个思维上的进步,这里的进步主要体现在封装的概念,而且你要想拓展都很方便,而且逻辑很清楚),在实际的工程中,功能增加了很多,比如继承了led_blink类,比如使用了链表结构


第一篇,写的很多地方可能不是很清楚,以后尽量把它理顺吧。。。有兴趣的请看源码工程,我随后上传。。。里面有操作说明和相关注释,有什么问题欢迎交流

看到下面的评论有很多朋友支持,当然也有部分朋友持反对意见,这里还是谢谢大家的意见。。

我这里只是把这种思路和编程方式分享给大家,另外这种思路也不是完全由我原创,我也是从书上学来的。。。

我看了下大家的意见,持反对意见的可能认为这种方式

1:内存开销大,对性能有影响(这里我觉得 保持这种思路,在代码实现上还是可以尽可能的优化,比如我把这些代码移植到51上我会做一些修改以适应51)

2:认为嵌套啊,函数啊,结构体啊,过于繁杂,反而失去了C的简洁(这里可能新手或者对面向对象思维理解不深的人,会为了用而用,而不是为了实际需要,所以实际项目还是得灵活使用)

3:。。。我也不知道为什么、、还是希望持反对意见的朋友能提出你详细的原因

持赞同意见的朋友:

1:封装好,逻辑结构清楚,维护方便,代码易读

开篇传送门,有推荐书籍:http://www.openedv.com/forum.php?mod=viewthread&tid=270535&extra=  

在51和STM32单片机上使用面向对象的编程,第二篇:强大的按键

http://www.openedv.com/forum.php?mod=viewthread&tid=270631&extra=

在51和STM32单片机上使用面向对象的编程,第三篇:按键控制开灯关灯也能爆炸

http://www.openedv.com/thread-270786-1-1.html




LED.rar

5.33 MB, 下载次数: 313

第一篇

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2018-5-2
在线时间
4 小时
发表于 2018-5-2 16:48:15 | 显示全部楼层
这种思维方式应该尽快抛弃,往往在你做得很完美的时候,客户就会来一个180大转变,你之前做的会全部白费掉。
回复 支持 0 反对 3

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2018-5-2
在线时间
4 小时
发表于 2018-5-2 16:57:27 | 显示全部楼层
你要是不想公司的人把你的程序看得这么明白,可以封装成lib,留出个头让人家改,这样反而更好。
回复 支持 0 反对 2

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2018-5-2
在线时间
4 小时
发表于 2018-5-2 16:56:07 | 显示全部楼层
我劝你一句别再往下搞,你这样会搞死接手你项目的人的,我现在就是一个受害者,好好一个库函数,被套上套,再套上套,然后无限多的条件编译,这样要是出一个什么问题,除了程序的主人,别人要修改的时候会想把你杀了。
回复 支持 0 反对 2

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2019-4-18
在线时间
10 小时
发表于 2019-11-23 01:13:41 来自手机 | 显示全部楼层
支持楼主,我最近也在研究这个东西,一直觉自己的代码不够美感觉乱糟糟的,而最近刚好想学设备框架下的驱动编写,看了rtt的驱动代码刚开始很懵逼,不知道为何要写得那么绕,这样写的好处是什么,于是就带着疑问去网上查,原来是采用了这种类oop的设计模式。稍微看了下c++ 的面相对象程序,用C模拟是有点麻烦,但不可否认它是很好的设计思想,要不然那些rtt,linux的驱动代码就不会用这种设计模式了。今晚无意间看到你的帖子(因为我在查这方面的资料),帖子写得很棒,通过你的帖子又认识到了一本有用的书《C现代编程》非常的感谢。从51->画板->stm32->stm8->arm汇编->动手写rtos->最近的linux,一路走过来都是采用的面向过程设计,因为从来都没想过oop也能用到单片机开发中来,所以之前索性不学面向对象语言,觉得根本就用不到学来干嘛,甚至是排斥面向对象语言,通过看别人的驱动程序,我觉得这种不是语言,而是一种思想,一种解决问题的方法。自己工作了1年多了,刚开始工作的时候发现程序组织的很差,无意间发现了状态机,后来一直以状态机写裸机程序,这次的oop应该又是一次提升,感谢。希望能加楼主好友,请教、交流这种编程思想。
回复 支持 1 反对 0

使用道具 举报

8

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2018-5-2
在线时间
83 小时
 楼主| 发表于 2018-5-2 16:50:02 | 显示全部楼层
Mak 发表于 2018-5-2 16:48
这种思维方式应该尽快抛弃,往往在你做得很完美的时候,客户就会来一个180大转变,你之前做的会全部白费掉 ...

??就是因为客户的需求多变,所以我们才需要写出容易维护和拓展的代码啊
回复 支持 反对

使用道具 举报

33

主题

159

帖子

0

精华

高级会员

Rank: 4

积分
527
金钱
527
注册时间
2017-1-21
在线时间
192 小时
发表于 2018-5-2 16:59:08 | 显示全部楼层
看的出来楼主确实认真写这么篇帖子。首先本人也是个初学者,只是简单发表个人意见。
1、对于stm32这种单片机,如果你做有一定实时性要求的控制,不建议用复杂的嵌套,理由是多层的调用可能程序就不是你想的那么回事。大家都恨不得直接操作寄存器。
2、stm32单片机虽然性能强大,但也只是相对的,一般不会处理非常复杂的程序,so,巨大封装库有时候反而是一种累赘。
3、其实st提供的标准库也好,HAL库也好,其实HAL更明显,采用的层的结构,提供接口去给你操作,其实已经是一个很大程度的封装库了。但这个一点它对应的硬件层的寄存器是死的,只要大型号不变,就是死的,所以HAL可以一劳永逸的发布。而楼主这种结构的库,物理层是根据PCB布线去走的,是一个变化的,每一次一个新项目或者项目改动都需要去调整最底层的定义,这其实超级麻烦,而且不好用。
4、其实stm32做项目,每个项目拿在走上,你分析你要写的程序结构,有的复杂的反复要用的功能你就编一个子函数,提供出入口变量。有些功能用的很少的,就直接写在主程序段里,其实反而更方便,更容易理解。

哈哈,随便写写,还是很感谢楼主写出这么好的文章。
回复 支持 反对

使用道具 举报

33

主题

159

帖子

0

精华

高级会员

Rank: 4

积分
527
金钱
527
注册时间
2017-1-21
在线时间
192 小时
发表于 2018-5-2 17:02:13 | 显示全部楼层
Mak 发表于 2018-5-2 16:57
你要是不想公司的人把你的程序看得这么明白,可以封装成lib,留出个头让人家改,这样反而更好。

哈哈,其实我跟你想的一样。
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2018-5-2
在线时间
83 小时
 楼主| 发表于 2018-5-2 17:02:15 | 显示全部楼层
本帖最后由 safu枫 于 2018-5-2 17:04 编辑
Mak 发表于 2018-5-2 16:56
我劝你一句别再往下搞,你这样会搞死接手你项目的人的,我现在就是一个受害者,好好一个库函数,被套上套, ...

我这样做就是想做成一类似库函数的概念啊,只要做出方便的接口,还有规范的注释,这和你使用库函数没区别啊,而且我的同事都在使用我所写的一些模板,他们一开始表示的确和难理解,但是使用起来确实很方便啊。。。谢谢提出你的意见,我会在以后的代码里面,会更加注意代码的接口说明,和兼容性,可读性,不过你说的问题确实存在,别人想要在我的基础上修改东西很复杂,但是这就和你想修改Linux内核一样,你必须得弄懂所有源码,但是实际上去修改内核代码的也很少,因为它们本身就很稳定了
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2018-5-2
在线时间
83 小时
 楼主| 发表于 2018-5-2 17:11:02 | 显示全部楼层
恩恩,封装成lib确实是个好主意。。但是我现在的这些模板也还没有做到非常稳定和强大那个程度,其实我这种思维去写代码最初的目的就是为了应付多变的需求和繁杂的嵌套,首先说明一下,我是做智能家居智能酒店相关的产品的,处理最多的就是按键 和 数据 之类的东西,里面的逻辑真的很多很多,如果采取传统的方式去写,真的会很头疼
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2018-5-2
在线时间
83 小时
 楼主| 发表于 2018-5-2 17:13:08 | 显示全部楼层
oyixi001 发表于 2018-5-2 16:59
看的出来楼主确实认真写这么篇帖子。首先本人也是个初学者,只是简单发表个人意见。
1、对于stm32这种单片 ...

我这也写也是因为PCB板子经常变动,所以才把需要改动的部分提取出来,这也PCB板子改动的时候我只需要修改很少一部分就好了,同样我后续的一些工程代码也是这样
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2018-5-2
在线时间
83 小时
 楼主| 发表于 2018-5-2 17:19:53 | 显示全部楼层
本帖最后由 safu枫 于 2018-5-2 17:35 编辑
Mak 发表于 2018-5-2 16:56
我劝你一句别再往下搞,你这样会搞死接手你项目的人的,我现在就是一个受害者,好好一个库函数,被套上套, ...

我想的是把最常用的一些功能做成模板,而且我的工程不会出现很多条件编译,你说的这种情况我不知道你有没有看过ZIGBEE的协议栈代码,我学完51单片机后,就开始看那个东西,我那时候实在不理解里面为什么一个普通的点亮一盏灯需要嵌套那么多种函数,又那么多的宏定义,其实到后来才慢慢理解这种思维,就是模块化,还有就是解耦,比如你现在修电脑,大不了就是换模块,而不会想到去修复里面的电路之类的;同样,代码也是一样,要做到弱耦合,多态,哪里坏了随时换,哪里有问题随时修改,这样就不要把整个代码重写,
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2018-5-2
在线时间
83 小时
 楼主| 发表于 2018-5-2 17:39:06 | 显示全部楼层
本帖最后由 safu枫 于 2018-5-2 17:52 编辑
oyixi001 发表于 2018-5-2 16:59
看的出来楼主确实认真写这么篇帖子。首先本人也是个初学者,只是简单发表个人意见。
1、对于stm32这种单片 ...

你单单是写一个函数,还是逻辑上会很混乱的,比如你现在要写一个按键,这个按键要控制LED灯,要控制继电器,要发送无线数据,而且按键类型有很多种,每种按键类型的处理非常不同,你怎么办?所有函数嵌套嵌套再嵌套?而且一有问题,这样的紧耦合的嵌套会检查不出问题,修改拓展非常麻烦。。没错,直接裸写,代码是容易理解,但是代码结构反而难理解,面向对象的思维就是 你不用去先关心代码的具体实现,而是关心代码的结构,你像我现在写代码,首先不是拿上来就直接写,而是先架构好整个工程结构,然后写出各种方法函数和属性,最后再根据方法函数来往里面填代码。。就和填空游戏一样,如果一上来就写函数,写代码,这样万一要增加需求,就很麻烦了
回复 支持 反对

使用道具 举报

5

主题

115

帖子

0

精华

高级会员

Rank: 4

积分
925
金钱
925
注册时间
2014-9-29
在线时间
276 小时
发表于 2018-5-2 18:08:15 | 显示全部楼层
我很惊讶居然有人说这种方法不好,真的是不可思议。在越做越大的项目里,这是很好的处理方法,如果不这样去做,不去面向对象,到那最终项目很可能是搁浅在自己手里。楼上说这样子代码嵌套看起来很复杂,把自己烦死,我觉得恰好相反,这样子处理看得更舒服,不会乱,自己想加功能很方便,不会牵一发而动全身
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2018-5-2
在线时间
83 小时
 楼主| 发表于 2018-5-2 18:11:50 | 显示全部楼层
挖东衣宇 发表于 2018-5-2 18:08
我很惊讶居然有人说这种方法不好,真的是不可思议。在越做越大的项目里,这是很好的处理方法,如果不这样去 ...

哈哈,不过楼上几位说的建议也很好,首先很多做单片机的没接触过面向对象思维,很难理解这种东西,包括我的一些同事,但是这并不是说这种思维不好,我们想要进步必须得学习新的东西嘛。。。
回复 支持 反对

使用道具 举报

5

主题

115

帖子

0

精华

高级会员

Rank: 4

积分
925
金钱
925
注册时间
2014-9-29
在线时间
276 小时
发表于 2018-5-2 18:17:44 | 显示全部楼层
本帖最后由 挖东衣宇 于 2018-5-2 18:18 编辑
safu枫 发表于 2018-5-2 18:11
哈哈,不过楼上几位说的建议也很好,首先很多做单片机的没接触过面向对象思维,很难理解这种东西,包括我 ...

我隔一段时间就把他们封装起来,实在受不了一大堆变量,只是功力不够,所以想请教下,这几本怎么阅读更好些
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2018-5-2
在线时间
83 小时
 楼主| 发表于 2018-5-2 18:21:27 | 显示全部楼层
挖东衣宇 发表于 2018-5-2 18:17
我隔一段时间就把他们封装起来,实在受不了一大堆变量,只是功力不够,所以想请教下,这几本怎么阅读更好 ...

《C现代编程》里面说的很好,直接从C面向对象那一章看起,其他的不用看,其他的好像是Linux相关的内容,我后续会持续更新的,下一章是写按键,欢迎来交流
回复 支持 反对

使用道具 举报

8

主题

206

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1010
金钱
1010
注册时间
2016-4-6
在线时间
234 小时
发表于 2018-5-2 19:18:41 | 显示全部楼层
本人也是初学者,刚开始入职的时候,大佬直接丢了一份代码给我。那个封装啊,层层嵌套。。刚开始的时候确实看着挺难受的,但是后来理解了,就越加觉得那种模块化的设计确实是好。。现在也在学习这种模块化的结构,面向对象的思想,看代码的话,可能可以理解,但是说要自己写的话,可能就有点费劲了,所以,楼主有没有什么好的建议,或者推荐好的书籍。。
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2018-5-2
在线时间
83 小时
 楼主| 发表于 2018-5-2 19:42:19 | 显示全部楼层
本帖最后由 safu枫 于 2018-5-2 19:46 编辑
xiedonghui258 发表于 2018-5-2 19:18
本人也是初学者,刚开始入职的时候,大佬直接丢了一份代码给我。那个封装啊,层层嵌套。。刚开始的时候确实 ...

恩,你看我的第一篇帖子,上面有推荐书籍,先看看那个《C现代编程》
回复 支持 反对

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7462
金钱
7462
注册时间
2015-1-15
在线时间
1367 小时
发表于 2018-5-2 19:59:09 | 显示全部楼层
楼主为什么不用C++呢,不是比你这个更好?
一分耕耘一分收获。
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2018-5-2
在线时间
83 小时
 楼主| 发表于 2018-5-2 20:14:15 | 显示全部楼层
yklstudent 发表于 2018-5-2 19:59
楼主为什么不用C++呢,不是比你这个更好?

C++不是很熟。。而且我也不知道 单片机 和编译器对于C++的稳定性和兼容性到底怎么样?你有那C++写过单片机吗?,而且我觉得用C去实习也挺简洁高效的,C++能实现的 C也能实现啊
回复 支持 反对

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7462
金钱
7462
注册时间
2015-1-15
在线时间
1367 小时
发表于 2018-5-2 20:41:55 | 显示全部楼层
我要求代码量小,不过没有寄存器,也是用的标准库开发;
一分耕耘一分收获。
回复 支持 反对

使用道具 举报

5

主题

22

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
378
金钱
378
注册时间
2014-7-27
在线时间
34 小时
发表于 2018-5-2 23:15:13 | 显示全部楼层
我觉得楼主的做法是对的,抽象,模块化设计是大型工程所必需的。但是我觉得你帖子里有一个概念应当澄清一下,这个不是面向对象,只是封装,你这样写会误导一些新入门的朋友的。
something different~
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2018-5-2
在线时间
83 小时
 楼主| 发表于 2018-5-2 23:33:33 | 显示全部楼层
liangqiseu 发表于 2018-5-2 23:15
我觉得楼主的做法是对的,抽象,模块化设计是大型工程所必需的。但是我觉得你帖子里有一个概念应当澄清一下 ...

请看下我的开篇。。这是第一篇,的确就只是封装,下一篇我会做按键程序,体现的是多态,后续还有继承。。
回复 支持 反对

使用道具 举报

5

主题

22

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
378
金钱
378
注册时间
2014-7-27
在线时间
34 小时
发表于 2018-5-2 23:41:39 | 显示全部楼层
safu枫 发表于 2018-5-2 23:33
请看下我的开篇。。这是第一篇,的确就只是封装,下一篇我会做按键程序,体现的是多态,后续还有继承。。

赞。关注一波。
something different~
回复 支持 反对

使用道具 举报

26

主题

1564

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6513
金钱
6513
注册时间
2015-8-25
在线时间
1016 小时
发表于 2018-5-3 08:33:50 | 显示全部楼层
希望接手or维护你项目的工程师有耐心好好看你的程序,更多的时候程序往往需要可读性放在第一位的,
不过你这封装还是挺好的
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复 支持 反对

使用道具 举报

57

主题

316

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1344
金钱
1344
注册时间
2018-1-11
在线时间
156 小时
发表于 2018-5-3 09:24:24 | 显示全部楼层
实在是不可思议,竟然有人说C的面向对象化不好,他们可能之前没接触过,我这里支持楼主,写的很好。
回复 支持 反对

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4665
金钱
4665
注册时间
2017-7-6
在线时间
706 小时
发表于 2018-5-3 10:22:29 | 显示全部楼层
是的 楼主这种方法好 我最近刚换工作 去年实习做8位单片机 现在做stm32,一来公司一大堆别人写的代码 全是结构体 枚举 指针 封装起来了  看着实在头痛 现在也慢慢理解了 但是自己用这种方法写的话 感觉还是很吃力  楼主有没有什么好方法推荐 或者书籍  谢谢
我是小白,很白很白的小白!!!
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2018-5-2
在线时间
83 小时
 楼主| 发表于 2018-5-3 10:33:03 | 显示全部楼层
程功之道 发表于 2018-5-3 10:22
是的 楼主这种方法好 我最近刚换工作 去年实习做8位单片机 现在做stm32,一来公司一大堆别人写的代码 全是 ...

请看我的 开篇 传送门~~~后续 我会有更新这一系列的,有什么问题可以随时交流
回复 支持 反对

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4665
金钱
4665
注册时间
2017-7-6
在线时间
706 小时
发表于 2018-5-3 10:34:57 | 显示全部楼层
safu枫 发表于 2018-5-3 10:33
请看我的 开篇 传送门~~~后续 我会有更新这一系列的,有什么问题可以随时交流

那个宏定义NewLed() 里面有几个0干嘛的?
我是小白,很白很白的小白!!!
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2018-5-2
在线时间
83 小时
 楼主| 发表于 2018-5-3 10:37:39 | 显示全部楼层
本帖最后由 safu枫 于 2018-5-3 10:41 编辑
程功之道 发表于 2018-5-3 10:34
那个宏定义NewLed() 里面有几个0干嘛的?

你也可以填NULL,意思就是 暂时不赋值,或者叫默认值, 0 是无效在这里, 因为我有一个 设置 LED端口的函数,用后面的函数 来给这个结构体赋值,相当于我先造了一个人,这个人没有姓名,然后有一个命名函数来给这个人命名, 这里就是 给这个LED 定义端口
回复 支持 反对

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4665
金钱
4665
注册时间
2017-7-6
在线时间
706 小时
发表于 2018-5-3 11:19:09 | 显示全部楼层
safu枫 发表于 2018-5-3 10:37
你也可以填NULL,意思就是 暂时不赋值,或者叫默认值, 0 是无效在这里, 因为我有一个 设置 LED端口的函 ...

p->LEDBlink->_SetBlinkTime_ms = SetBlinkTime_ms;这个为啥不是用.访问,而是用->这个符号,LEDBlink是在struct CLASS_LED结构体里面嵌套啊,在里面又定义成了struct CLASS_LEDBlink *LEDBlink
我是小白,很白很白的小白!!!
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2018-5-2
在线时间
83 小时
 楼主| 发表于 2018-5-3 11:28:27 | 显示全部楼层
本帖最后由 safu枫 于 2018-5-3 11:30 编辑
程功之道 发表于 2018-5-3 11:19
p->LEDBlink->_SetBlinkTime_ms = SetBlinkTime_ms;这个为啥不是用.访问,而是用->这个符号,LEDBlink是 ...

访问结构体变量使用.符号, 如果是 通过结构体指针访问结构体变量 就需要使用->符号;
这里是C语言的 结构体相关的知识点, 这个 嵌套相当于是面向对象里面的继承的概念;
更像组合的概念, 就是把2个类组合在一起了,打个比方就像是一辆车由车身 车轮等组成,
这里的 LED 就用LED类和 led_blink组合在一起了,这里的工程代码是我比较早写的,那时候还不理解继承的概念,谢谢你的提醒,我应该写成以led类为基类,led_blink为子类, led_blink去继承led这里 你把它看成是组合的概念吧, 后面的有个例子 会比较清晰地说明继承的概念。。
回复 支持 反对

使用道具 举报

4

主题

380

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3088
金钱
3088
注册时间
2015-10-17
在线时间
320 小时
发表于 2018-5-3 11:39:34 | 显示全部楼层
这写法非常好啊,类似c#的类,接口,大型程序多人合作必须的。当然我是说楼主的思路,不是说一定要在c里面去应用。
现在大点的程序跑系统,多任务,新手习惯找个main,while(1),很难上手,再弄一堆结构体,没有人教的话,命都去了半条。一句话,难者不会,会者不难
回复 支持 反对

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4665
金钱
4665
注册时间
2017-7-6
在线时间
706 小时
发表于 2018-5-3 11:39:38 | 显示全部楼层
safu枫 发表于 2018-5-3 11:28
访问结构体变量使用.符号, 如果是 通过结构体指针访问结构体变量 就需要使用->符号;
这里是C语言的 结 ...

是啊 楼主 有没有好书推荐啊 以前写8位单片机也没用过指针 结构体 在学校C语言老师就教了点for if switch语句 结构体啥的都没讲 还是我自己看了点
我是小白,很白很白的小白!!!
回复 支持 反对

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4665
金钱
4665
注册时间
2017-7-6
在线时间
706 小时
发表于 2018-5-3 11:43:17 | 显示全部楼层
本帖最后由 程功之道 于 2018-5-3 11:46 编辑
safu枫 发表于 2018-5-3 11:28
访问结构体变量使用.符号, 如果是 通过结构体指针访问结构体变量 就需要使用->符号;
这里是C语言的 结 ...

楼主 我觉得这里也可以不用宏定义吧#define NewLed()    {            \
  SetLedGPIOCMD,                 \
  LED_SetST,                     \
  NULL,                          \
  0,                             \
  0,                              \
  0\
}
直接定义led0  为这个结构体类型不就可以吗?typ_CLASS_LED  led0;不需要赋值,不需要这个NewLed() 宏定义   
typ_CLASS_LED  led0 = NewLed();     
我是小白,很白很白的小白!!!
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2018-5-2
在线时间
83 小时
 楼主| 发表于 2018-5-3 11:46:53 | 显示全部楼层
程功之道 发表于 2018-5-3 11:39
是啊 楼主 有没有好书推荐啊 以前写8位单片机也没用过指针 结构体 在学校C语言老师就教了点for if switch ...

C语言方面的书太多了,书我看得少,C语言基础我是看郝斌的视频学的,里面学到一点就是 一定要动手写,才能理解,然后我C语言提高是源于2个地方,一个是 ZIGBEE的协议栈,那个鬼东西 初看的时候头大,看不懂,然后就去看了郝斌的 数据结构相关的视频,一定要动手 实践 做项目~~~~推荐的书有《C现代编程》,我很多东西其实就是照着抄里面的,根据实践应用稍微做了点改动~~
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2018-5-2
在线时间
83 小时
 楼主| 发表于 2018-5-3 11:49:06 | 显示全部楼层
程功之道 发表于 2018-5-3 11:43
楼主 我觉得这里也可以不用宏定义吧#define NewLed()    {            \
  SetLedGPIOCMD,              ...

恩,这种写法是 学习了 书里面的写法,然后这也是 面向对象语言 像C# C++的写法,你要是直接定义结构体 你还得赋值啊。。。函数指针之类的
回复 支持 反对

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4665
金钱
4665
注册时间
2017-7-6
在线时间
706 小时
发表于 2018-5-3 11:55:31 | 显示全部楼层
safu枫 发表于 2018-5-3 11:49
恩,这种写法是 学习了 书里面的写法,然后这也是 面向对象语言 像C# C++的写法,你要是直接定义结构体  ...

  p->_GPIOx = GPIOx;
  p->_GPIO_Pin = GPIO_Pin;
你这函数里面不是赋值了啊?不知道我说的对不对 我也是跟着自己理解的
我是小白,很白很白的小白!!!
回复 支持 反对

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4665
金钱
4665
注册时间
2017-7-6
在线时间
706 小时
发表于 2018-5-3 12:01:17 | 显示全部楼层
safu枫 发表于 2018-5-3 11:46
C语言方面的书太多了,书我看得少,C语言基础我是看郝斌的视频学的,里面学到一点就是 一定要动手写,才 ...

楼主 加个QQ 以后多多指教
我是小白,很白很白的小白!!!
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2018-5-3
在线时间
5 小时
发表于 2018-5-3 13:05:42 | 显示全部楼层
可以直接用C++写啊,像Arduino那样封装成库,感觉会好理解一点
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2018-5-2
在线时间
83 小时
 楼主| 发表于 2018-5-3 16:24:00 | 显示全部楼层
FASTSHIFT 发表于 2018-5-3 13:05
可以直接用C++写啊,像Arduino那样封装成库,感觉会好理解一点

一些单片机 对C++的支持还不是很好吧....
回复 支持 反对

使用道具 举报

6

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
219
金钱
219
注册时间
2017-8-31
在线时间
45 小时
发表于 2018-5-3 16:51:18 | 显示全部楼层
lib封装,来得痛快。
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2018-5-2
在线时间
83 小时
 楼主| 发表于 2018-5-3 16:59:50 | 显示全部楼层
YST 发表于 2018-5-3 16:51
lib封装,来得痛快。

我这里并不是想提供一个工具库, 而是想介绍这种 自己动手创造工具库的思维,而且需求变化太多,自己还是需要经常修改的、、、、我更想有人能和我交流这种方式,理解这种方式,而不是封装成一个现成的工具库供大家使用。。。
回复 支持 反对

使用道具 举报

6

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
219
金钱
219
注册时间
2017-8-31
在线时间
45 小时
发表于 2018-5-3 17:18:09 | 显示全部楼层
safu枫 发表于 2018-5-3 16:59
我这里并不是想提供一个工具库, 而是想介绍这种 自己动手创造工具库的思维,而且需求变化太多,自己还是 ...

这方法不错,代码维护变简洁,但是一个项目里不停改代码,也是一个不小的工作量。不需要经常更改代码的功能模块,封装成LIB的话,调用很方便。
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2018-5-2
在线时间
83 小时
 楼主| 发表于 2018-5-3 17:19:43 | 显示全部楼层
YST 发表于 2018-5-3 17:18
这方法不错,代码维护变简洁,但是一个项目里不停改代码,也是一个不小的工作量。不需要经常更改代码的功 ...

恩恩,现在的功能都比较稳定了,特别是 后面我介绍的 我那个 关于数据处理的 类,暂时没想过封装吧。。感觉不是特别灵活。。我刚更新了第二篇 你可以看下
回复 支持 反对

使用道具 举报

4

主题

346

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3657
金钱
3657
注册时间
2016-2-21
在线时间
542 小时
发表于 2018-5-3 17:44:50 | 显示全部楼层
以前年轻的时候,和楼主一样是整天喊着OO大法好,一天不OO,浑身难受。现在是忠实的反OO主义,尤其是用C写OO的,而且还是在完全没有必要的地方强行OO的家伙。鄙视
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2018-5-2
在线时间
83 小时
 楼主| 发表于 2018-5-3 17:46:43 | 显示全部楼层
shikihane 发表于 2018-5-3 17:44
以前年轻的时候,和楼主一样是整天喊着OO大法好,一天不OO,浑身难受。现在是忠实的反OO主义,尤其是用C写O ...

能请教一下为什么吗?请问你经历了什么。。。
回复 支持 反对

使用道具 举报

52

主题

334

帖子

0

精华

高级会员

Rank: 4

积分
560
金钱
560
注册时间
2016-4-12
在线时间
230 小时
发表于 2018-5-3 20:52:12 | 显示全部楼层
看了以上各位大神的评论,果然是百花齐放,百家争鸣的感觉,对于一个C语言功底不是很深的前提下,我可以从楼主的这个帖子上学到很多东西,支持楼主继续出,也支持各位大咖,看了那么多评论,真的受益匪浅,加油加油!!!!
回复 支持 反对

使用道具 举报

33

主题

215

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2027
金钱
2027
注册时间
2017-12-11
在线时间
452 小时
发表于 2018-5-3 21:11:42 | 显示全部楼层
MARK,好贴,持续关注,期待楼主继续更新!
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2018-6-20
在线时间
3 小时
发表于 2018-6-20 11:50:22 | 显示全部楼层
楼主的程序我下载之后, 编译只提了3个警告, 然后写到开发板上, 发现这个灯只能闪个几十次, 然后就常亮了。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-1-19 02:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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