Что такое директива " 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 */