C++11 на MicroVision 5.13 и ARMCC 5.05

У меня есть рабочий проект uVision 5.13 для процессора STM32F407, я также использую операционную систему RTX и пытаюсь использовать некоторые функции С++ 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.

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

namespace TestNamespace
{

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

class TestClass
{

//All the class code here

};
}

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

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.


person jcgalveza    schedule 06.01.2015    source источник


Ответы (4)


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

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

person MSalters    schedule 07.01.2015
comment
Спасибо за ваш ответ, я опубликовал ответ, полученный от ARM по обоим вопросам. Я надеюсь, что они исправят эти две проблемы в ближайшем будущем. - person jcgalveza; 07.01.2015

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

Внутренняя ошибка вызвана известной проблемой, связанной с перечислением областей и выбранной информацией просмотра (опция командной строки --omf_browse, Output->Browse Information в графическом интерфейсе).

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

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

person jcgalveza    schedule 07.01.2015

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

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

попробуйте test.c с --cpp11:

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

или см. *.obj для искаженных символов

person OPA    schedule 18.04.2016

Итак, прошло два с половиной года, а они до сих пор не исправили это?

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

Я реорганизовал свою программу в:

int main(void){
    main_rtx();
}

затем в RTX_CM_lib.h я изменил строку 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".

person Flip    schedule 24.07.2017