[英]GCC variable mapping and MISRA-C
我知道主要有兩種方法(有很多變體,使用雙域,每個外圍設備的數據結構等)來聲明 memory 映射寄存器與 GCC:
volatile uint32_t *pMyRegister = (uint32_t *)0xDEADBEEFUL;
volatile uint32_t MyRegister __attribute((section(".register_section")));
然后是 map LD 文件中的部分。不幸的是,這些方法似乎都不與 MISRA-C 編碼規則兼容,第一個是因為存在未授權(由 MISRA)從 integer 強制轉換為指針,第二個是因為屬性關鍵字。
我的問題是:有沒有辦法(使用第二種解決方案)在不影響代碼的 ANSIness 的情況下(即沒有編譯器特定關鍵字)在一個部分中使用 map 變量。
謝謝
首先,由於缺少volatile
,兩者都不正確。 請參閱如何從固件訪問硬件寄存器? 它還簡要介紹了 MISRA-C。
為了回答這個問題,這條規則 MISRA-C:2012 11.4 是建議性的,並附有一個理由說(最后的注釋是我附加的):
“......但在尋址 memory 映射寄存器或其他硬件特定功能時可能是必要的。如果使用整數和指針之間的轉換,應注意......”[不要導致未定義的未對齊行為]
因此,您可以安全地為您的寄存器聲明忽略此規則,如果需要,請參考規則 11.4 的基本原理。 由於它是建議性的,因此不需要偏離(但最好您應該記錄您仍然忽略該規則)。
值得注意的是,從 MISRA-C 的角度來看,您的兩個版本中的前一個更可取,因為它不包含您需要記錄它們的使用方式的非標准擴展,否則根據其他 MISRA 規則是必需的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.