国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

μC/OS-II系統(tǒng)下的代碼執(zhí)行時間測量方法

2013-08-24 00:43:40雷金奎邵元元
計算機工程與應(yīng)用 2013年5期
關(guān)鍵詞:調(diào)用中斷代碼

雷金奎 ,邵元元 ,田 力

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

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

3.西安愛生技術(shù)集團公司,西安 710065

1 引言

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

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

2 μC/OS-II多任務(wù)環(huán)境下的時間測量方法

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

2.1 測量代碼執(zhí)行時間的原理

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

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

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

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

2.2 ??臻g與多任務(wù)環(huán)境下的時間測量

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

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

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

任務(wù)的時間測量棧如圖2所示,它的棧元素是結(jié)構(gòu)體struct cp_time_prof_node_t,定義如下:

圖1 多任務(wù)環(huán)境下的時間測量棧

圖2 每個任務(wù)的??臻g

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

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

2.3 函數(shù)及其流程

本文定義了五個函數(shù),定義及功能:

函數(shù)time_init()用于初始化與時間測量相關(guān)的數(shù)據(jù)。

這一對函數(shù),構(gòu)成測量代碼執(zhí)行時間的函數(shù)對,用于測量代碼的執(zhí)行時間。

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

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

測量代碼執(zhí)行時間的流程:

(1)調(diào)用cp_time_init()進行時間測量相關(guān)代碼初始化;

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

(3)執(zhí)行待測代碼段;

(4)調(diào)用 cp_time_prof_end(cp_time_prof_id_t id)結(jié)束測量;

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

函數(shù)void cp_time_init()對時間測量相關(guān)數(shù)據(jù)的初始化流程:

(1)初始化系統(tǒng)時鐘;

(2)屏蔽所有中斷;

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

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

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

(6)除屏蔽所有中斷。

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

(1)屏蔽所有中斷;

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

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

(4)除屏蔽所有中斷。

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

(1)屏蔽所有中斷;

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

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

(4)出棧,把原棧頂?shù)奶幚磉^程對新棧頂?shù)挠绊憰r間加到新棧頂?shù)腡err上;即把原棧頂?shù)某蓡T變量Terr加到新棧頂?shù)腡err上,時間測量函數(shù)對執(zhí)行一次引入的偏差Toffset也要加到新棧頂?shù)腡err上;

(5)除屏蔽所有中斷。

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

(1)屏蔽所有中斷;

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

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

(4)除屏蔽所有中斷。

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

(1)屏蔽所有中斷;

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

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

(4)出棧,把中斷處理過程對新棧頂?shù)挠绊憰r間加到新棧頂?shù)腡err上;即把中斷服務(wù)例程的執(zhí)行時間Tc加到新棧頂?shù)腡err上,中斷時間測量函數(shù)對執(zhí)行一次引入的偏差Toffset_int和進入退出中斷所需的時間Tenter_exit也要加到新棧頂?shù)腡err上;

(5)除屏蔽所有中斷。

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

另外,在系統(tǒng)時鐘中斷服務(wù)例程中,需要維護系統(tǒng)時間供時間測量函數(shù)使用。

3 μC/OS-II多任務(wù)環(huán)境下實時時間參數(shù)的測量實例

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

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

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

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

4 結(jié)束語

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

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

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

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

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

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

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

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

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

猜你喜歡
調(diào)用中斷代碼
核電項目物項調(diào)用管理的應(yīng)用研究
LabWindows/CVI下基于ActiveX技術(shù)的Excel調(diào)用
創(chuàng)世代碼
動漫星空(2018年11期)2018-10-26 02:24:02
創(chuàng)世代碼
動漫星空(2018年2期)2018-10-26 02:11:00
創(chuàng)世代碼
動漫星空(2018年9期)2018-10-26 01:16:48
創(chuàng)世代碼
動漫星空(2018年5期)2018-10-26 01:15:02
跟蹤導練(二)(5)
千里移防,衛(wèi)勤保障不中斷
解放軍健康(2017年5期)2017-08-01 06:27:44
基于系統(tǒng)調(diào)用的惡意軟件檢測技術(shù)研究
利用RFC技術(shù)實現(xiàn)SAP系統(tǒng)接口通信
晴隆县| 盘锦市| 汪清县| 孝义市| 泸西县| 甘南县| 英德市| 乌恰县| 瑞金市| 济宁市| 渑池县| 白玉县| 高台县| 措勤县| 丘北县| 安康市| 乐都县| 太原市| 新闻| 麟游县| 都江堰市| 临夏县| 永寿县| 义马市| 天祝| 博爱县| 遵化市| 洪江市| 锡林浩特市| 农安县| 平凉市| 武平县| 邛崃市| 阜康市| 临朐县| 湘潭市| 鹤庆县| 武山县| 肃北| 昌都县| 阳江市|