我正在使用嵌入式設備,並且有一些最初使用IAR編譯器編譯的代碼。GCC中的'__IO'指令是什麼?
我正在嘗試使用GCC編譯器重新編譯所述代碼。
有一個特別的聲明:typedef __IO
,它根本不會被編譯(「無法識別的符號錯誤」)。
任何人都可以建議我怎麼能得到這個聲明正確編譯?
我正在使用嵌入式設備,並且有一些最初使用IAR編譯器編譯的代碼。GCC中的'__IO'指令是什麼?
我正在嘗試使用GCC編譯器重新編譯所述代碼。
有一個特別的聲明:typedef __IO
,它根本不會被編譯(「無法識別的符號錯誤」)。
任何人都可以建議我怎麼能得到這個聲明正確編譯?
如果它不被識別,將會因爲包含該定義的適當的系統標題未被包括在內。
它將在工具鏈提供的芯片支持頭文件中定義。它是類型限定符,或者更確切地說是一個將擴展爲類型限定符的宏(#define
)。它是用來舉例如下:
__IO uint8_t CSSR;
這裏uint8_t
是類型,所以__IO不能在實際上是一個typedef
,因爲它不是用在一個類型是有效的。 __IO宏擴展到特定編譯器所需的任何位置,以確保正確的I/O訪問和尋址。在I/O是內存映射的典型情況下,它將簡單地擴展爲volatile
,因爲所有I/O都應聲明爲volatile以確保顯式訪問未被優化。
如果您想確定,請下載IAR工具的演示版本,並在頭文件中查看它是如何爲您的特定架構定義的。否則,您可能只使用#define __IO volatile
_IO的含義在C語言中是不穩定的......它不會優化代碼,並且其中使用_IO指定的變量值是不可預知的,或者將在不知道編譯器和用戶的情況下改變
這是一個老問題,但如果有人想知道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 */
'的#define __IO volatile'甚至只是'的#define __IO ' –
@Eddy_Em:發表回答不是評論。 – Clifford
如果它是一個無法識別的符號,你怎麼知道它是一個typedef!? (不是)。您提到的代碼的一些示例可能很有用。 – Clifford