在MDK上建立一个C++的STM32开发工程

 最近,我惊讶地发现居然可以用C++进行嵌入式程序开发,甚至是裸系统程序。之前,做单片机开发、STM32上程序开发,想到的都是C语言、汇编语言,根 本就没有考虑过还可以用C++语言做开发。近日,在学习公司的项目之后,发现C++有其独道之处。开发起来比C语言更方便架构搭建与程序管理。

     我之前对C++有曲解,总认为C++只适合做上层应用软件开发,不适用于单片机开发。一方面是因为C++喜欢来不不就new一个对象。对于内存空间非常紧 张的单片机,只能望海兴叹。二是C++生成的代码量较C庞大,效率上可能没有C高。对于主频较低的单片机,也用一点勉强。但是,这并不能掩盖C++的优 势。C++是面向对象的程序语言,能非常灵活地进行继承与派生,还能实现多态。对于较大一点的程序而言,用C作开发,不异于用砖头砌坐20层的大厦。这样 的大厦既不稳定,也不好维护。相反,C++则可以很好地完成这样大的任务。但是,你就盖个两层楼的小平房,需得着什么房屋框架吗?也没必要呀。
    总而言之,C与C++各有各的优势,就看你怎么用。

    我手头一有块STM32的开发板。于是,我尝试在MDK上建一个基于C++的Demo工程。板子上有64KB的SRAM,主频可达72MHz,也差不多了。

    想到C++,我就想到了new 这个关键字。这个new 就是从堆里取一块内存空间,并执行类的构造函数。
    那么这里就要涉及到堆的问题,你必须得告诉程序一个问题:(1)堆在哪里?(2)堆有多大?

    以下是我在main()中对堆的实现:

#include <rt_heap.h>  //_init_alloc

#define HEAP_SIZE   (0x3000)
INT32U  heap_zone[HEAP_SIZE] = {0};

int main()
{
    NVIC_Configuration();

    OSInit();

    _init_alloc((INT32U)heap_zone, (INT32U)&heap_zone[HEAP_SIZE-1]);

    CStartTask start;
    start.Create();

    OSStart();

    return 0;
}

  首先声明,这个main()所在的文件必须是以.cpp文件,不然编译当成C语言进行编译。C++可以调用C,C不能调用C++,这点要记住。以上对堆的实现分两步:
    (1)要在SRAM中留一块空间来做堆。上代就用定义数组的方式实现。 INT32U heap_zone[HEAP_SIZE] = 0;
    (2)告诉程序堆的起止地址。通过调用 _init_alloc( startAddr, endAddr  );

    也不一定非要用这做笨绌的方法定义一块堆空间。我这块开发板上还用FSMC扩展了一个512KB的SRAM。那么我可以用这块空间来做堆空间。如下:

#include <rt_heap.h>  //_init_alloc

#define HEAP_BASE  Bank1_SRAM3_ADDR
#define HEAP_TOP   (Bank1_SRAM3_ADDR+0x100000)
int main()
{
    NVIC_Configuration();
    FSMC_SRAM_Init();  //初始化对SRAM的访问

    OSInit();

    _init_alloc(HEAP_BASE, HEAP_TOP);    // 设置堆空间

    CStartTask start;
    start.Create();

    OSStart();

    return 0;
}

  SRAM 的首地址就是 HEAP_BASE = Bank1_SRAM3_ADDR , 止地址就是 HEAP_TOP =  Bank1_SRAM3_ADDR+0x100000 。
    如上调用完 _init_alloc() 函数后,你就可以使用 new 进行申请空间与创建对象了。

    在工程中凡是 .c 文件都是C源文件,凡是 .cpp 文件都是C++源文件。在将原来部分C语言代码移植到C++的时候,要在头文件的开始与终止处添加以下内容:

#ifdef __cplusplus
       extern "C" {
#endif
        ……    // 正文
#ifdef __cplusplus
        }
#endif

  extern "C" { } 用于告诉编译器,大括号以内的东西以C的方式进行编译。因为原来.C的头文件被.CPP文件包含了,那么编译器便按C++的方式进行编译,导致与原来.C文件中定义的不一致,编译报错。  

时间: 2025-01-08 08:45:23

在MDK上建立一个C++的STM32开发工程的相关文章

在FreeBSD上建立一个功能完整的邮件服务器

#1 在FreeBSD上建立一个功能完整的邮件服务器 第一部分:安装邮件服务器:postfix+vm-pop3d+openwebmail 欢迎大家转贴这个文章,但要保留下面的版权信息: 作者:llzqq 联系:llzqq@126.com 以下的安装在FreeBSD 5.2.1系统上完成 1.更新 ports # cvsup -gL 2 -h cvsup.freebsdchina.org /usr/share/examples/cvsup/ports-supfile 2.安装 openssl+ap

那有什么方案可以在azure上建立一个win10 来体验下呢

问题描述 那有什么方案可以在azure上建立一个win10 来体验下呢 大家好哦!! 那有什么方案可以在azure上建立一个win10 来体验下呢?? 解决方案 这个需要Azure提供Win10的虚拟机镜像.然后你就可以使用了.或者你装一个Win8,然后下一个Win10的ISO来做OS Upgrade 解决方案二: 你好, 两个方案, 方案一,使用Azure提供的Win10虚拟机镜像.不过目前好像没有支持Win10的虚拟机镜像. 方案二,使用自己的虚拟机镜像. 如果你本地有Win10的虚拟机镜像

《嵌入式设备驱动开发精解》——2.4 建立一个具体的嵌入式开发的小项目

前言 嵌入式设备驱动开发精解本书的编写主要是针对从事嵌入式软件开发人员.本书的内容主要涵盖ARM CPU以及各种常用外部设备驱动开发的方方面面,包括各种硬件接口.硬件接口协议说明以及各种外设的使用及调试方法,特别是对于开发调试过程中可能遇到的各种问题以及如何解决这些问题进行了讨论,同时包括但不限于软件方面的调试方法与硬件方面的调试方法等. 从事嵌入式驱动开发的工作主要就是与各种外设.外设接口以及OS(操作系统)打交道,这是一个会涉及非常多的知识点的.系统级的软件开发与设计过程. 狭义上的嵌入式驱

Until:在 Mac 上建立一个简单的 Deadline

摘要: 不知何时,身边突然多出了很多拖延症患者,他们一定要等到 deadline 之前才会行动.这款在 Mac App Store 刚上线的应用 Until 就能让你建立许多条 deadline ,相当于一个桌面版的倒计时工具 不知何时,身边突然多出了很多拖延症患者,他们一定要等到 deadline 之前才会行动.这款在 Mac App Store 刚上线的应用 Until 就能让你建立许多条 deadline ,相当于一个桌面版的倒计时工具.你可以添加事件描述,还能用多种颜色来表示事情的重要程

在Google Drive上建立免费静态网站

    现今建立一个属于自己的网站已经是一件很普遍和简单的事情了.你可以选择买空间,买域名,你也可以使用免费空间,免费域名.你可以选择动态的php wordpress,joomla或者是静态的网站(如使用jekyll or octopress部署到github上).今天我将介绍如何在Google Drive上建立一个静态的网站,其实和github很相似,都支持js.不得不说google走的每一步都是让人兴奋和令人尊敬的.如果你上不了Google Drive,那么你可以选择fanqiang.下面就

如何在Windows Azure上托管一个Node.js网站

在本系列的第一篇文章中,我介绍了如何http://www.aliyun.com/zixun/aggregation/32995.html">在Windows上运行Node.js.在第二篇文章中,我示范了如何在Node.js 中使用SQL Server.那也是我学习Node.js 的步骤,首先使它在windows上工作,然后再在SQL Server上.但是回到我开始的目标上,我需要为Wang Tao的worktile实现同步服务,并打算在Windows Azure上建一个原型.所以前两篇文章

在CoreOS上搭建一个WordPress程序操作实例_Linux

CoreOS是一个专门为大规模服务器部署定制的Linux精简系统,它将操作系统和应用程序完全分离,从而降低操作系统和应用程序的耦合度,同时解决了现有Linux服务器在容器资源.权限管理方面出现的问题.就目前来说,CoreOS会是未来操作系统的发展趋势. 那你有没有亲自在CoreOS上部署一个应用程序呢?相信大多数人都没有过这样的经验,在CoreOS上建立一个应用程序可以说是非常辛苦及沮丧的.因为在开始建立程序之前你首先必须了解所有不同的技术. 下面,我们将手把手地教你来创建一个简单的WordPr

在Ubuntu上建立VBox桥式网络接口

为了 在 http://www.aliyun.com/zixun/aggregation/13835.html">Ubuntu host上 建立一个永久的 " host interface",需执行下列步骤: 1. 首先安装桥接程序 (bridge-utils). 你可以执行下列命令,其代码是: sudo apt-get install bridge-utils 2. 接着你必须要修改档案 /etc/network/interfaces 中的内容,下面是一简单的例子,产

c++ c语言数据结构-怎么样在C++上用new建立一个数组

问题描述 怎么样在C++上用new建立一个数组 应该叫建立动态存储区吧,主要想请教一下关于结构体的,输入一个数字怎么样建立一个长度为这个数的数组 解决方案 很简单 int n; cin >> n; int * arr = new int[n]; 如果是结构体: int n; cin >> n; S * arr = new S[n]; for (int i = 0; i < arr; i++) arr[i] = new S(); 解决方案二: new一个指针数组哪位大哥知道怎么