簡體   English   中英

使用 C 語言中的任意類型的函數指針和任意類型的變量參數對遠程嵌入式 mcu 上的任意函數進行單元測試

[英]unit test of arbitrary function on a remote embedded mcu using function pointers and variable arguments of arbitrary type, in C

這個想法是編寫一個通用單元測試函數,該函數將使用外部生成的測試輸入參數(例如來自通信)在嵌入式目標 mcu 端執行任意被測函數。 這樣遠程mcu的單元測試函數只寫一次,測試用例通過某種通信方式發送已知函數地址和輸入參數在主機PC上生成。

例如,如果在遠程 mcu 上有一個 int sumoftwoints(int, int) 的函數要測試,主機 pc 會將 sumoftwoints 的地址(鏈接器知道)和主機上生成的兩個隨機 int 傳遞給這個 unitTestFcn 指針pc 然后通過 uart 發送到嵌入式目標。 嵌入式目標通過接收到的函數指針“調用”提供的參數數量,並返回結果以發送回主機 pc 以進行結果檢查。

關於這是否合理或該測試方案存在根本缺陷的任何反饋?

好處是將單元測試從嵌入式端移到主機端,具有無限的測試用例可擴展性。

如果我要制作這樣的系統,我會讓它由 3 個部分組成:

  • 以函數地址和參數的形式指定測試的 PC 端軟件。
  • 在 PC 和 MCU 之間實現某種通信的接收器/發射器對,例如通過串行、Wifi 或任何可用的通信。
  • 在 MCU 上運行的測試執行器,它執行函數並返回結果(如果有)。

PC 端軟件可以讀取您的構建過程產生的一些工件以簡化事情,例如,您可以使用實際的函數名稱,而不必在測試中指定實際地址。

通信協議應該是基於文本的,依靠接收器來轉換適合接收平台的值。

執行器必須實現特定於 MCU 架構的 ABI。 這是你將達到你的第一個主要障礙的地方。 首先,ABI 變化很大。 從一些參數在一個或多個寄存器中傳遞的 Arm,一些作為指向實際參數的指針,一些在堆棧上,到 x86,它都是基於堆棧的。

您的下一個主要障礙將是結構。 如果您要允許調用帶有結構參數或返回值的函數,您必須知道您的編譯器如何選擇為每個特定結構打包字段。

總而言之,創建這樣的東西將是一項艱巨的任務,並且可能最終沒有那么有用,除非您投入大量工作,例如將其變成商業產品。

另一種選擇是在設備上留一些暫存空間,然后在PC上交叉編譯你的測試,然后將它們一個一個或一組發送到MCU,安裝在暫存空間中並執行。

在任何情況下,由於明顯的安全問題,此類功能絕不應包含在運輸產品中。

暫無
暫無

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

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