您的位置 首页 知识

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

最近,我惊讶地发现居然可以用C++进行嵌入式程序开发,甚至是裸系统程序。之前,做单片机开发、STM32上程序开发,想到的都是C语言…

最近,我惊奇地发现竟然能够用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()中对堆的完结:

  1. #include//_init_alloc
  2. #defineHEAP_SIZE(0x3000)
  3. INT32Uheap_zone[HEAP_SIZE]={0};
  4. intmain()
  5. {
  6. NVIC_Configuration();
  7. OSInit();
  8. _init_alloc((INT32U)heap_zone,(INT32U)&heap_zone[HEAP_SIZE-1]);
  9. CStartTaskstart;
  10. start.Create();
  11. OSStart();
  12. return0;
  13. }

首要声明,这个main()地点的文件有必要是以.cpp文件,否则编译当成C言语进行编译。C++能够调用C,C不能调用C++,这点要记住。以上对堆的完结分两步:
(1)要在SRAM中留一块空间来做堆。上代就用界说数组的办法完结。 INT32U heap_zone[HEAP_SIZE] = 0;
(2)告知程序堆的起止地址。经过调用 _init_alloc( startAddr,endAddr );

也纷歧定非要用这做笨绌的办法界说一块堆空间。我这块开发板上还用FSMC扩展了一个512KB的SRAM。那么我能够用这块空间来做堆空间。如下:

  1. #include//_init_alloc
  2. #defineHEAP_BASEBank1_SRAM3_ADDR
  3. #defineHEAP_TOP(Bank1_SRAM3_ADDR+0x100000)
  4. intmain()
  5. {
  6. NVIC_Configuration();
  7. FSMC_SRAM_Init();//初始化对SRAM的拜访
  8. OSInit();
  9. _init_alloc(HEAP_BASE,HEAP_TOP);//设置堆空间
  10. CStartTaskstart;
  11. start.Create();
  12. OSStart();
  13. return0;
  14. }

SRAM 的首地址便是 HEAP_BASE = Bank1_SRAM3_ADDR , 止地址便是 HEAP_TOP =Bank1_SRAM3_ADDR+0x100000 。
如上调用完 _init_alloc() 函数后,你就能够运用 new 进行请求空间与创立目标了。

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

  1. #ifdef__cplusplus
  2. extern”C”{
  3. #endif
  4. ……//正文
  5. #ifdef__cplusplus
  6. }
  7. #endif

extern “C” { } 用于告知编译器,大括号以内的东西以C的办法进行编译。由于本来.C的头文件被.CPP文件包含了,那么编译器便按C++的办法进行编译,导致与本来.C文件中界说的纷歧致,编译报错。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/264119.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部