реклама на сайте
подробности

 
 
> Использование CMSIS (C) и scmRTOS (C++), Вопрос начинающего в C++
Alekseeey
сообщение Jan 18 2011, 09:55
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 21-09-10
Пользователь №: 59 626



Здравствуйте.

Ситуация такая:
Есть желание использовать совместно в одном проекте 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)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 9)
HARMHARM
сообщение Jan 18 2011, 10:16
Сообщение #2


читатель даташитов
****

Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999



Цитата(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 сделать патч, и патчить при замене библиотеки на новую версию.
Go to the top of the page
 
+Quote Post
neiver
сообщение Jan 18 2011, 12:29
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123



Куча предупреждений вылезает из-за опции -pedantic компилятора (очень полезная опция, кстати).
Вероятно файлы CMSIS компилируются как .cpp файлы, проверьте, что у них расширение должно быть *.c
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 18 2011, 12:36
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(neiver @ Jan 18 2011, 17:29) *
Вероятно файлы CMSIS компилируются как .cpp файлы, проверьте, что у них расширение должно быть *.c

Не, если makefile от человека с ником AHTOXA, то *.c файлы компилируются как си.
Видимо там эти структуры в хидерах.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jan 18 2011, 13:45
Сообщение #5


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Да, анонимные структуры\объединения имеются в хедерах.
Дело не в C++. У меня файлы компилятся в C с предупреждением warning: ISO C doesn't support unnamed structs/unions
В опциях компилятора указал -std=gnu99 но предупреждение не ушло, хотя и не мешает, проект собирается нормально, но настораживает сам факт предупреждения.
Я бы предпочёл, чтобы всё было чисто.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jan 18 2011, 17:59
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Анонмные структуры вещь нестандартная. Поэтому, если компилятор проглатывает и правильно все интерпретирует, то уже надо радоваться, несмотря на warnings.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jan 18 2011, 19:53
Сообщение #7


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Радости мало, ибо когда проект большой и нужный хедер инклудится в сотню файлов, то репорт компилятора выходит на несколько страниц текста. И приходится же просматривать - не упустить бы чего серьёзного.
Go to the top of the page
 
+Quote Post
Alekseeey
сообщение Jan 18 2011, 22:10
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 21-09-10
Пользователь №: 59 626



Цитата
И приходится же просматривать - не упустить бы чего серьёзного.


Верно.


Сейчас поставил другой тулчейн -- 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


Вобщем, должен быть способ отключить вывод избранных предупреждений. Не могу сообразить какой.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jan 19 2011, 09:13
Сообщение #9


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Разобрался путём тшательного чтения документации на компилятор (arm-none-eabi-xxx от Code Sourcery).
Оказывается, что опция -pedantic побуждает компилятор к строгому следованию стандарту несмотря на наличие опции -std=gnu99 которая подключает расширения gnu, коими и являются безымянные структуры\объединения.
Убрав опцию -pedantic я исключил только предупреждения, касающиеся расширений, что мне и требовалось.
Хотелось бы знать, не повлечёт ли это за собой неприятных последствий.
Go to the top of the page
 
+Quote Post
Alekseeey
сообщение Jan 20 2011, 10:57
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 21-09-10
Пользователь №: 59 626



Цитата(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, поскольку он по определению включает в себя все особенности поддерживаемые компилятором с данной опцией, и беспокоиться не о чем).
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st June 2025 - 02:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.0142 секунд с 7
ELECTRONIX ©2004-2016