stm32f4 g++错误,涉及newlib _kill_r、_kill、_getpid_r、_getpid、

stm32f4 g++ error involving newlib _kill_r,_kill, _getpid_r, _getpid,

本文关键字:kill getpid newlib g++ 错误 涉及 stm32f4      更新时间:2023-10-16

在stm32f4微芯片上编译c++代码时遇到问题。

目标

我正在努力实现以下几点:

  1. 编译C++代码到stm32f4发现(已经完成成功地完成了一个基本程序[通过构造函数的实现以及其他c++特定功能])
  2. 使用ST提供的外围设备库编写代码(在这种情况下,我使用USART功能)
  3. 使用GNU工具使用商业IDE编译out代码(这是一项学习任务)

问题

我有两个项目设置,一个是c项目,将正确编译。我还用这个项目的输出闪存了stm32f4,它已经正确运行了。第二个项目使用相同的代码,对C++编译器的make文件和文件名进行了细微的更改(代码没有差异)。C项目成功编译,C++项目抛出错误。

这两个项目及其在终端上的输出都可以在这里找到:https://dl.dropboxusercontent.com/u/32204435/USART.tar.gz

设置

我使用的是Ubuntu 12.04.3 LTS 64位。我已经按照本网站上的说明安装了arm none-eabi工具链:视频。se/2012/07/get-与-stm32f4-在ubuntu-nux/上启动

信息与分析

据我所知,在arm-none-eabi-g++编译器中支持newlib时出现了一个错误。我不明白为什么会出现错误,因为这两个项目之间没有代码差异。像printf这样的newlib函数在使用时也会产生类似的错误。在USART示例中,我限制了项目使用newlib的任何可能性(唯一的例外是数据类型)。错误似乎不是由newlib引起的,而是由丢失的硬件头(或称为newlib存根)(syscalls.h)引起的

有人能在C++支持下帮助构建这个项目吗?甚至可以提供一个在newlib中无错误使用代码的解决方案(比如printf[或者,我知道有一个很大的问题,来自iostream的cout])?

我仍在学习,我17岁了,没有老师(自我驱动),所以可能看起来缺乏经验,我就是:)预计会有知识差距。

圣诞快乐!

在Makefile上向te CFLAGS添加-fno rtti和-fno异常。

或者,您可以将此破解添加到编译文件

extern "C" int __aeabi_atexit(void *obj, void (*dtr)(void *), void *dso_h) {
(void) obj;
(void) dtr;
(void) dso_h;
return 0;
}
void *__dso_handle = 0;
/**
* This is an error handler that is invoked by the C++ runtime when a pure virtual function is called.
* If anywhere in the runtime of your program an object is created with a virtual function pointer not
* filled in, and when the corresponding function is called, you will be calling a 'pure virtual function'.
* The handler you describe should be defined in the default libraries that come with your development environment.
*/
extern "C" void __cxa_pure_virtual() {
while (1)
;
}
namespace __gnu_cxx {
void __verbose_terminate_handler() {
while(1)
;
}
}

这将禁用异常检查上的信号跟踪。

好黑客!

对于rtti和异常的使用,您需要定义一些系统调用实现:

在我的编译器(gcc-arm嵌入式4.8+newlib nano)中,这个解决方法可以很好地工作(添加到名为src/hack.cpp的新文件):

extern "C" int __aeabi_atexit(void *obj, void (*dtr)(void *), void *dso_h) {
return 0;
}
/* Enable if your stub don't provide dso handle symbol */
#if 0
void *__dso_handle = 0;
#endif
extern "C" void __cxa_pure_virtual() {
while (1)
;
}
namespace __gnu_cxx {
void __verbose_terminate_handler() { while(1) ; }
}
extern "C" int _getpid(void) {
return 1;
}
extern "C" void _kill(int pid) { while(1) ; }
extern "C" int _end;
static char *end_of_data = (char *) &_end;
/*
* WARNING: No stack/heap colition check.
* For check colition and stack growing overflow use SP register value
* or RAM end limit depeding of processor architecture
*/
extern "C" char *_sbrk (int delta) {
char *ptr = end_of_data;
end_of_data += delta;
return ptr;
}

如果未定义的符号(如_write或_isatty)仍然存在问题,请将-lnosys添加到链接器标志中。

生成的可执行文件比非异常版本稍胖。(大约8K)但如果你需要例外情况,并且rtti机制在带有1M闪存的Cortex-M4上的开销很小