关于MicroVision 5.13和ARMCC 5.05的C ++ 11

时间:2015-01-06 17:06:45

标签: c++ c++11 arm keil armcc

我有一个用于STM32F407处理器的uVision 5.13项目,我也在使用RTX操作系统,我正在尝试使用某些C ++ 11功能,例如scoped enums但是当我放入--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 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

对于后人,我已经向ARM提交了一个错误,他们告诉我:

  

内部错误是由已知问题引起的,具有作用域的枚举和浏览   选择的信息(--omf_browse命令行选项,输出 - >浏览信息   GUI)。

     

CMSIS-RTOS内核不能用--cpp11编译的事实我将提出技术问题   团队是一个错误。

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

答案 2 :(得分:0)

你在c / c ++页面的“Misc Controls”中说过--cpp11吗?

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

使用--cpp11:

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

或查看* .obj表示错位符号

答案 3 :(得分: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);

可能会有更多,但可能性是如果你有一个关于未解决的符号的链接器错误,那是由于缺少" C"在外部声明中。

这是修复,只是为了让我在STM32F746上测试C11异常。我宁愿放入

#ifdef __cplusplus
   extern "C" {
#endif

    //external declarations

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

围绕所有外部声明。

NB。必须使用cpp链接声明int main_rtx(void),即extern "C"组中的