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

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

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

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

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

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

    4、在嵌入式測試工作中,如果被測函數調用的底層函數崩潰,但底層函數是別人寫的,可以通過對底層函數設置底層輸入或skit it來避免崩潰。這一點與死循環類似。

    5、如下函數:
    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。

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

    7、代碼下載(包括IAR的頭文件,被測試代碼及測試工程):
    http://www.kailesoft.com/download/resource.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章