1

我有一个适用于 STM32F407 处理器的工作 uVision 5.13 项目,我也在使用 RTX 操作系统,我正在尝试使用一些 C++11 功能,例如范围枚举,但是当我放置 --cpp11 编译器选项时,我收到了这个来自 cmsis 标头之一的错误:

compiling RTX_Conf_CM.c...
C:\Keil\ARM\PACK\ARM\CMSIS\4.2.0\CMSIS_RTX\INC\RTX_CM_lib.h(250): error: #390: function "main" may not be called or have its address taken osThreadDef_t os_thread_def_main = {(os_pthread)main, osPriorityNormal, 1, 4*OS_MAINSTKSIZE };
RTE\CMSIS\RTX_Conf_CM.c: 0 warnings, 1 error**

那是在编译没有 --cpp11 选项的情况下可以正常工作的相同源代码。

然后,如果我添加一个受支持的 C++11 功能,如下所示:

namespace TestNamespace
{

enum class Test : std::int16_t
{
  TestValue1 = 0
};

class TestClass
{

//All the class code here

};
}

然后每次编译包含作用域枚举的头文件时,我开始从 Windows 接收消息“ARM C/C++ 编译器已停止工作”。这是 Windows 中的问题签名:

Problem Event Name: APPCRASH
Application Name: ArmCC.exe
Application Version: 5.5.0.106
Application Timestamp: 547650a9
Fault Module Name: ArmCC.exe
Fault Module Version: 5.5.0.106
Fault Module Timestamp: 547650a9
Exception Code: c0000005
Exception Offset: 003f566a
OS Version: 6.1.7601.2.1.0.256.1
Locale ID: 1033
Additional Information 1: 0a9e
Additional Information 2: 0a9e372d3b4ad19135b953a78882e789
Additional Information 3: 0a9e
Additional Information 4: 0a9e372d3b4ad19135b953a78882e789

所以,我做错了什么或者那些是 ARMCC 错误?

我的 uVision 版本是 5.13,编译器版本是 5.05 update 1 build 106。

4

4 回答 4

2

第一个错误是绝对正确的,即使在 C++98 中这种做法也被禁止了。

然而,无论您的代码如何,编译器崩溃都是一个 ARMCC 错误。即使您尝试编译 .mp3 文件,它也不应该崩溃。

于 2015-01-07T14:20:52.347 回答
1

为了后代,我向 ARM 提交了一个错误,他们告诉我:

内部错误是由一个已知​​问题引起的,该问题与选择范围枚举和浏览信息有关(--omf_browse 命令行选项,gui 中的输出->浏览信息)。

CMSIS-RTOS 内核无法使用 --cpp11 编译的事实我将与技术团队一起提出错误。

我想他们会在未来的版本中解决这两个问题。

于 2015-01-07T17:29:07.007 回答
0

您在 c/c++ 页面的“Misc Controls”中是否说过 --cpp11 ?

您对所有文件说 cpp11 模式。转至 .cpp 和转至 .c

使用 --cpp11 尝试 test.c:

//an C file: test.c
#ifdef __cplusplus
#error c++ mode
#endif

或查看 *.obj 了解损坏的符号

于 2016-04-18T17:49:27.030 回答
0

所以,两年半过去了,他们没有修好?

所以似乎有两件事要做。

我将我的程序重新分解为:

int main(void){
    main_rtx();
}

然后在 RTX_CM_lib.h 中,我将第 414 行更改为

extern int main_rtx(void);

修复了“错误地址”

然后在第 72-76 行有四个extern "C"声明:

extern "C" OS_TID rt_tsl_self(void);
extern "C" void rt_mut_init(OS_ID mutex);
extern "C" OS_RESULT rt_mut_relase(OS_ID mutex);
extern "C" OS_RESULT rt_mut_wait(OS_ID mutex, int16_t timeout);

以及第 215 行

extern "C" void osTimerThread(void const *argument);

可能还有更多,但很可能如果您遇到有关未解析符号的链接器错误,那是由于 extern 声明中缺少“C”。

这是 hack 修复,只是为了让我在 STM32F746 上测试 C11,但有例外。我宁愿放一个

#ifdef __cplusplus
   extern "C" {
#endif

    //external declarations

#ifdef __cplusplus
    } //extern "C"
#endif

围绕所有外部声明。

注意。int main_rtx(void)必须用 cpp 链接声明,即不在一个extern "C"组内。

于 2017-07-24T12:51:12.593 回答