KEIL / MDK C++支持方法:基于TencentOS-Tiny 工程修改,STM32芯片

采用STM32CubeMX生成的keil工程,默认是采用V5编译的,V5版本编译器只支持C。

就目前来说,使用C++开发嵌入式的程序员还是比较少,就我个人认为原因是一方面KEIL / MDK对C++程序的支持还不够全面,另一方面则是C++程序的体量相较于C程序过于庞大,对于小型的应用来说没有必要。

作为一个嵌入式和智能终端都有一点接触的程序员来说,我当然是更希望我的代码能够更容易地移植,最重要的一点则是C++兼容了C,我们要在原始的C工程上面,进行修改,使得我们的工程变得可以支持C++。

一、KEIL / MDK 配置修改

KEIL / MDK是支持C++编程方式的,我们先打开原先的keil工程,当然这个工程原本是可以编译通过的。

如下图,打开Project -- Options for Target,打开Target选项卡:

1、选择Version 6

因为KEIL / MDK V5版本只支持C编译,V6版本才支持C++编译。

2、去掉Use MicorLIB的勾选

microlib 是缺省 C 库的备选库;

它用于必须在极少量内存环境下运行的深层嵌入式应用程序;

microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。

microlib支持printf,

但是不支持C++编译,所以这里要去掉,后面我们会采用其他方式来支持printf。

如下图,选择C/C++(AC6)选项卡

OK,配置完成

二、std标准库 重定向

因为microlib已经去掉,需要对部分标准库方法进行重定向编写,既将输入输出流重定向至STM32的串口端。而Retarget.c里面就实现了相关的方法。

我们从keil的安装路径里找到Retarget.c文件,复制到我们的工程目录下,然后进行修改如下:

/******************************************************************************/
/* RETARGET.C: 'Retarget' layer for target-dependent low level functions      */
/******************************************************************************/
/* This file is part of the uVision/ARM development tools.                    */
/* Copyright (c) 2005 Keil Software. All rights reserved.                     */
/* This software may only be used under the terms of a valid, current,        */
/* end user licence from KEIL for a compatible version of KEIL software       */
/* development tools. Nothing else gives you the right to use this software.  */
/******************************************************************************/

#include <rt_sys.h>
#include "usart.h"
#ifdef __cplusplus
extern "C" {
#endif

extern int  sendchar(int ch);  
extern int  getkey(void);      

int fputc(int ch, FILEHANDLE *f) {
  return (sendchar(ch));
}

int fgetc(FILEHANDLE *f) {
  return (sendchar(getkey()));
}

FILEHANDLE _sys_open(const char * name, int openmode)
{
    return 1;  
}
int _sys_close(FILEHANDLE fh)
{
    return 0; //return success
}
int _sys_write(FILEHANDLE fh, const unsigned char * buf,
               unsigned len, int mode)
{
    return 0;   
}
int _sys_read(FILEHANDLE fh, unsigned char * buf,
              unsigned len, int mode)
{
    return 0;       
}
void _ttywrch(int ch)
{ 
}
int _sys_istty(FILEHANDLE fh)
{
    return 1; // no interactive device present
}
int _sys_seek(FILEHANDLE fh, long pos)
{
    return -1; // error
}
int _sys_ensure(FILEHANDLE fh)
{
    return 0; // success
}
long _sys_flen(FILEHANDLE fh)
{
    return 0;
}
int _sys_tmpnam(char * name, int sig, unsigned maxlen)
{
    return 0; // fail, not supported
}
void _sys_exit(int returncode)
{
    while(1) {};
}
#ifdef __cplusplus
}
#endif

然后在其他文件里,比如你的串口读写的C文件里实现

sendchar函数和getkey函数

例如:

int  sendchar(int ch)
{
	if (ch == '\n') {
    HAL_UART_Transmit(&huart1, (void *)"\r", 1,30000);
  }
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
}

int  getkey(void){
	/* Place your implementation of fgetc here */
  /* e.g. readwrite a character to the USART2 and Loop until the end of transmission */
  uint8_t ch = 0;
  //uint32_t recv_size;
  HAL_UART_Receive(&huart1, &ch, 1,30000);
  return ch;
}

三、从C调用C++

建立一个C++文件,加入到我们工程中,或者将我们之前的一个c文件直接修改为cpp文件

要调用c++里的函数, 需要将被调用的函数声明为``extern "C"''

extern "C" void application_entry(void *arg);

可以添加

std::cout << "hello world" << std::endl;

进行测试了。

串口已能正常打印输出。

至此,我们就可以任意

随心所欲地进行C++程序编写了。

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Keil-MDK是一种嵌入式软件开发工具,可以兼容STM32F4系列芯片支持库。 STM32F4系列芯片是意法半导体推出的一款高性能微控制器系列,内含ARM Cortex-M4内核。这些芯片广泛应用于各种领域的嵌入式系统开发。Keil-MDK中的支持库为开发者提供了简化开发流程、减少编程工作量的便利。 Keil-MDK中的支持库可以帮助开发者通过抽象的接口,快速访问STM32F4系列芯片的功能和外设。通过这些支持库,开发者可以方便地使用芯片上的GPIO口、定时器、USART、ADC等外设,而无需深入了解底层硬件细节。支持库还提供了一些高级功能,如中断控制、DMA等,可加快开发进度。 Keil-MDK中的支持库具有高度可移植性,支持不同型号的STM32F4芯片。通过简单的配置,开发者可以轻松选择合适的芯片型号,并利用相同的代码在不同的芯片上进行开发。这种可移植性大大简化了嵌入式系统的开发过程,提高了开发效率。 总之,Keil-MDK中的STM32F4系列芯片支持库为开发者提供了通用的接口和功能,简化了嵌入式系统的开发流程,提高了开发效率。开发者可以轻松地利用这些库进行芯片的驱动开发和应用程序的编写。 ### 回答2: Keil MDK是一款开发软件,适用于基于ARM Cortex-M内核的微控制器。在Keil MDK中,有一个支持库可以帮助开发者更加方便地使用STM32F4系列芯片STM32F4系列芯片是由STMicroelectronics开发的一款微控制器,该系列芯片采用了ARM Cortex-M4内核,具有强大的处理能力和丰富的外设资源。而Keil MDK中的支持库,专门针对STM32F4系列芯片进行了优化和适配。 通过使用Keil MDK中的STM32F4系列支持库,开发者可以方便地访问芯片的各种外设,如GPIO、USART、SPI、I2C等,并进行相关配置和控制。此外,支持库还提供了丰富的API函数,大大简化了开发过程,使开发者可以更加高效地编写代码。 Keil MDK中的STM32F4系列支持库还提供了相应的驱动程序,可以帮助开发者快速启动项目并进行调试。同时,支持库还包含了一些实用工具和示例代码,可以帮助开发者更好地理解和应用芯片的功能。 总之,Keil MDK中的STM32F4系列支持库为开发者提供了丰富的工具和资源,使他们能够更加轻松地开发基于STM32F4系列芯片的应用程序。无论是初学者还是有经验的开发者,都可以通过使用这个支持库,快速、高效地实现自己的项目。 ### 回答3: Keil MDKKeil公司开发的嵌入式软件开发工具,主要用于ARM处理器的软件开发。STM32F4系列是意法半导体公司推出的一款高性能的32位微控制器系列,它们在Keil MDK中具备完整的支持库。 在Keil MDK中,STM32F4系列芯片支持库提供了丰富的软件资源,以帮助开发人员进行STM32F4系列芯片的开发工作。这些支持库包括了各种驱动程序、函数库和例程,以支持各种外设的操作和功能实现。 首先,STM32F4系列芯片支持库提供了标准外设驱动程序,包括GPIO、USART、SPI、I2C、ADC等,这些驱动程序简化了对外设的配置和控制,使开发者可以更加方便地使用这些外设,并且提高了开发效率。 其次,STM32F4系列芯片支持库中还包括了各种函数库,例如操作系统(RTOS)支持库、射频(RF)支持库、USB支持库等。这些函数库提供了丰富的功能接口,使开发者可以直接调用这些接口来实现相应的功能,从而避免了重复编写代码的工作。 另外,STM32F4系列芯片支持库中还提供了大量的应用实例和示例代码,这些代码可以帮助开发者更好地理解和使用STM32F4系列芯片的各种功能。通过参考这些示例代码,开发者可以快速上手,减少开发周期。 总之,Keil MDK中的STM32F4系列芯片支持库为开发者提供了丰富的软件资源,使得开发者能够更加便捷地进行STM32F4系列芯片的软件开发工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爬呀爬的水滴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值