在MDK上建立一个C++的STM32开发工程
我之前对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
//_init_alloc - #defineHEAP_SIZE(0x3000)
- INT32Uheap_zone[HEAP_SIZE]={0};
- intmain()
- {
- NVIC_Configuration();
- OSInit();
- _init_alloc((INT32U)heap_zone,(INT32U)&heap_zone[HEAP_SIZE-1]);
- CStartTaskstart;
- start.Create();
- OSStart();
- return0;
- }
首先声明,这个main()所在的文件必须是以.cpp文件,不然编译当成C语言进行编译。C++可以调用C,C不能调用C++,这点要记住。以上对堆的实现分两步:
(1)要在SRAM中留一块空间来做堆。上代就用定义数组的方式实现。 INT32U heap_zone[HEAP_SIZE] = 0;
(2)告诉程序堆的起止地址。通过调用 _init_alloc( startAddr,endAddr );
也不一定非要用这做笨绌的方法定义一块堆空间。我这块开发板上还用FSMC扩展了一个512KB的SRAM。那么我可以用这块空间来做堆空间。如下:
- #include
//_init_alloc - #defineHEAP_BASEBank1_SRAM3_ADDR
- #defineHEAP_TOP(Bank1_SRAM3_ADDR+0x100000)
- intmain()
- {
- NVIC_Configuration();
- FSMC_SRAM_Init();//初始化对SRAM的访问
- OSInit();
- _init_alloc(HEAP_BASE,HEAP_TOP);//设置堆空间
- CStartTaskstart;
- start.Create();
- OSStart();
- return0;
- }
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文件中定义的不一致,编译报错。
MDKC++STM32开发工 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)