C ++ 11 на MicroVision 5.13 и ARMCC 5.05

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

};
}

затем я начинаю получать сообщения из окон о том, что «компилятор 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, обновление 1, сборка 106.

1

Решение

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

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

2

Другие решения

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

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

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

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

1

Вы сказали —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.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 linkage, т.е. не в пределах extern "C" группа.

0