我正在編寫一些嵌入式C的單元測試,它在主機上運行(目前還沒有在目標上測試)並使用GCC進行編譯。我一直在使用Ceedling構建系統和Unity測試框架進行測試。單元測試C編譯器特定關鍵字
我想測試的其中一個文件包括一個文件(比如說ah),它包含另一個文件(比如cpu.h),它是嵌入式設備供應商提供的板級支持包的一部分,並使用特定關鍵字目標編譯器(例如__cregister
,諸如在extern __cregister volatile unsigned int IER;
。
另一個問題,再次與來自BSP包含這樣的文件,是內聯組件,如在#define FOO_ASM asm("FOO")
asm()
部分。
這些都當然會引發錯誤因爲GCC無法識別這些關鍵字時進行測試。
我原以爲我可以通過Ceedling生成一個模擬,通過在我的測試文件中添加#include "mock_a.h"
來阻止這些BSP頭被添加,但是GCC仍編譯a.h,因此b.h.
是否有解決這些問題的最佳實踐方法?
我可以在BSP文件中添加如下所示的內容,但我不願意修改供應商代碼,這些代碼會改變或覆蓋我的更改,我寧願瞭解如何正確隔離單元。
// Unknown how __cregister is initially defined
#ifdef TEST
#undef __cregister // Redefine __cregister to nothing
#define __cregister
#endif
extern __cregister volatile unsigned int IER;
我不確定,但它看起來像[博客部分](https://dmitryfrank.com/articles/unit_testing_embedded_c_applications#dealing_with_compiler-specific_stuff)可能會有幫助 - 在我嘗試大量BSP文件之前,歡迎您發表評論。 – Toby
很顯然,你不能在不是目標系統的系統上測試內聯彙編程序。 – Lundin
@Lundin Obvs。但問題是,隔離單元的方法是什麼?它包含一個內聯asm的文件? – Toby