国模大胆一区二区三区

<address id="jrzx9"><nobr id="jrzx9"></nobr></address>

    <sub id="jrzx9"><listing id="jrzx9"><mark id="jrzx9"></mark></listing></sub>

    <address id="jrzx9"><listing id="jrzx9"><mark id="jrzx9"></mark></listing></address>
        <sub id="jrzx9"></sub>
        <sub id="jrzx9"><listing id="jrzx9"><mark id="jrzx9"></mark></listing></sub><address id="jrzx9"><nobr id="jrzx9"></nobr></address>
        <address id="jrzx9"><var id="jrzx9"><ins id="jrzx9"></ins></var></address>
        <address id="jrzx9"><listing id="jrzx9"></listing></address><form id="jrzx9"><dfn id="jrzx9"></dfn></form>
        <span id="jrzx9"><dfn id="jrzx9"></dfn></span>
          <sub id="jrzx9"></sub>
        <address id="jrzx9"><dfn id="jrzx9"></dfn></address>

        <address id="jrzx9"></address>

        <address id="jrzx9"><dfn id="jrzx9"><ins id="jrzx9"></ins></dfn></address>
        <address id="jrzx9"><dfn id="jrzx9"></dfn></address>
        <address id="jrzx9"><dfn id="jrzx9"><ins id="jrzx9"></ins></dfn></address>

        <address id="jrzx9"><dfn id="jrzx9"></dfn></address>

        通過DT10檢測多任務阻塞死鎖問題

        創提信息
        2021/10/08

        分享到

        DT10是新一代的動態測試工具,可以長時間跟蹤記錄目標程序執行情況,獲取目標程序動態執行數據,幫助進行難于重現的Bug錯誤分析,覆蓋率檢測,性能測試,變量跟蹤,多任務程序等等功能。
         
        VxWorks在國內航天軍工、軌道交通等實時性要求較高的領域應用非常廣泛,其提供多任務,中斷等機制較好的滿足實時嵌入式領域的需求,然而開發VxWorks多任務程序過程中,常常碰到令人頭疼的多任務程序阻塞或死鎖等問題,例如某個task所占用時間過長導致其他task不能正常執行等等問題。
         
        本文介紹如何通過DT10檢測和調試VxWorks程序多任務阻塞死鎖相關問題。


        一、VxWorks環境

         
        啟動FTP Server,并設置Users/rights…


        16.jpg

         
        啟動VxWorks目標板,如下圖所示VxWorks啟動成功:


        17.jpg

         
        啟動Target Server和Shell:


        18.jpg


        19.jpg

         
        二、兩個簡單Tornado事例程序

         
        Multi_Task.c 
                               “ 
                                #include "vxworks.h" 
                                #include "semLib.h" 
                                #include "stdio.h"


                                #define TEST_NUM 10


                                SEM_ID semB; 
                                int global; 
                                int isTask1Running=1; 
                                int isTask2Running=1;


                                static void task1(void) 
                                { 
                                int i=0; 
                                while(i<TEST_NUM) 
                                       { 
                                printf("<taske1>take sem\n"); 
                                semTake(semB,WAIT_FOREVER); 
                                printf("<taske1>get sem\n"); 
                                global++; 
                                printf("<taske1>global=%d\n",global); 
                                taskDelay(100); 
                                semGive(semB); 
                                printf("<taske1>give sem\n"); 
                                i++; 
                                       } 
                                       isTask1Running=0; 
                                } 
                                static void task2(void) 
                                { 
                                int i=0; 
                                while(i<TEST_NUM) 
                                       { 
                                printf("<taske2>take sem\n"); 
                                semTake(semB,WAIT_FOREVER); 
                                printf("<taske2>get sem\n"); 
                                global--; 
                                printf("<taske2>global=%d\n",global); 
                                taskDelay(200); 
                                semGive(semB); 
                                printf("<taske2>give sem\n"); 
                                i++; 
                                       } 
                                       isTask2Running=0; 
                                }


                                static void task3(void) 
                                { 
                                while((isTask1Running==1)||(isTask2Running==1)) 
                                       { 
                                       taskDelay(100); 
                                       } 
                                       printf("Bye Bye, Both Task1 and Task2 are finished!"); 
                                }


                                void ex3_test() 
                                { 
                                int taskId1,taskId2; 
                                int t1_pri=91; 
                                int t2_pri=90; 
                                semB=semBCreate(SEM_Q_FIFO,SEM_FULL); 
                                       taskId1=taskSpawn("t1",t1_pri,0x100,0x1000,task1, 
                                              0,0,0,0,0,0,0,0,0,0); 
                                       taskId2=taskSpawn("t2",t2_pri,0x100,0x1000,task2, 
                                              0,0,0,0,0,0,0,0,0,0); 
                                       taskId2=taskSpawn("t3",t1_pri+1,0x100,0x1000,task3, 
                                              0,0,0,0,0,0,0,0,0,0); 
                                 }

                                  ”


        Dead_lock.c

                                “

                                 #include "vxWorks.h" 
                                 #include "semLib.h" 
                                 #include "taskLib.h" 
                                 #include "stdio.h"


                                 voidtaskA(); 
                                 voidtaskB(); 


                                 SEM_ID sem_1; 
                                 SEM_ID sem_2; 


                                 voidvxmain() 
                                 {

                                        sem_1 = semMCreate(SEM_Q_FIFO); 
                                        sem_2 = semMCreate(SEM_Q_FIFO); 


                                        taskSpawn("tA", 80, 0, 0x1000, (FUNCPTR)taskA, 
                                               0,0,0,0,0,0,0,0,0,0); 


                                        taskSpawn("tB", 80, 0, 0x1000, (FUNCPTR)taskB, 
                                               0,0,0,0,0,0,0,0,0,0); 
                                  } 


                                  /*------------------------------------------------- 
                                  the 2 tasks 
                                  -------------------------------------------------*/ 
                                  voidtaskA() 
                                  { 
                                         semTake(sem_1, WAIT_FOREVER); 
                                         printf("Task A took sem_1, try to take sem_2\n"); 


                                         taskDelay(60); /* allow task B to run */


                                         semTake(sem_2, WAIT_FOREVER); 


                                         printf("Task A took sem_1 & sem_2!\n"); /* can never get here */ 
                                  } 


                                  voidtaskB() 
                                  { 
                                         semTake(sem_2, WAIT_FOREVER); 
                                         printf("Task B took sem_2, try to take sem_1\n"); 

         

                                         //semTake(sem_1, WAIT_FOREVER); 


                                         printf("Task B took sem_1 & sem_2!\n"); /* can never get here */ 
                                   } 
                                    ”

         
        上述兩段程序均使用了VxWorks庫函數taskSpawn創建多個task。 multi_task.c文件中創建了三個task,task1, task2會設置標志isTask1Running, isTask2Running,當task1,task2結束后,task3才結束。Dead_lock.c文件中創建taskA, taskB,并通過信號量進行同步。當然,如果你仔細研究代碼,這兩段代碼中,均存在某個task不能正常結束的情況。

         
        下面我們將通過DT10提供的相關debug和測試的功能,幫助查找并定位相關問題。

         
        三、創建DT10工程

         
        在DT10中點擊File->New創建一個工程,并設定工程名稱,指定被測試文件目錄和DT10工程存放路徑,設定Connection方式(DT10支持多種與目標機的連接方式)為Ethernet(Without Tracer),工程創建好后,如下圖:


        20.jpg

         
        然后點擊Plan->New Test Point Insertion…,對test.c文件自動插入FuncIn, FuncOut測試點。測試點插入完畢后,如下圖。DT10除了支持FuncIn,FuncOut測試點,還支持CPU壓力測試點,變量測試點,Event Trigger測試點等,幫助用戶對系統的CPU,任務,變量等進行監控。


        21.jpg

         
        測試點插入后,我們在VxWorks構建環境Tornado中重新對上述項目進行編譯鏈接,如下圖:


        22.jpg

         
        四、執行程序并收集測試結果

         
        1. 啟動DT10監聽測試結果程序,如下圖:


        23.jpg

         
        2. 在Tornado Shell中啟動被測試程序,直接在Shell中鍵入vxmain即可,如下圖:


        24.jpg

         
        五、分析測試結果

         
        通過DT10自動插入測試點,程序在執行過程中,在每個測試點位置,目標程序會發出一個信號告知DT10程序執行到該測試點,這樣DT10收集所有測試日志數據后,然后通過DT10的分析功能,可以得到包括每個函數的執行時間,代碼的覆蓋率信息,以及程序執行路徑等圖形化報告,下面我們重點介紹通過DT10的哪些功能,幫助我們定位程序死鎖或阻塞的問題。

         
        1. 通過測試日志了解任務阻塞或死鎖情況

         
        首先我們看如何通過DT10的測試日志幫我們查找到任務死鎖的問題。如下圖,我們看到DT10的獲取到的測試日志報告:


        25.jpg

         
        結論:通過DT10測試日志中的FuncIn, FuncOut測試點,很容易找到目標程序運行過程中是否存在某個任務或者函數被阻塞,這對于同時啟動很多個task的程序而言,可以了解哪些任務是否存在阻塞情況。

         
        2. 通過覆蓋率信息查看任務函數執行完整情況

         
        另外通過DT10的覆蓋率信息,也可以從側面了解某個函數或任務是否被執行完整,是否發生阻塞導致任務函數未退出。


        26.jpg

         
        結論:通過覆蓋率測試,一方面,使得在軟件測試過程中,可以幫助我們了解測試是否完整,測試用例是否存在遺漏,被測試代碼是否存在冗余;另外一方面,覆蓋率的信息對于我們調試代碼也有一定的幫助;

         
        3. 通過DT10的函數執行時間了解更多信息

         
        通過DT10的函數執行時間報告,可以知道每個函數的執行時間,并且該執行時間精確到納秒級,同時可以知道每個函數執行的次數。如下圖:


        27.jpg

         
        我們看到該例程中,vxmain和taskB函數執行次數為1次,執行時間為883us和1116us,而taskA的執行次數為0,執行時間為0。這樣對于程序員,即可重點關注taskA是否存在問題。除了本例程中這種情況,在實際程序中,程序中的任務可能會執行成千上萬次,如果在DT10的函數執行時間報告中,發現某函數或者任務的某次執行時間特別長,舉例,比如某個TaskC,執行次數為9999次,其中9998次的執行時間都為1ms左右,另外有一次執行時間卻為30s,那么就需要仔細查看這一次30s函數執行過程是什么邏輯路徑。通過DT10可以看到每次代碼執行路徑,從而精確查看為什么本次執行時間為30s,是否存在問題。這種情況在多任務程序中經常碰到,比如某個低優先級的任務可能被其它高優先級的任務阻塞,從而導致該任務執行時間變長。

         
        結論:通過DT10了解每個函數執行時間,執行次數,以及每次執行過程中代碼執行邏輯路徑,從而幫助用戶更細致的了解代碼執行情況,幫助用戶定位和分析代碼中隱藏的bug。

         
        上面重點對dead_lock.c的結果重點進行分析了,對于multi_task.c的分析類似。有興趣試用并了解DT10的朋友可以聯系我們申請試用。

        国模大胆一区二区三区 国产乱A片真实在线观看,国产乱子伦视频大全,亲近乱子伦免费视频| 高清性色生活片,老熟妇性色老熟妇性按摩,性色生活片在线观看| 边摸边吃奶边做激情叫床视频,男人边吃奶边添下面好爽视频,无遮挡呻吟娇喘的床戏视频