簡體   English   中英

GCC 變量映射和MISRA-C

[英]GCC variable mapping and MISRA-C

我知道主要有兩種方法(有很多變體,使用雙域,每個外圍設備的數據結構等)來聲明 memory 映射寄存器與 GCC:

  • 要么使用指向正確地址的指針,如volatile uint32_t *pMyRegister = (uint32_t *)0xDEADBEEFUL;
  • 或手動定義一個變量和 map 像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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM