Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Использование CMSIS (C) и scmRTOS (C++)
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > scmRTOS
Alekseeey
Здравствуйте.

Ситуация такая:
Есть желание использовать совместно в одном проекте scmRTOS и CMSIS для Cortex M3.
scmRTOS написана на C++.
Библиотека CMSIS написана на С. В этой библиотеке используются анонимные структуры, например:

/*------------- General Purpose Input/Output (GPIO) --------------------------*/
/** @brief General Purpose Input/Output (GPIO) register structure definition */
typedef struct
{
union {
__IO uint32_t FIODIR;
struct {
__IO uint16_t FIODIRL;
__IO uint16_t FIODIRH;
};
struct {
__IO uint8_t FIODIR0;
__IO uint8_t FIODIR1;
__IO uint8_t FIODIR2;
__IO uint8_t FIODIR3;
};
};
...
} LPC_GPIO_TypeDef;


Анонимные структуры запрещены в C++, при компиляции вылезает куча предупреждений: "warning: ISO C++ prohibits anonymous structs [-pedantic]".
В исходниках CMSIS, конечно, есть развязки:

#if defined ( __CC_ARM )
#pragma anon_unions
#endif

Но компилятор игнорирует прагму: "warning: ignoring #pragma anon_unions [-Wunknown-pragmas]".

Как мне заставить проект компилироваться корректно, не меняя исходников CMSIS?

Использую:
Eclipse
GCC toolchain от человека с ником Klen
make от человека с ником АНТОХА
scmRTOS (3.10)
CMSIS (lpc1768 release 26 July 2010)
HARMHARM
Цитата(Alekseeey @ Jan 18 2011, 11:55) *
В исходниках CMSIS, конечно, есть развязки:

#if defined ( __CC_ARM )
#pragma anon_unions
#endif

Но компилятор игнорирует прагму: "warning: ignoring #pragma anon_unions [-Wunknown-pragmas]".

Похоже, что эта pragma для другого компилятора. Видимо, придется подправить __CC_ARM и прагму под GCC. Для CMSIS сделать патч, и патчить при замене библиотеки на новую версию.
neiver
Куча предупреждений вылезает из-за опции -pedantic компилятора (очень полезная опция, кстати).
Вероятно файлы CMSIS компилируются как .cpp файлы, проверьте, что у них расширение должно быть *.c
AHTOXA
Цитата(neiver @ Jan 18 2011, 17:29) *
Вероятно файлы CMSIS компилируются как .cpp файлы, проверьте, что у них расширение должно быть *.c

Не, если makefile от человека с ником AHTOXA, то *.c файлы компилируются как си.
Видимо там эти структуры в хидерах.
IgorKossak
Да, анонимные структуры\объединения имеются в хедерах.
Дело не в C++. У меня файлы компилятся в C с предупреждением warning: ISO C doesn't support unnamed structs/unions
В опциях компилятора указал -std=gnu99 но предупреждение не ушло, хотя и не мешает, проект собирается нормально, но настораживает сам факт предупреждения.
Я бы предпочёл, чтобы всё было чисто.
sergeeff
Анонмные структуры вещь нестандартная. Поэтому, если компилятор проглатывает и правильно все интерпретирует, то уже надо радоваться, несмотря на warnings.
IgorKossak
Радости мало, ибо когда проект большой и нужный хедер инклудится в сотню файлов, то репорт компилятора выходит на несколько страниц текста. И приходится же просматривать - не упустить бы чего серьёзного.
Alekseeey
Цитата
И приходится же просматривать - не упустить бы чего серьёзного.


Верно.


Сейчас поставил другой тулчейн -- codesourcery.

Проект сделал тестовый (main.cpp), без scmRTOS, зато с CMSIS и анонимными структурами.

В настройках проекта выставлено Language Standard = ISO C90 with GNU extensions. (C/C++Build -> Settings -> Miscellaneous)

Предупреждений не возникает.

Фрагмент консоли с компиляцией (не для себя, для искушенных):
'Building file: ../src/lpc17xx_gpio.c'
'Invoking: ARM Sourcery Windows GCC C Compiler'
arm-none-eabi-gcc -O0 -Wall -Wa,-adhlns="src/lpc17xx_gpio.o.lst" -c -fmessage-length=0 -MMD -MP -MF"src/lpc17xx_gpio.d" -MT"src/lpc17xx_gpio.d" -mcpu=cortex-m3 -mthumb -o"src/lpc17xx_gpio.o" "../src/lpc17xx_gpio.c"
'Finished building: ../src/lpc17xx_gpio.c'
' '

Если же выставить ISO C99 (-std=c99), то возникает множество предупреждений на анонимные структуры: "Declaration does not declare anything" и еще возникают ошибки там, где к этим структурам обращается программа.

Вот кусок консольного вывода:
arm-none-eabi-gcc -O0 -Wall -std=c99 -Wa,-adhlns="src/lpc17xx_gpio.o.lst" -c -fmessage-length=0 -MMD -MP -MF"src/lpc17xx_gpio.d" -MT"src/lpc17xx_gpio.d" -mcpu=cortex-m3 -mthumb -o"src/lpc17xx_gpio.o" "../src/lpc17xx_gpio.c"
In file included from ../src/lpc17xx_gpio.h:31:0,
from ../src/lpc17xx_gpio.c:26:
../src/LPC17xx.h:200:6: warning: declaration does not declare anything


Вобщем, должен быть способ отключить вывод избранных предупреждений. Не могу сообразить какой.
IgorKossak
Разобрался путём тшательного чтения документации на компилятор (arm-none-eabi-xxx от Code Sourcery).
Оказывается, что опция -pedantic побуждает компилятор к строгому следованию стандарту несмотря на наличие опции -std=gnu99 которая подключает расширения gnu, коими и являются безымянные структуры\объединения.
Убрав опцию -pedantic я исключил только предупреждения, касающиеся расширений, что мне и требовалось.
Хотелось бы знать, не повлечёт ли это за собой неприятных последствий.
Alekseeey
Цитата(IgorKossak @ Jan 19 2011, 12:13) *
Хотелось бы знать, не повлечёт ли это за собой неприятных последствий.

Я думаю, что не должно.
Но в своем проекте я не отключил pedantic, а таки отредактировал хедеры, добавив __extension__ перед проблемными структурами. По крайней мере, если буду обновлять библиотеку я получу заново эти варнинги, просмотрю код, добавлю __extension__ и буду уверен, что в других местах не появилось новых сюрпризов.

codesourcery
gcc.pdf, страницы 47, 48
-pedantic
Выдает все предупреждения, которых требует стандарт ISO C и ISO C++; бракует программный код использующий запрещенные расширения или код, не соответствующий стандартам ISO C и ISO C++. Версия стандарта ISO C определяется опцией "-std".
Код, полностью соответствующий стандартам ISO C и ISO C++, должен верно компилироваться как с опцией -pedantic так и без нее (хотя, за редким исключением, может потребоваться уточнение версии ISO C с помощью опций "-std" или "-ansi"). Однако, без этой опции, определенные особенности и расширения C и C++ поддерживаются, а с ней - нет.
"-pedantic" не вызывает появление предупреждений при использовании альтернативных ключевых слов, начинающихся и оканчивающихся '__'. Предупреждения pedantic также отключены в выражениях, следующих после ключевого слова __extention__. Однако такой способ избежания предупреждений следует использовать исключительно в заголовочных файлах, и не использовать его непосредственно в коде программы. См. также Section 6.43 [Alternate Keywords], page 375.
Некоторые пользователи пытаются с помощью -pedantic проверять программы на строгое соответствие ISO C. Но скоро они обнаруживают, что это не срабатывает именно так, как они хотят: -pedantic находит некоторые "не-ISO" приемы программирования, но не все - только те, для которых стандарт ISO C _требует_ диагностику и некоторые другие, диагностика которых была добавлена (ключами компилятора?).
Функциональная возможность компилятора выдавать отчет о любых несоответствиях ISO C может быть полезна в некоторых случаях, но потребует большого количества дополнительной работы и будет совершенно отличаться от "-pedantic". Мы не планируем реализовывать такую возможность в ближайшем будущем.
Там, где стандарт определенный опцией "-std" представляет собой расширенный диалект GNU языка C, такой как gnu90 или gnu99, существует соответствующий _базовый_стандарт_, версия ISO C на которой базируется расширение GNU. Предупреждения от pedantic выдаются пользователю в случаях, когда этого требует базовый стандарт. (Нет смысла в предупреждениях выдаваемых исключительно для особенностей находящихся вне этого определенного диалекта GNU C, поскольку он по определению включает в себя все особенности поддерживаемые компилятором с данной опцией, и беспокоиться не о чем).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.