簡體   English   中英

有關Misra規則11.6的查詢(MISRA C:2012)

[英]Query regarding Misra rule 11.6 (MISRA C:2012)

我無法在此行中解決米斯拉規則11.6警告:

uint32_t * delay = (uint32_t *)0x40086D0C ;

[ 僅供參考: typedef long unsigned int uint32_t;]

PC-Lint:注釋923:從int轉換為指針[MISRA 2012 Rule 11.6,必填]

我做了什么:

  • 明確類型轉換,但不起作用
  • 使用memset(),它正在工作,但這不是解決Misra警告的正確方法。 因為那是不必要的增加系統上的函數調用,它可能會降低系統性能。

您能否分享有關我的問題的有用想法? 我們將不勝感激。

皮棉一如既往的破碎 提交錯誤報告或僅卸載Lint。

MISRA-C:2012規則11.6是關於從指針到void的轉換為算術類型的指針! 因此,“從整數到指針的轉換[MISRA 2012規則11.6,必需]”是不正確的廢話,與引用的規則無關,他們不正確地引用了該引用。

關於整數到指針的轉換,有一個咨詢規則11.4。 該規則的目的是捕獲這種類型的轉換會導致指針對齊不正確的情況。 但是,您可以忽略規則11.4,而不會引起偏差,因為它是建議性的。

因此,除了咨詢規則外,您的代碼還符合MISRA的要求,盡管您需要在整數常量后附加一個U后綴,以便確定其他規則:

uint32_t* delay = (uint32_t*)0x40086D0Cu ;

並且指針最有可能應該是volatile uint32_t* ,以便此代碼有意義。

這是完全合理的強制轉換(假設您的指針是32位)。 在這種情況下,最好讓您的皮棉檢查器忽略該行。 MISRA規則可以防止常見的錯誤,但是某些操作(例如訪問內存映射的外圍設備)在規范內無法完成(據我所知)。

使用memset是一個非常糟糕的主意-它設置單個字節,因此您需要4次memset()調用來設置指針的4個字節。 您可以通過一次memcpy()調用獲得類似的效果,盡管我認為這不符合規范的精神。

對於memcpy()memset() ,您都不會看到性能下降。 任何值得精打細算的優化編譯器都將檢測到固定大小的memcpy ,並將其替換為單個32位MOV指令(或適用於您平台的模擬量)。 是c的例子

  1. 用32位移動替換了固定長度的內存集
  2. 意識到delay的值與addr的值相同
  3. 完全消除了delay

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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