2015-01-06 14 views
1

У меня есть рабочий проект uVision 5.13 для процессора STM32F407, я также использую операционную систему RTX, и я пытаюсь использовать некоторые функции C++ 11, такие как скопированные перечисления но когда я ставлю опцию --cpp11 компилятора я получаю эту ошибку от одного из заголовков cmsis:C++ 11 на MicroVision 5.13 и ARMCC 5.05

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** 

That's компиляции тех же источников, что работает нормально без опции --cpp11.

Затем, если добавить один из поддерживаемых C++ 11 функций, например:

namespace TestNamespace 
{ 

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

class TestClass 
{ 

//All the class code here 

}; 
} 

тогда я начинаю получать сообщения из окон, что «ARM C/C++ Compiler перестал работать» каждый раз, когда файл заголовка, содержащий скопированное перечисление, скомпилирован. Это проблема в окнах:

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 обновление 1 билд 106.

ответ

2

Первая ошибка абсолютно правильно, даже в C++ 98 эта практика была запрещена.

Ошибка компилятора, однако, является ошибкой ARMCC, независимо от вашего кода. Даже если вы попытались скомпилировать файл .mp3, он не должен терпеть крах.

+0

Спасибо за ваш ответ, я опубликовал ответ, полученный мной от ARM по обоим вопросам. Надеюсь, они исправит эти две проблемы в ближайшем будущем. – jcgalveza

1

Для потомков, я подал ошибка с ARM, и они сказали мне, что это:

Внутренняя неисправность причина по известной проблеме, чтобы сделать с того, областью действия перечислений, а также просматривать информацию выбранной (- -comf_browse командной строки, Output-> Просмотр информации в gui).

Тот факт, что ядро ​​CMSIS-RTOS не скомпилировано с помощью --cpp11 Я буду поднять с технической командой в качестве ошибки.

Я полагаю, что они исправят обе проблемы в будущих версиях.

0

Вы сказали --cpp11 в разделе «Другие элементы управления» страницы c/C++?

Вы сказали, что режим cpp11 для всех файлов. Для .cpp и .c

попробовать test.c с --cpp11:

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

или увидеть в * .obj для искалеченных символов

0

Таким образом, это два с половиной года спустя и они еще не исправили?

Итак, есть две вещи, которые нужно сделать.

Я снова факторизуется свою программу в:

int main(void){ 
    main_rtx(); 
} 

затем в RTX_CM_lib.ч, я изменил линию 414

extern int main_rtx(void); 

Это зафиксировало адрес «ошибки»

Тогда есть четыре extern "C" декларации приходится делать на линиях 72-76:

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» в объявлениях extern.

Это исправление взлома, только для меня, чтобы проверить C11 с исключениями на STM32F746. Я предпочел бы поставить

#ifdef __cplusplus 
    extern "C" { 
#endif 

    //external declarations 

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

вокруг всех внешних объявлений.

NB. int main_rtx(void) должен быть объявлен с помощью связи cpp, то есть не в группе extern "C".

+0

Исключения, по-видимому, работают в пределах потоков по крайней мере ... – Flip