2017-01-17 54 views
2

我正在編寫一些嵌入式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; 
+0

我不確定,但它看起來像[博客部分](https://dmitryfrank.com/articles/unit_testing_embedded_c_applications#dealing_with_compiler-specific_stuff)可能會有幫助 - 在我嘗試大量BSP文件之前,歡迎您發表評論。 – Toby

+0

很顯然,你不能在不是目標系統的系統上測試內聯彙編程序。 – Lundin

+0

@Lundin Obvs。但問題是,隔離單元的方法是什麼?它包含一個內聯asm的文件? – Toby

回答

1

它結束了我在我對OP的評論中遵循link中列出的方法。

所以從我原來的職位的例子

/* foo.h */ 
extern __cregister volatile unsigned int IER; 
#define FOO_BAR_ASM asm("BAR"); 

我創建以下文件,使用相同的名稱,test/support/目錄中,並取消了從測試構建設置真正的BSP文件包含路徑:

/*foo.h - in test/support */ 
extern volatile unsigned int IER; 
#define FOO_BAR_ASM 

然後加入包括像#include "mock_foo.h"到測試文件。