MicroVision 5.13 和 ARMCC 5.05 上的 C++11
C++11 on MicroVision 5.13 and ARMCC 5.05
我有一个适用于 STM32F407 处理器的 uVision 5.13 项目,我也在使用 RTX 操作系统,我正在尝试使用一些 C++11 功能,例如作用域枚举,但是当我将 --cpp11编译器选项 我从 cmsis headers:
之一收到此错误
compiling RTX_Conf_CM.c...
C:\Keil\ARM\PACK\ARM\CMSIS.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 的消息 "The ARM C/C++ Compiler has stopped working" 每次编译包含范围枚举的 header 文件时。这是 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。
第一个错误是完全正确的,即使在C++98中也被禁止了。
然而,无论您的代码如何,编译器崩溃都是一个 ARMCC 错误。即使您尝试编译 .mp3 文件,它也不会崩溃。
为了后代,我已经向 ARM 提交了一个错误,他们告诉我:
The internal fault is cause by a known issue to do with having scoped enums, and browse
information selected (--omf_browse command line option, Output->Browse Information in the
gui).
The fact the CMSIS-RTOS kernel does not compile with --cpp11 I shall raise with the technical
team as a fault.
我想他们会在未来的版本中解决这两个问题。
您是否在 c/c++ 页面的 "Misc Controls" 中说过 --cpp11?
你说的是所有文件的cpp11模式。到 .cpp 和 .c
尝试 test.c 与 --cpp11:
//an C file: test.c
#ifdef __cplusplus
#error c++ mode
#endif
或在 *.obj 中查看损坏的符号
这么说,两年半过去了,他们仍然还没修好?
看来有两件事必须要做。
我将我的程序重构为:
int main(void){
main_rtx();
}
然后在RTX_CM_lib.h中,我将第414行更改为
extern int main_rtx(void);
修复了 "address of error"
然后在第 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"。
这是 hack 修复程序,仅供我在 STM32F746 上测试 C11,但有例外。我宁愿输入
#ifdef __cplusplus
extern "C" {
#endif
//external declarations
#ifdef __cplusplus
} //extern "C"
#endif
围绕所有外部声明。
注意。 int main_rtx(void)
必须使用 cpp 链接声明,即 not 在 extern "C"
组中。
我有一个适用于 STM32F407 处理器的 uVision 5.13 项目,我也在使用 RTX 操作系统,我正在尝试使用一些 C++11 功能,例如作用域枚举,但是当我将 --cpp11编译器选项 我从 cmsis headers:
之一收到此错误compiling RTX_Conf_CM.c...
C:\Keil\ARM\PACK\ARM\CMSIS.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 的消息 "The ARM C/C++ Compiler has stopped working" 每次编译包含范围枚举的 header 文件时。这是 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。
第一个错误是完全正确的,即使在C++98中也被禁止了。
然而,无论您的代码如何,编译器崩溃都是一个 ARMCC 错误。即使您尝试编译 .mp3 文件,它也不会崩溃。
为了后代,我已经向 ARM 提交了一个错误,他们告诉我:
The internal fault is cause by a known issue to do with having scoped enums, and browse information selected (--omf_browse command line option, Output->Browse Information in the gui).
The fact the CMSIS-RTOS kernel does not compile with --cpp11 I shall raise with the technical team as a fault.
我想他们会在未来的版本中解决这两个问题。
您是否在 c/c++ 页面的 "Misc Controls" 中说过 --cpp11?
你说的是所有文件的cpp11模式。到 .cpp 和 .c
尝试 test.c 与 --cpp11:
//an C file: test.c
#ifdef __cplusplus
#error c++ mode
#endif
或在 *.obj 中查看损坏的符号
这么说,两年半过去了,他们仍然还没修好?
看来有两件事必须要做。
我将我的程序重构为:
int main(void){
main_rtx();
}
然后在RTX_CM_lib.h中,我将第414行更改为
extern int main_rtx(void);
修复了 "address of error"
然后在第 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"。
这是 hack 修复程序,仅供我在 STM32F746 上测试 C11,但有例外。我宁愿输入
#ifdef __cplusplus
extern "C" {
#endif
//external declarations
#ifdef __cplusplus
} //extern "C"
#endif
围绕所有外部声明。
注意。 int main_rtx(void)
必须使用 cpp 链接声明,即 not 在 extern "C"
组中。