概述
目前使用单片机编程多数是使用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++中一致。后续验证其他功能时再做补充说明。
6298

被折叠的 条评论
为什么被折叠?



