999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

μC/OS-II系統下的代碼執行時間測量方法

2013-08-24 00:43:40雷金奎邵元元
計算機工程與應用 2013年5期
關鍵詞:測量

雷金奎 ,邵元元 ,田 力

1.西北工業大學 第365研究所,西安 710065

2.西北工業大學 電子信息學院,西安 710072

3.西安愛生技術集團公司,西安 710065

1 引言

實時系統是能夠在指定的時間內完成系統功能和外部或內部、同步或異步事件做出響應的系統[1]。實時系統中,計算的正確性不僅取決于程序的邏輯正確性,也取決于結果產生的時間。如果系統的時間約束條件得不到滿足,將會發生錯誤,造成重大的生命財產損失和生態破壞。因此,實時系統應該具備在事先定義的時間范圍內識別和處理離散事件的能力;能夠處理和存儲控制系統所需要的大量數據。

提出了一種基于μC/OS-II實時操作系統的代碼執行時間測量方法,并使用Microsemi SoftConsole IDE v3.3開發環境,在基于Cortex-M3核的SmartFusion主控芯片上實現了相關的代碼。本文測量了μC/OS-II在SmartFusion平臺下的一些實時性指標,為代碼的實時性提供了一個時間上的參考,為提高系統的實時性提供了保障[2-3]。

2 μC/OS-II多任務環境下的時間測量方法

在微機系統中,往往可以處理多個中斷和多個任務。代碼在執行過程中,隨時可能被中斷,然后CPU將控制權轉移給中斷服務例程;也可能將控制權轉移給其他任務。這些原因,導致在μC/OS-II多任務環境下,測到的代碼執行時間的不確定性[4]。

2.1 測量代碼執行時間的原理

測量一段代碼C的執行時間,一種比較直觀的想法是這樣的:先讀取系統時鐘值TS,然后執行待測代碼段C,最后再讀取時鐘值TE,得出待測代碼段的執行時間TC=TE-TS。將在這個基本想法上進行改進和擴充,使最終得到的時間TC中,去除時間測量函數自身、中斷和任務切換的影響。由于執行代碼前后各有一次讀取當前時刻值的操作,因此可以把前后兩次時刻讀取過程及相關的操作封裝為一對時間測量函數對。然后,可以把函數對中的兩個函數分別放到代碼段C之前和之后,執行完代碼段C和時間測量函數對之后就能得出代碼段C的執行時間。

考慮到時間測量函數自身、中斷和任務切換的影響,待測代碼段C的實際執行時間(占有CPU的時間),可以表示如下:

其中,TE為代碼C結束執行的時刻,TS為開始執行代碼C的時刻,Tint為代碼C被中斷服務例程中斷的總時間,Tprof為測量代碼本身引入的測量總偏差。Tenter_exit為進入中斷和退出中斷所需的時間,Toffset_int是執行一次中斷時間測量函數對所需要的時間,Tint_exec為中斷服務代碼的執行時間。Toffset為執行一次時間測量代碼對所需的時間;Tin_offset是執行時間測量函數對的過程中,兩次時刻讀取之間的代碼的執行時間;Tin_offset_int是執行中斷時間測量函數對的過程中,兩次時刻讀取之間的代碼的執行時間。因為兩個函數對中代碼不完全相同,所以兩次時刻讀取之間的代碼執行時間就不同。

為了消除中斷的影響,本文對所有的中斷服務歷程的執行時間進行了測量,以便扣除中斷服務例程的執行時間,得到代碼段的準確執行時間。

2.2 棧空間與多任務環境下的時間測量

在多任務環境下,任務都有自己的棧空間和上下文環境。當進行任務切換的時候,把當前任務的上下文環境保存到自己的棧空間,然后把下一個任務的上下文環境從它的棧空間中恢復到寄存器中,CPU的控制權就從一個任務轉移到了另一個任務。

考慮到測量時間的過程中,可能會發生任務切換、中斷等,給每個任務分配一個時間測量棧。用隨著任務的切換而切換棧,來處理多任務下的時間測量問題。如圖1所示,任務task0、task1、…、task N的時間測量棧分別是task0_stack、task1_stack、…、task N_stack,指針數組task_stk_top[]保存著未處于運行狀態的任務的時間測量棧棧頂,指針cur_stk_top跟蹤著當前運行的那個任務的時間測量棧棧頂。

當任務切換的時候,比如從task1切換到task0,把cur_stk_top保存到task_stk_top[1],然后將task_stk_top[0]賦給cur_stk_top。這樣,當前活躍的就是task0的棧了。

任務的時間測量棧如圖2所示,它的棧元素是結構體struct cp_time_prof_node_t,定義如下:

圖1 多任務環境下的時間測量棧

圖2 每個任務的棧空間

其中,成員變量Ts是待測代碼段的開始時刻;Terr是中斷、任務切換和時間測量代碼引入的時間測量偏差,即式(1)中的Tint+Tprof;pnode是前一個棧元素的指針。

待測量代碼執行完畢后,讀取當前時刻Te,并根據式(1)、式(2)和式(3)算出它的執行時間,并把執行時間等信息保存到數組struct cp_cp_time_prof_t cp_time_prof[],對最終結果進行保存。它的定義如下所示,其中,成員變量nb_of_states是待測代碼段總共測量的次數,total_exec_time是總共執行時間,max_time、min_time分別是最大執行時間和最小執行時間。

2.3 函數及其流程

本文定義了五個函數,定義及功能:

函數time_init()用于初始化與時間測量相關的數據。

這一對函數,構成測量代碼執行時間的函數對,用于測量代碼的執行時間。

這一對函數,構成測量中斷服務代碼執行時間的函數對,用于測量中斷服務代碼的執行時間,并把對被中斷的代碼的執行時間上的影響記錄下來,方便被中斷的代碼計算自身的執行時間。

μC/OS-II中,每次切換任務上下文的時候要調用這個函數。這個鉤子函數在任務切換時,切換任務所使用的時間測量棧。

測量代碼執行時間的流程:

(1)調用cp_time_init()進行時間測量相關代碼初始化;

(2)調用cp_time_prof_start(cp_time_prof_id_t id)開始測量,參數id是以后測量結果在數組cp_time_prof[]中的存儲位置的索引;

(3)執行待測代碼段;

(4)調用 cp_time_prof_end(cp_time_prof_id_t id)結束測量;

(5)轉步驟(2),開始測量下一段代碼的執行時間。

函數void cp_time_init()對時間測量相關數據的初始化流程:

(1)初始化系統時鐘;

(2)屏蔽所有中斷;

(3)初始化所有任務的時間測量棧、棧頂指針task_stk_top[]和當前活躍任務的棧頂cur_stk_top;

(4)初始化存儲測量結果的數組cp_time_prof[],令其所有成員存儲的最大執行時間為0,最小執行時間為(unsigned)-1,總執行時間為0,統計次數為0;

(5)計算 Toffset、Tin_offset、Toffset_int和 Tin_offset_int的值;

(6)除屏蔽所有中斷。

函數void cp_time_prof_start(cp_time_prof_id_t id)的流程:

(1)屏蔽所有中斷;

(2)讀取當前系統時刻;

(3)入棧,用新的棧頂元素的成員變量Ts保存當前時刻,新棧頂元素的成員Terr賦Tin_offset,pnode賦上一個元素的地址形成鏈表,把輸入參數賦給id;

(4)除屏蔽所有中斷。

函數 void cp_time_prof_end(cp_time_prof_id_t id)的流程:

(1)屏蔽所有中斷;

(2)讀取當前系統時刻,記為Te;

(3)設待測代碼執行時間為Tc,則Tc=Te-Ts-Terr,把結果記錄到cp_time_prof[id]中;

(4)出棧,把原棧頂的處理過程對新棧頂的影響時間加到新棧頂的Terr上;即把原棧頂的成員變量Terr加到新棧頂的Terr上,時間測量函數對執行一次引入的偏差Toffset也要加到新棧頂的Terr上;

(5)除屏蔽所有中斷。

void cp_time_prof_start_int(cp_time_prof_id_t id)和void cp_time_prof_start(cp_time_prof_id_t id)函數的流程很相似,僅僅是給Terr賦的初值不同:

(1)屏蔽所有中斷;

(2)讀取當前系統時刻;

(3)入棧,用新的棧頂元素的成員變量Ts保存當前時刻,新棧頂元素的成員Terr賦Tin_offset_int,pnode賦上一個元素的地址形成鏈表,把輸入參數賦給id;

(4)除屏蔽所有中斷。

函數void cp_time_prof_end_int(cp_time_prof_id_t id)的流程:

(1)屏蔽所有中斷;

(2)讀取當前系統時刻,記為Te;

(3)設待測代碼執行時間為Tc,則Tc=Te-Ts-Terr,把結果記錄到cp_time_prof[id]中;

(4)出棧,把中斷處理過程對新棧頂的影響時間加到新棧頂的Terr上;即把中斷服務例程的執行時間Tc加到新棧頂的Terr上,中斷時間測量函數對執行一次引入的偏差Toffset_int和進入退出中斷所需的時間Tenter_exit也要加到新棧頂的Terr上;

(5)除屏蔽所有中斷。

函 數 void cp_time_prof_CtxSw_hook(uint32_t cur,uint32_t next)是μC/OS-II的任務切換函數void OS_TASK_SW()調用的鉤子函數,它完成的操作就是當任務切換的時候,比如從task1切換到task0,把cur_stk_top保存到task_stk_top[1],然后將 task_stk_top[0]賦給 cur_stk_top。這樣,當前活躍的就是task0的棧了。

另外,在系統時鐘中斷服務例程中,需要維護系統時間供時間測量函數使用。

3 μC/OS-II多任務環境下實時時間參數的測量實例

使用SoftConsole IDE v3.3集成開發環境,使Smart-Fusion主控芯片工作在100 MHz,片內RAM 20 kB,對代碼最大優化條件下,測量了μC/OS-II的任務切換時間、搶占時間和信號洗牌時間[5-6]。

(1)上下文切換時間(任務切換時間)[7]:μC/OS-II會調用OS_TASK_SW()進行實際的上下文切換。OS_TASK_SW()是宏調用,含有微處理器的軟中斷指令,利用此中斷來實現任務之間的上下文切換。在移植μC/OS-II的時候,使用了PendSV軟中斷來實現任務切換,因此任務切換時間其實就是PendSV中斷服務例程的執行時間。在中斷服務函數代碼調用void cp_time_prof_start_int()之后,緊接著調用void cp_time_prof_start(),在調用void cp_time_prof_CtxSw_hook()之前,調用 void cp_time_prof_end(),得出PendSV中斷前半部分的執行時間t1。在調用void cp_time_prof_CtxSw_hook()之后,緊接著調用void cp_time_prof_start(),并在中斷服務函數代碼調用void cp_time_prof_end_int()之前,調用void cp_time_prof_end(),得到PendSV中斷后半部分的執行時間t2。最后算出任務切換時間t1加t2再加上進入和退出中斷的時間得到總時間0.75μs。

(2)搶占時間[8]:搶占時間即系統將控制權從低優先級的任務轉移到高優先級任務所花費的時間。在μC/OS-II中,調用函數void OS_Sched()來尋找當前就緒的最高優先級任務,并移交CPU控制權給這個任務。因此,只需測量函數void OS_Sched()的執行時間,再加上上下文切換時間就是搶占時間。在void OS_Sched()的開始和結束處,分別調用void cp_time_prof_start()和void cp_time_prof_end(),得到void OS_Sched()的執行時間0.91μs,加上任務切換時間得到搶占時間1.66μs。

(3)信號洗牌時間:指從一個任務釋放信號量到另一個等待該信號的任務被激活的時間延遲。μC/OS-II是通過INT8U OSMutexPost()來釋放信號量的。在 INT8U OSMutexPost()的開始和結束處,分別調用void cp_time_prof_start()和 void cp_time_prof_end()。編寫兩個任務,高優先級的那個任務等待低優先級任務釋放信號量。INT8U OSMutexPost()的執行時間是2.38μs,加上任務切換時間,得出信號洗牌時間是3.13μs。

4 結束語

提出了一種基于μC/OS-II實時操作系統的代碼執行時間測量方法,并用它測量了μC/OS-II實時操作系統在SmartFusion+SoftConsole平臺上的一些時間指標。用這個方法,可以比較準確地測量代碼執行的時間,在代碼優化階段可以用它來評估代碼優化的實際效果,具有很強的實用意義。

[1]魏忠.嵌入式開發詳解[M].北京:電子工業出版,2003.

[2]Labrosse J J.μC/OS-II——源碼公開的實時嵌入式操作系統[M].邵貝貝,譯.北京:中國電力出版社,2001.

[3]Yiu J.ARM Cortex-M3權威指南[M].宋巖,譯.北京:北京航空航天大學出版社,2009.

[4]中興通訊股份有限公司.程序片斷執行時間的測量方法及裝置:中國,200910167583.6[P].2010-01-27.

[5]李江,戴勝華.Linux操作系統實時性測試及分析[J].計算機應用,2005,25(7):1679-1681.

[6]唐建國,張鐘澍,吳欽章.Linux下代碼運行時間的高精度測量[J].計算機工程與應用,2005,41(18):103-105.

[7]江建慧,唐智杰.測量嵌入式操作系統實時性能參數的新方法[J].同濟大學學報,2008,36(9):1260-1266.

[8]王挺,丁志剛,閻夢天,等.實時操作系統內核時間參數的測量[J].計算機應用與軟件,2009,26(7):59-61.

猜你喜歡
測量
測量重量,測量長度……
把握四個“三” 測量變簡單
滑動摩擦力的測量和計算
滑動摩擦力的測量與計算
測量的樂趣
二十四節氣簡易測量
日出日落的觀察與測量
滑動摩擦力的測量與計算
測量
測量水的多少……
主站蜘蛛池模板: 国产成人AV大片大片在线播放 | 国产丰满大乳无码免费播放| Aⅴ无码专区在线观看| 国产在线精品人成导航| 亚洲Va中文字幕久久一区 | 狠狠操夜夜爽| 欧洲精品视频在线观看| 日本午夜三级| 伦伦影院精品一区| 77777亚洲午夜久久多人| 国产精品视频系列专区| 亚洲国产欧美国产综合久久 | 久久久久夜色精品波多野结衣| 久久久久中文字幕精品视频| a级毛片毛片免费观看久潮| 色婷婷亚洲综合五月| 国产精品开放后亚洲| a级毛片免费看| 久久婷婷国产综合尤物精品| 午夜天堂视频| 国产aⅴ无码专区亚洲av综合网| 亚洲乱码精品久久久久..| 三级毛片在线播放| 成人第一页| 亚洲永久色| 国产高清国内精品福利| 色视频久久| 国产亚洲精品97在线观看| 精品国产一区91在线| 国产99在线观看| 性做久久久久久久免费看| 国模极品一区二区三区| 欧美第一页在线| 国产午夜一级淫片| 五月天天天色| 日韩少妇激情一区二区| 久久久久久久久亚洲精品| 国产精品手机视频| 71pao成人国产永久免费视频| 亚洲第一区精品日韩在线播放| 97视频在线观看免费视频| 91成人免费观看在线观看| 久久免费观看视频| 久久网欧美| 欧美影院久久| 久久人妻xunleige无码| 四虎国产永久在线观看| 少妇精品在线| 欧洲亚洲欧美国产日本高清| 91精品免费久久久| 亚洲第一区在线| 午夜老司机永久免费看片| 日本三区视频| 精品无码一区二区三区电影| 欧美另类图片视频无弹跳第一页| 国产日韩欧美中文| 亚洲中文无码av永久伊人| 奇米精品一区二区三区在线观看| 久久女人网| 国产女人在线| 久久青草精品一区二区三区 | 国产精品无码作爱| 国产性生交xxxxx免费| 国产精品对白刺激| 亚洲 日韩 激情 无码 中出| 欧美一级一级做性视频| 67194亚洲无码| 久久99久久无码毛片一区二区| 国产精品欧美激情| 色综合中文字幕| 国产精品极品美女自在线| 欧洲熟妇精品视频| 波多野结衣久久高清免费| 91精品国产一区自在线拍| 国产精品视频观看裸模| 国产精品夜夜嗨视频免费视频| 成人在线第一页| 欧美色亚洲| 亚洲欧州色色免费AV| 国产精品偷伦视频免费观看国产| 中国一级毛片免费观看| 精品第一国产综合精品Aⅴ|