单片机上使用C++编程

概述

目前使用单片机编程多数是使用C语言,但是在一些高级应用开发中,C语言具有部分局限性。众所周知C++是兼容C的,且常常见到一些GUI系统或者高级算法中使用到C++,由此想验证在单片机上如何使用C语言进行编程。本次做了相关的实验,并对实验进行记录。

步骤:

一、实现打印信息

为方便打印调试并验证,首先新建一个单片机工程(随便哪个型号的单片机),在程序中实现串口发送的功能,然后将printf 函数重新映射到改串口中,具体实现的代码如下:

#include "bsp_debug.h"

#include <stdio.h>

/*
如果使用 printf ,必须在 [Options for target]-> [target] 中选中 [Use MicroLIB],
或者加入以下代码,支持printf函数,而不需要选择use MicroLIB
*/
#if 1

#pragma import(__use_no_semihosting)

struct __FILE
{
	int handle;
};

FILE __stdout;

void _sys_exit(int x)
{
	x = x;
}

#endif

#define UART_DEBUG UART0

/*******************************************************************/
/*
注意:使用本文件内的函数,需要将打印输出端口重映射
*/
/*******************************************************************/
int fputc(int ch, FILE *f)
{
	/* 发送一个字节数据到USART1 */
	FL_UART_WriteTXBuff(UART_DEBUG, (uint8_t)ch);

	/* 等待发送完毕 */
	while (FL_SET != FL_UART_IsActiveFlag_TXBuffEmpty(UART_DEBUG))
		;

	return (ch);
}

二、添加c++文件

新建一个 general.cpp 和 general.h 头文件,并添加到单片机工程中,内容如下:

general.h

#ifndef __GENERAL_H
#define __GENERAL_H


#ifdef __cplusplus
extern "C" {
#endif

void Test(void);
	
	
	
	
#ifdef __cplusplus
}
#endif



#endif 

general.cpp

#include "general.h"
#include <stdio.h>
// #include <iostream>

// using namespace std;

class Box
{
public:
    double length;  // 长度
    double breadth; // 宽度
    double height;  // 高度
    double get(void);
    void set(double len, double bre, double hei);
    // 成员函数定义,包括构造函数
    Box();
    ~Box();
};

Box::Box(void)
{
    printf("这是一个构造函数\r\n");
}

Box::~Box(void)
{
    printf("这是一个析构函数\r\n");
}

// 成员函数定义
double Box::get(void)
{
    return length * breadth * height;
}

void Box::set(double len, double bre, double hei)
{
    length = len;
    breadth = bre;
    height = hei;
}

void Test(void)
{
    Box Box1;            // 声明 Box1,类型为 Box
    Box Box2;            // 声明 Box2,类型为 Box
    Box Box3;            // 声明 Box3,类型为 Box
    double volume = 0.0; // 用于存储体积

    // box 1 详述
    Box1.height = 5.0;
    Box1.length = 6.0;
    Box1.breadth = 7.0;

    // box 2 详述
    Box2.height = 10.0;
    Box2.length = 12.0;
    Box2.breadth = 13.0;

    // box 1 的体积
    volume = Box1.height * Box1.length * Box1.breadth;
    printf(" box 1 的体积 %f\r\n", volume);
    // box 2 的体积
    volume = Box2.height * Box2.length * Box2.breadth;
    printf(" box 2 的体积 %f\r\n", volume);
    // box 3 详述
    Box3.set(16.0, 8.0, 12.0);
    volume = Box3.get();
    printf(" box 3 的体积 %f\r\n", volume);
}

注意事项:添加cpp文件时,可以像c文件那样直接添加,并不会报错;但是在cpp文件中添加.h文件时,需要注意头文件中要使用  extern "C" { } 进行声明,不然会报错;在KEIL中不能选择使用 use MicroLIB 选项,不然会有兼容性错误;

三、验证结果

编译后并无报错:

之后下载到单片机运行,打印输出如下:

通过以上的打印信息可以看到,单片机上能够运行C++程序,且对于类的构造函数和析构函数依然是与c++中一致。后续验证其他功能时再做补充说明。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值