2013-01-16 233 views
8

我正在使用嵌入式設備,並且有一些最初使用IAR編譯器編譯的代碼。GCC中的'__IO'指令是什麼?

我正在嘗試使用GCC編譯器重新編譯所述代碼。

有一個特別的聲明:typedef __IO,它根本不會被編譯(「無法識別的符號錯誤」)。

任何人都可以建議我怎麼能得到這個聲明正確編譯?

+2

'的#define __IO volatile'甚至只是'的#define __IO ' –

+0

@Eddy_Em:發表回答不是評論。 – Clifford

+1

如果它是一個無法識別的符號,你怎麼知道它是一個typedef!? (不是)。您提到的代碼的一些示例可能很有用。 – Clifford

回答

10

如果它不被識別,將會因爲包含該定義的適當的系統標題未被包括在內。

它將在工具鏈提供的芯片支持頭文件中定義。它是類型限定符,或者更確切地說是一個將擴展爲類型限定符的宏(#define)。它是用來舉例如下:

__IO uint8_t CSSR; 

這裏uint8_t是類型,所以__IO不能在實際上是一個typedef,因爲它不是用在一個類型是有效的。 __IO宏擴展到特定編譯器所需的任何位置,以確保正確的I/O訪問和尋址。在I/O是內存映射的典型情況下,它將簡單地擴展爲volatile,因爲所有I/O都應聲明爲volatile以確保顯式訪問未被優化。

如果您想確定,請下載IAR工具的演示版本,並在頭文件中查看它是如何爲您的特定架構定義的。否則,您可能只使用#define __IO volatile

7

_IO的含義在C語言中是不穩定的......它不會優化代碼,並且其中使用_IO指定的變量值是不可預知的,或者將在不知道編譯器和用戶的情況下改變

1

這是一個老問題,但如果有人想知道ARM微控制器的這個問題,可以看到該定義在CMSIS庫中可用。例如,__IO被定義爲皮質-M4如下:

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