博客專欄

        EEPW首頁 > 博客 > 使用實時操作系統開發軟件時,如何測量性能?

        使用實時操作系統開發軟件時,如何測量性能?

        發布人:13261589816 時間:2022-07-19 來源:工程師 發布文章

        使用實時操作系統開發軟件時,如何測量性能?

        性能分析非常重要的一個方面是響應時間,例如,從一個任務被激活到運行完成的時間。可以通過多種方式來測量響應時間,如反轉I/O引腳并使用邏輯分析儀進行測量,或通過添加一些額外的代碼來測量兩點之間時鐘周期數。但這些測量措施只能檢測兩點之間的處理器時間,無法獲知影響時間的因素,例如中斷或其他任務搶占導致的干擾。

        性能分析的另一個重要內容是執行時間,一段特定代碼實際使用的處理器時間。我們通常可以對程序計數器進行采樣獲取使用的處理器時間,許多IDE支持該功能,大多數基于ARM的MCU為此提供了硬件支持。然而,通過該方式獲取的數據是平均測量值,對于頻率較低的函數或任務是不準確的。此外,這些信息不能指示異常長的執行可能會導致問題,例如超時。


        使用RTOS知識進行跟蹤

        要獲得RTOS行為的準確信息,你需要一個RTOS感知跟蹤的解決方案。但許多工具僅支持指定的操作系統。它們通常使用水平甘特圖顯示任務執行隨時間的變化,但其跟蹤信息很難并行顯示其他事件,例如RTOS API的調用。

        圖片

        圖1 Tracealyzer主視圖


        Tracealyzer 的主視圖(圖1)使用垂直時間軸,不僅顯示RTOS調度過程和中斷,還通過文本標簽顯示RTOS調用的事件或自定義用戶事件。這些標簽“浮動”顯示并均勻分布。調度軌跡中的矩形框對應于一次連續的執行,稱為Fragment(分片)。參與者(Actor)表示被跟蹤系統中的所有執行上下文,例如任務和中斷處理程序。任務調度可以不同的方式呈現或查看。圖1中,每個參與者一列,分片在多列中排序。

        圖片

        圖2 執行時間和響應時間變化

        一個參與者,在捕獲視圖中有多個實例。實例表示參與者的一次執行,即從任務被觸發到完成的過程。在Tracealyzer 主視圖中點擊參與者的分片,參與者實例通過藍色矩形框突出顯示,如圖1。

        此外,執行時間和響應時間等性能指標基于每個實例計算,并可視化為圖2所示的詳細圖表。例如如果捕獲任務的最大響應時間是為 3255 μs,而最大執行時間僅為1087 μs,這意味著大部分響應時間被其他任務或中斷占用。

        Tracealyzer中的所有視圖都是相互關聯的,通過單擊繪制的數據點,你會找到主跟蹤視圖中的相應位置,以及統計數據背后的詳細RTOS行為。

        任務調度事件如何分組到任務實例中?對于周期RTOS任務來說,一個實例對應一個迭代循環,由RTOS阻塞調用分隔,例如,循環中的隊列接收調用QueueRecieve或延時調用DelayUntil。但是一個任務可能會執行多個這樣的調用,那么Tracealyzer如何知道從哪里結束當前實例并開始一個新的實例?

        Tracealyzer 有一個“實例完成事件”(IFE)概念,通過兩種方式定義。用戶在大多數情況下不需要為此煩惱,因為有一組標準規則,用于指定RTOS調用的內容作為IFE,例如延遲調用和 QueueRecieve調用。不需要額外的配置。但是,對于規則不合適的情況,可能會需要生成顯式事件 (IFE) 標記實例完成,需要調用記錄庫中的特定函數實現。

        圖 3顯示了一個示例,其中墨綠色控制任務分為多個實例,盡管這些點上沒有發生任務切換。你可以手動決定如何將事件分組到實例中,從而控制時序統計的解釋。

        圖片

        圖3 實例結束事件IFE允許自定義間隔


        總結

        使用RTOS帶來的復雜性,使得應用的運行時行為難以通過閱讀代碼的方式理解。基于Tracealyzer的可視化分析,可以幫助我們理解和控制軟件的運行時行為。關于如何使用Tracezlyzer,捕獲系統行為的信息,可以參考《嵌入式實時操作系統-基于STM32Cube、FreeRTOS和Tracealyzer的應用開發》

        圖片


        歡迎關注微信公眾號【麥克泰技術】


        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。




        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 麻阳| 定南县| 吉安市| 开平市| 沙洋县| 余江县| 甘泉县| 札达县| 陵水| 镇赉县| 嫩江县| 中牟县| 高唐县| 清水县| 桐梓县| 隆化县| 哈巴河县| 准格尔旗| 满城县| 巴楚县| 灌阳县| 通许县| 嘉定区| 鄯善县| 天峻县| 婺源县| 玛纳斯县| 蓬安县| 永泰县| 长武县| 彭山县| 秦安县| 吴江市| 中方县| 留坝县| 大同市| 通化县| 上犹县| 日照市| 桃源县| 溆浦县|