簡體   English   中英

如何為匯編語言內聯函數使用解決 MISRA C 錯誤?

[英]How to use resolve MISRA C error for assembly language inline function?

我在 PIC32 MCU C 代碼中使用與編譯器相關的匯編語言函數 asm()。 我的代碼在我的 C 代碼中只使用 asm("reset") 函數就可以編譯並正常工作。檢查 MISRA 合規性時,我收到以下 MISRA 錯誤:

函數 'asm' 未聲明,假定返回 int [MISRA 2012 Rule 17.3,強制]asm("reset");

asm("reset");

如何解決此匯編語言函數的 MISRA 錯誤? 我也嘗試創建函數宏來使用它,但仍然出現錯誤。

函數 'asm' 未聲明,假設返回 int [MISRA 2012 Rule 17.3,強制]ASM_RESET(void);

#define ASM_RESET(void) asm("reset")
ASM_RESET(void);

看起來 PC-Lint 沒有將asm識別為關鍵字。 它把它當作一個沒有原型的函數。 您可以嘗試將+rw(asm)添加到選項中。

另一方面,這個論壇帖子建議合法的方法是在僅包含程序集的獨立文件中定義reset函數,並為 C 文件顯示它的原型。

重置.c:

void reset(void) {
   asm("reset");
}

測試.c:

#include "reset.h"

...
reset();

asm是編譯器擴展關鍵字,而不是函數。 由於編譯器特定,它不會被您的靜態分析工具自動識別,並且您的編譯器的內聯匯編語法是“類函數”,因此它應用了函數原型規則。

您需要使用描述編譯器實現定義行為的配置文件或命令行選項來正確配置 PC-Lint。 這可能包括很多選項,但在這種情況下,您應該使用:

-dasm()=  

這將導致分析器忽略具有類似函數語法asm(...)

或者,您可以在靜態分析期間通過有條件地定義一個隱藏所有此類指令的宏來忽略內聯匯編器語法:

#if defined _lint
    #define asm( asmstr )
#endif

然而,這會隱藏檢查器的其他偏差,例如有關內嵌裝配的封裝和隔離的規則。 出於這個原因,您不應該使用與 C 代碼行混合的宏或內聯程序集,而應該定義一個包裝函數:

void reset(void) 
{
   asm("reset");
}

並將上面定義的reset()函數放在一個單獨的翻譯單元中,並簡單地從分析中省略該源代碼 - 就好像它是庫代碼一樣。

暫無
暫無

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

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