• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

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

      2013-08-24 00:43:40雷金奎邵元元
      計算機工程與應用 2013年5期
      關鍵詞:調用中斷代碼

      雷金奎 ,邵元元 ,田 力

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

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

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

      1 引言

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

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

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

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

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

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

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

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

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

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

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

      考慮到測量時間的過程中,可能會發(fā)生任務切換、中斷等,給每個任務分配一個時間測量棧。用隨著任務的切換而切換棧,來處理多任務下的時間測量問題。如圖1所示,任務task0、task1、…、task N的時間測量棧分別是task0_stack、task1_stack、…、task N_stack,指針數組task_stk_top[]保存著未處于運行狀態(tài)的任務的時間測量棧棧頂,指針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 多任務環(huán)境下的時間測量棧

      圖2 每個任務的??臻g

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

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

      2.3 函數及其流程

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

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

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

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

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

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

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

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

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

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

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

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

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

      (2)屏蔽所有中斷;

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

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

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

      (6)除屏蔽所有中斷。

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

      (1)屏蔽所有中斷;

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

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

      (4)除屏蔽所有中斷。

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

      (1)屏蔽所有中斷;

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

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

      (4)出棧,把原棧頂的處理過程對新棧頂的影響時間加到新棧頂的Terr上;即把原棧頂的成員變量Terr加到新棧頂的Terr上,時間測量函數對執(zhí)行一次引入的偏差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)讀取當前系統(tǒng)時刻;

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

      (4)除屏蔽所有中斷。

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

      (1)屏蔽所有中斷;

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

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

      (4)出棧,把中斷處理過程對新棧頂的影響時間加到新棧頂的Terr上;即把中斷服務例程的執(zhí)行時間Tc加到新棧頂的Terr上,中斷時間測量函數對執(zhí)行一次引入的偏差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的棧了。

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

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

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

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

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

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

      4 結束語

      提出了一種基于μ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權威指南[M].宋巖,譯.北京:北京航空航天大學出版社,2009.

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

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

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

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

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

      猜你喜歡
      調用中斷代碼
      核電項目物項調用管理的應用研究
      LabWindows/CVI下基于ActiveX技術的Excel調用
      測控技術(2018年5期)2018-12-09 09:04:46
      創(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)調用的惡意軟件檢測技術研究
      利用RFC技術實現SAP系統(tǒng)接口通信
      察隅县| 云林县| 卓尼县| 东兴市| 张家界市| 文登市| 鲜城| 崇明县| 永定县| 舒兰市| 凭祥市| 巴东县| 通州市| 甘洛县| 江源县| 益阳市| 梧州市| 喜德县| 汉寿县| 天水市| 宁乡县| 鄯善县| 建瓯市| 乐都县| 盈江县| 万山特区| 斗六市| 定远县| 巧家县| 阜城县| 孙吴县| 永德县| 阿坝县| 嘉定区| 中西区| 龙门县| 高州市| 铁力市| 定陶县| 玛沁县| 基隆市|