Перейти к содержанию
    

Использование CMSIS (C) и scmRTOS (C++)

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

 

Ситуация такая:

Есть желание использовать совместно в одном проекте 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)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В исходниках CMSIS, конечно, есть развязки:

 

#if defined ( __CC_ARM )

#pragma anon_unions

#endif

 

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

Похоже, что эта pragma для другого компилятора. Видимо, придется подправить __CC_ARM и прагму под GCC. Для CMSIS сделать патч, и патчить при замене библиотеки на новую версию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Куча предупреждений вылезает из-за опции -pedantic компилятора (очень полезная опция, кстати).

Вероятно файлы CMSIS компилируются как .cpp файлы, проверьте, что у них расширение должно быть *.c

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вероятно файлы CMSIS компилируются как .cpp файлы, проверьте, что у них расширение должно быть *.c

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

Видимо там эти структуры в хидерах.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, анонимные структуры\объединения имеются в хедерах.

Дело не в C++. У меня файлы компилятся в C с предупреждением warning: ISO C doesn't support unnamed structs/unions

В опциях компилятора указал -std=gnu99 но предупреждение не ушло, хотя и не мешает, проект собирается нормально, но настораживает сам факт предупреждения.

Я бы предпочёл, чтобы всё было чисто.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Анонмные структуры вещь нестандартная. Поэтому, если компилятор проглатывает и правильно все интерпретирует, то уже надо радоваться, несмотря на warnings.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Радости мало, ибо когда проект большой и нужный хедер инклудится в сотню файлов, то репорт компилятора выходит на несколько страниц текста. И приходится же просматривать - не упустить бы чего серьёзного.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Верно.

 

 

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

 

 

Вобщем, должен быть способ отключить вывод избранных предупреждений. Не могу сообразить какой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разобрался путём тшательного чтения документации на компилятор (arm-none-eabi-xxx от Code Sourcery).

Оказывается, что опция -pedantic побуждает компилятор к строгому следованию стандарту несмотря на наличие опции -std=gnu99 которая подключает расширения gnu, коими и являются безымянные структуры\объединения.

Убрав опцию -pedantic я исключил только предупреждения, касающиеся расширений, что мне и требовалось.

Хотелось бы знать, не повлечёт ли это за собой неприятных последствий.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хотелось бы знать, не повлечёт ли это за собой неприятных последствий.

Я думаю, что не должно.

Но в своем проекте я не отключил 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, поскольку он по определению включает в себя все особенности поддерживаемые компилятором с данной опцией, и беспокоиться не о чем).

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...