OpenEdv-开源电子网

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

使用C++的编程风格写一个跑马灯的例程

[复制链接]

5

主题

30

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2015-3-18
在线时间
46 小时
发表于 2016-2-25 11:43:19 | 显示全部楼层 |阅读模式
本帖最后由 xiaoergao 于 2016-2-26 13:01 编辑

最近尝试了一下使用C++用来开发下位机程序,感觉可以节省一些敲代码的时间。主要是可以省去很多变量的声明之类的。例如把GPIO定义成一个类,只要声明出来对象以后,对象的成员变量都不用重复声明了。
#include "sys.h"
#include "delay.h"

class GPIO{
        public:
                GPIO(GPIO_TypeDef* _port,u16 _pin);
                void mode(GPIOMode_TypeDef mode_val);
                void set();
                void reset();
        private:
                GPIO_TypeDef* port;
                u16 pin;
};

GPIO::GPIO(GPIO_TypeDef* _port,u16 _pin){
        port = _port;
        pin = 0x0001<<_pin;
}
void GPIO::mode(GPIOMode_TypeDef mode){
        GPIO_InitTypeDef GPIO_InitStructure;   
        GPIO_InitStructure.GPIO_Pin = pin;                                                      
        GPIO_InitStructure.GPIO_Mode = mode;                                       
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                                      
        GPIO_Init(port, &GPIO_InitStructure);                                                              
}

void GPIO::set(){
         GPIO_SetBits(port,pin);
}
void GPIO::reset(){
         GPIO_ResetBits(port,pin);                        
}

int main(void)
{        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);
        GPIO PB5 = GPIO(GPIOB,5);
        GPIO PE5 = GPIO(GPIOE,5);
        PB5.mode(GPIO_Mode_Out_PP);
        PE5.mode(GPIO_Mode_Out_PP);
        delay_init();
        while(1)
        {
                PB5.set();
                PE5.reset();
                delay_ms(300);         
                PB5.reset();
                PE5.set();
                delay_ms(300);
        }
}

==================更新========================
采用面向对象的思想来编程感觉非常符合单片机的直观感觉,每一类外设是一个类,同一类外设都是对应的对象。
例如:单片机有多个串口   对应一个USART类 。对应的usart1,usart2,usart3   则用USART类实例化3个对象。每个对象有相应的功能,比如发送数据我采用printf()方法,接受数据采用recieve()方法。
[mw_shl_code=applescript,true]#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "object.h"
int main(void)
{       
        int f=0;
         
        //声明对象
        GPIO PB5(GPIOB,5);
        GPIO PE5(GPIOE,5);
        USART uart2 (USART2,&PA2,&PA3);         
         
        //初始化对象
        PB5.mode(GPIO_Mode_Out_PP);
        PE5.mode(GPIO_Mode_Out_PP);
        uart2.init(115200);       
        delay_init();
         
        //调用对象的成员方法
        while(1)
        {
                f++;
                PB5.set();
                PE5.reset();
                delay_ms(100);         
                PB5.reset();
                PE5.set();
                delay_ms(100);
                uart2.printf("%d********************%d\r\n",f,f);
        }
}
[/mw_shl_code]
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-2-25 12:52:50 | 显示全部楼层
回复 支持 反对

使用道具 举报

1

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2015-11-26
在线时间
25 小时
发表于 2016-2-25 15:13:34 | 显示全部楼层
编译出来的代码冗余呢?体积怎么样?占用ram呢?
回复 支持 反对

使用道具 举报

5

主题

30

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2015-3-18
在线时间
46 小时
 楼主| 发表于 2016-2-25 23:32:19 | 显示全部楼层
几乎和纯c语言的一样
回复 支持 反对

使用道具 举报

1

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2015-11-26
在线时间
25 小时
发表于 2016-2-26 12:56:34 | 显示全部楼层
xiaoergao 发表于 2016-2-25 23:32
几乎和纯c语言的一样

小型的当然一样了,复杂的呢,                c++还有难度,特别是ram空间 硬伤
回复 支持 反对

使用道具 举报

5

主题

30

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2015-3-18
在线时间
46 小时
 楼主| 发表于 2016-2-26 12:59:32 | 显示全部楼层
采用面向对象的思想来编程感觉非常符合单片机的直观感觉,每一类外设是一个类,同一类外设都是对应的对象。
例如:单片机有多个串口   对应一个USART类 。对应的usart1,usart2,usart3   则用USART类实例化3个对象。每个对象有相应的功能,比如发送数据我采用printf()方法,接受数据采用recieve()方法。
[mw_shl_code=applescript,true]#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "object.h"
int main(void)
{       
        int f=0;
         
        //声明对象
        GPIO PB5(GPIOB,5);
        GPIO PE5(GPIOE,5);
        USART uart2 (USART2,&PA2,&PA3);         
         
        //初始化对象
        PB5.mode(GPIO_Mode_Out_PP);
        PE5.mode(GPIO_Mode_Out_PP);
        uart2.init(115200);       
        delay_init();
         
        //调用对象的成员方法
        while(1)
        {
                f++;
                PB5.set();
                PE5.reset();
                delay_ms(100);         
                PB5.reset();
                PE5.set();
                delay_ms(100);
                uart2.printf("%d********************%d\r\n",f,f);
        }
}
[/mw_shl_code]
回复 支持 反对

使用道具 举报

5

主题

30

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2015-3-18
在线时间
46 小时
 楼主| 发表于 2016-2-26 13:06:38 | 显示全部楼层
嗷大喵 发表于 2016-2-26 12:56
小型的当然一样了,复杂的呢,                c++还有难度,特别是ram空间 硬伤

等我把每个外设的类都完善了以后,做一个综合的程序看一下看看性能如何。
不过感觉应该相差不会太大。翻了一下以前的帖子,也有人用C++来做开发。
回复 支持 反对

使用道具 举报

1

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2015-11-26
在线时间
25 小时
发表于 2016-2-27 09:06:40 | 显示全部楼层
xiaoergao 发表于 2016-2-26 13:06
等我把每个外设的类都完善了以后,做一个综合的程序看一下看看性能如何。
不过感觉应该相差不会太大。翻 ...

其实最主要的问题还是  初始化类 就会分配可以包含这个类大小的空间  这点是硬伤
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 04:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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