Что такое директива " IO " в GCC?
Я работаю над встроенным устройством, и есть некоторый код, который был первоначально скомпилирован с помощью компилятора IAR.
Я пытаюсь перекомпилировать код с помощью компилятора GCC.
существует определенное утверждение:typedef __IO
, который просто не компилируется ("ошибка нераспознанного символа").
может ли кто-нибудь предложить, как я могу получить этот оператор для правильной компиляции?
3 ответов
если он не распознан, это будет потому, что соответствующий системный заголовок, содержащий определение, не был включен.
он будет определен в заголовочном файле поддержки чипа, поставляемом с toolchain. Это спецификатор типа, а точнее макрос (#define
), который будет расширяться до квалификатора типа. Он используется, например, следующим образом:
__IO uint8_t CSSR;
здесь uint8_t
- Это тип, поэтому __IO на самом деле не может быть typedef
потому что он не используется где тип является действительным. Макрос __IO расширяется до того, что требуется конкретному компилятору для обеспечения правильного доступа и адресации ввода-вывода. В типичном случае, когда ввод-вывод сопоставлен с памятью, он просто расширится до volatile
поскольку все I/O должны быть объявлены изменчивыми, чтобы гарантировать, что явные доступы не оптимизированы.
если вы хотите быть уверены, загрузите демо-версию инструментов IAR и посмотрите в заголовочных файлах, как она определена для вашей конкретной архитектуры. В противном случае вы могли бы просто используйте #define __IO volatile
_IO смысл фитонциды как в языке Си...который не оптимизирует код и в котором значение, указанное для переменной с помощью _IO, будет непредсказуемым или будет изменяться без знания компилятора и пользователя
Это старый вопрос, но если кто-то хочет знать это для микроконтроллеров ARM, вы можете видеть, что определение доступно в библиотеке CMSIS. Например, __IO
определяется следующим образом для cortex-m4:
#define __IO volatile /*!< Defines 'read / write' permissions */
полный блок является копией, вставленной ниже (источник):
#ifdef __cplusplus
#define __I volatile /*!< Defines 'read only' permissions */
#else
#define __I volatile const /*!< Defines 'read only' permissions */
#endif
#define __O volatile /*!< Defines 'write only' permissions */
#define __IO volatile /*!< Defines 'read / write' permissions */
/* following defines should be used for structure members */
#define __IM volatile const /*! Defines 'read only' structure member permissions */
#define __OM volatile /*! Defines 'write only' structure member permissions */
#define __IOM volatile /*! Defines 'read / write' structure member permissions */