2011-12-19 71 views
7

我爲非POSIX嵌入式系統編寫項目,因此無法使用gcc選項--coverage(我沒有讀取或寫入)。我還能做什麼來產生像gcov一樣的輸出。我有一個輸出功能。如何對嵌入代碼進行覆蓋

+1

代碼覆蓋率要少得多常見於嵌入式系統完成。但對你而言,一個好的答案需要關於你的系統的更多細節。什麼CPU?什麼OS?什麼編譯器工具鏈? – TJD 2011-12-19 18:01:00

+1

你只需要寫功能或讀寫功能嗎?如果只是寫入(打開,關閉,寫入),你可以創建自己的,也許寫輸出到串行端口在其他地方存儲/記錄。 – 2011-12-19 18:36:55

+0

是否可以在可以使用coverage選項的系統上編譯和運行測試? – 2011-12-19 21:30:55

回答

9

它可以通過帶嵌入式跟蹤的處理器,暴露跟蹤端口的電路板設計以及合適的硬件調試器和相關軟件來完成。例如,許多基於Cortex-M的器件都包含ARM的嵌入式跟蹤宏單元(ETM),Keil的uVision IDE和ULINK-Pro調試器支持這種設備,以提供代碼覆蓋率和指令/源級跟蹤以及實時分析。硬件跟蹤的優點是非侵入性 - 代碼可以實時運行。

如果您沒有硬件支持,您可能不得不求助於模擬。許多工具鏈包括一個指令級仿真器,它將執行跟蹤,代碼覆蓋和分析,但您可能必須創建調試腳本或代碼存根以模擬硬件來強制執行所有路徑。

第三種替代方法是在帶有存根的桌面平臺上構建代碼,以取代目標硬件依賴關係,並對其執行測試和代碼覆蓋。您必須相信目標C編譯器和測試系統編譯器都會使用相同的語義翻譯源代碼。這裏的優點是可用的調試工具通常優於嵌入式系統可用的調試工具。在任何硬件可用之前,您還可以測試大部分代碼,並且在大多數情況下執行代碼的速度要快得多,可能允許進行更廣泛的測試。

沒有POSIX API並不排除使用GCC,它只是排除了使用GNU C庫。在沒有POSIX的嵌入式系統上,使用替代C庫,如Newlib。 Newlib有一個系統移植層,用於實現I/O和基本堆管理。

0

我們family of C/C++ test coverage tools儀器源代碼,產生程序,你與你的嵌入式編譯器來編譯,將收集的測試覆蓋率的數據變成了「小」數據結構添加到程序。這適用於各種方言,包括ANSI,GCC,Microsoft和GreenHills。

您必須將該數據結構從嵌入式執行上下文導出到PC上的文件;通常使用備用串行或並行端口以及特定於您的端口的一小部分自定義代碼很容易。這些工具將提供測試覆蓋率視圖和摘要結果文件。

因此,在大多數實際情況下,您可以使用這些工具從嵌入式系統收集測試覆蓋率數據。

1

免責聲明:我所工作的公司(Rapita Systems)提供針對嵌入式應用的代碼覆蓋解決方案。

因爲嵌入式系統帶來了自己的,特殊的和廣泛變化的需求,所以代碼覆蓋的「最佳」解決方案也有很大差異。

  • 如果您有基於跟蹤的設備,如具有ETM或啓用了NEXUS的部件的ARM芯片,則可以在不通過調試器進行檢測的情況下執行覆蓋。
  • 否則,你最有可能面臨着基於儀器的解決方案:
    • 對於RAM有限的解決方案,很好地解決是寫儀器到I/O端口
    • 或者,你可以記錄儀器來一個RAM緩衝區,並使用各種方法從目標中提取這些數據。

當然,很多代碼覆蓋率的不同口味的還有:函數,語句,決策/分支,MC/DC