嵌入式測試:IAR單元測試示例

    嵌入式測試一般涉及硬件的模擬與控制,須要在單元測試用例中隨意模擬和控制硬件行爲,以及模擬中斷對全局變量的修改,並解決死循環、超時等問題。使用 Visual Unit 4 ,經過在測試用例中設置內部輸入,能夠隨意模擬和控制硬件行爲;利用測試用例的屢次賦值功能、跳過底層函數等功能,能夠輕鬆解決死循環、超時等問題。用Visual Unit 4作嵌入式單元測試特別舒服。

    這是Visual Unit 4.0 Beta2實現嵌入式測試的示例,產品代碼爲IAR項目。單元測試針對的是代碼功能邏輯,嵌入式測試也同樣。對於瞭解代碼功能的人來講,測試功能邏輯不難,但可能碰到前述的各類問題,使單元測試過程受阻,所以,本示例並未對代碼功能邏輯完成測試,只是說明嵌入式測試過程當中可能遇到的問題及如何利用Visual Unit 4的特有功能解決這些問題。

    一、使用IAR模板新建工程,能夠直接經過編譯,但會產生main函數重定義錯誤,由於測試工程也有一個main函數。可在產品代碼中對main函數作以下修改:
    #ifndef _VUNIT
    int main()
    {
        ...
    }
    #endif 

    二、函數SPI_RWData的第三個參數若是爲NULL,會崩潰,但好幾個函數調用SPI_RWData時都直接傳遞0,所以都會崩潰。應該先修改它的代碼,對第三個參數判斷空指針。示例中的產品代碼已做了修改,在使用第三個參數前判斷是否爲空指針。在嵌入式測試過程當中,若是某個底層函數執行時崩潰,一般應該先對該底層函數進行測試。

    三、函數Delayms會致使死循環,測試須要調用Delayms的函數時。嵌入式測試中,底層函數死循環是比較常見的。可將底層函數設爲skit it跳過,或設置底層輸入,方法是在左邊代碼窗口中,雙擊函數如Delayms,在彈出的窗口中,選中要設置底層輸入的變量,並在表格中填數據,若是不須要設底層輸入,則選中skit it。skit it是測試用例的一種特殊變量,其意義是直接跳過該函數。若是在某一用例中不跳過,需將其值設爲-1。

    四、在嵌入式測試工做中,若是被測函數調用的底層函數崩潰,但底層函數是別人寫的,能夠經過對底層函數設置底層輸入或skit it來避免崩潰。這一點與死循環相似。

    五、以下函數:
    void Delay100us(WORD us)
    {
        TIM_Cmd(TIM2,DISABLE);
        TIM2 -> CNT = 0;
        TIM2 -> ARR = us * 100;
        TIM_Cmd(TIM2, ENABLE);///< 開啓定時器
        while(TIM_GetFlagStatus(TIM2,TIM_FLAG_Update) == RESET)
        {__NOP();}
        TIM_ClearFlag(TIM2,TIM_FLAG_Update);
        TIM_Cmd(TIM2, DISABLE);///< 關閉定時器
    }
    紅色代碼可能形成死循環,這在嵌入式測試中也很常見,解決辦法是使用屢次賦值,讓while中的條件先爲真,以便執行循環,最後返回假,以便跳出循環。具體來講,能夠這樣處理:對TIM_GetFlagStatus設置底層輸入,讓它的return值爲RESET和1,即在表格中填RESET;1,這叫屢次賦值(分號隔開多個值),第一次調用會返回RESET,第二調用爲返回1。這裏,RESET的值爲0。

    六、總結:用Visual Unit 4作嵌入式單元測試特別舒服,嵌入式代碼在單元測試時常常會產生死循環之類的問題,並須要對硬件作各類控制,包括對中斷改寫全局變量的修改,這些,用Visual Unit 4均可以很輕鬆作到,一般只是點幾下鼠標,在表格中填數據就能夠了。

    七、代碼下載(包括IAR的頭文件,被測試代碼及測試工程):
    http://www.kailesoft.com/download/resource.html
相關文章
相關標籤/搜索