GCC中的'__IO'指令是什么?

时间:2013-01-16 13:40:07

标签: gcc embedded

我正在使用嵌入式设备,并且有一些代码最初是使用IAR编译器编译的。

我正在尝试使用GCC编译器重新编译所述代码。

有一个特定的声明:typedef __IO,它根本没有被编译(“无法识别的符号错误”)。

有人可以建议我如何正确编译这个语句吗?

3 个答案:

答案 0 :(得分:11)

如果无法识别,那将是因为未包含包含该定义的适当系统头。

它将在随工具链提供的芯片支持头文件中定义。它是类型限定符,或者更确切地说是一个宏(#define),它将扩展为类型限定符。它的使用例如如下:

__IO uint8_t CSSR;

此处uint8_t是类型,因此__IO实际上不能是typedef,因为在类型有效的情况下不使用它。 __IO宏扩展到特定编译器所需的任何内容,以确保正确的I / O访问和寻址。在I / O是内存映射的典型情况下,它将简单地扩展为volatile,因为所有I / O都应该声明为volatile,以确保不优化显式访问。

如果您想确定,请下载IAR工具的演示版本,并查看头文件中的特定体系结构的定义方式。否则您可能只使用#define __IO volatile

答案 1 :(得分:7)

_IO意味着在C语言中使用volatile ...它不会优化代码,并且使用_IO为变量声明的值将是不可预测的,或者在不知道编译器和用户的情况下会发生变化

答案 2 :(得分:2)

这是一个老问题,但如果有人想知道ARM微控制器的这个问题,您可以看到该定义在CMSIS库中可用。例如,对于cortex-m4,__IO定义如下:

#define     __IO    volatile             /*!< Defines 'read / write' permissions */

完整的区块会在下面复制粘贴(Source):

#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 */