概述
在嵌入式實(shí)時(shí)系統(tǒng)中,一般對(duì)實(shí)時(shí)性都具有很高的要求,那么什么是實(shí)時(shí)性呢? ? 實(shí)時(shí)性:從事件發(fā)生到系統(tǒng)響應(yīng)的時(shí)間。 ? 但在實(shí)際的應(yīng)用編程中,有時(shí)往往會(huì)因?yàn)槟骋欢未a使系統(tǒng)毫無(wú)實(shí)時(shí)性可言,那么影響實(shí)時(shí)性的因素都有哪些呢?
線(xiàn)程內(nèi)任務(wù)在阻塞運(yùn)行
中斷相關(guān)操作
臨界區(qū)相關(guān)操作
線(xiàn)程內(nèi)任務(wù)在阻塞運(yùn)行
實(shí)時(shí)線(xiàn)程內(nèi)需要避免運(yùn)行阻塞的任務(wù):
避免線(xiàn)程內(nèi)有等待釋放信號(hào)量,釋放鎖,以及阻塞的隊(duì)列等等。。。
避免使用delay函數(shù)進(jìn)行延時(shí)操作,在需要delay時(shí),可考慮使用該實(shí)時(shí)線(xiàn)程的運(yùn)行周期對(duì)該函數(shù)進(jìn)行周期調(diào)用??
/* ??PeriodFunc()函數(shù)的運(yùn)行周期為10ms ??period_ms為RTThread線(xiàn)程的運(yùn)行周期 */ void?PeriodFunc(uint32_t?period_ms)?{ ??static?uint8_t?run_period_ms?=?10;
??static?uint8_t?current_period_ms?=?0; ??current_period_ms?+=?period_ms; ??if(current_period_ms?>=?run_period_ms)?{ ???
?current_period_ms?=?0; ????/*?user?code?*/ ??} } void?RTThread(void?*args)?{ ??while(1)?{ ????/*? ??
????使用該方法一定要保證線(xiàn)程的運(yùn)行周期時(shí)準(zhǔn)確的, ???
???否則函數(shù)的運(yùn)行周期將不會(huì)準(zhǔn)確? ????*/ ????PeriodFunc(1); ????DelayMs(1); ??} }
中斷相關(guān)操作
1.關(guān)中斷時(shí)間
程序中有一些臨界段代碼,若想安全訪(fǎng)問(wèn)則需要關(guān)閉中斷,那么訪(fǎng)問(wèn)這段代碼前關(guān)總中斷,訪(fǎng)問(wèn)完后打開(kāi)總中斷,在這個(gè)時(shí)間內(nèi),系統(tǒng)是無(wú)法響應(yīng)外部任何中斷的,這一段時(shí)間為關(guān)中斷時(shí)間。
2.最大關(guān)中斷時(shí)間
指的是這么多個(gè)臨界段代碼的關(guān)中斷時(shí)間中最大的那個(gè),即這個(gè)時(shí)間就代表了最差最壞情況下中斷的關(guān)閉時(shí)間了,因?yàn)閷?shí)時(shí)操作系統(tǒng)中很多時(shí)間問(wèn)題都是基于最差情況下考慮的。
3.中斷響應(yīng)時(shí)間
接收到此中斷到此中斷對(duì)應(yīng)的中斷服務(wù)函數(shù)的第一條語(yǔ)句執(zhí)行所經(jīng)歷的時(shí)間。其計(jì)算公式是:
中斷響應(yīng)時(shí)間 = 最大關(guān)中斷時(shí)間 + 保護(hù) CPU 內(nèi)部寄存器的時(shí)間 + ?進(jìn)入中斷服務(wù)函數(shù)的執(zhí)行時(shí)間(會(huì)根據(jù)中斷向量表找到對(duì)應(yīng)的終端服務(wù)函數(shù)地址即入口)+ 開(kāi)始執(zhí)行中斷服務(wù)例程 (ISR) 的第一條指令時(shí)間
4.中斷恢復(fù)時(shí)間
指從中斷響應(yīng)成功(即開(kāi)始執(zhí)行中斷服務(wù)例程(ISR)的第一條指令時(shí)刻)一直到中斷服務(wù)函數(shù)執(zhí)行完畢再到切換回被中斷的任務(wù)的接著一條代碼執(zhí)行所經(jīng)歷的時(shí)間。其計(jì)算公式是:
中斷恢復(fù)時(shí)間 = 中斷服務(wù)函數(shù)執(zhí)行所需時(shí)間(這樣說(shuō)不太準(zhǔn)確,意思就是基本執(zhí)行完所需時(shí)間,不包括退出中斷服務(wù)函數(shù)前會(huì)調(diào)用一下OSIntExit() 函數(shù))+ OSIntExit()(這個(gè)函數(shù)在中斷服務(wù)函數(shù)末尾調(diào)用的,退出中斷前來(lái)發(fā)生任務(wù)切換的)+ OSIntCtxSw()(真正發(fā)生任務(wù)切換的函數(shù),會(huì)進(jìn)行寄存器數(shù)據(jù)彈出等操作)
臨界區(qū)相關(guān)操作
1.基本臨界區(qū)
臨界區(qū)是提供互斥功能的一種非常原始的方法,進(jìn)入臨界區(qū)的方法使用中斷鎖把中斷全部關(guān)掉(當(dāng)然任務(wù)也就無(wú)法調(diào)度)。臨界區(qū)內(nèi)的代碼必須要有很短的運(yùn)行時(shí)間,否則會(huì)反過(guò)來(lái)影響中斷的響應(yīng)時(shí)間。 使用中斷鎖來(lái)操作臨界區(qū)的方法可以應(yīng)用于任何場(chǎng)合,且其他幾類(lèi)同步方式都是依賴(lài)于中斷鎖而實(shí)現(xiàn)的,可以說(shuō)中斷鎖是最強(qiáng)大和最高效的同步方法。只是使用中斷鎖最主要的問(wèn)題在于,在中斷關(guān)閉期間,系統(tǒng)將不再響應(yīng)任何中斷,也就不能響應(yīng)外部的事件。所以中斷鎖對(duì)系統(tǒng)的實(shí)時(shí)性影響非常巨大,當(dāng)使用不當(dāng)?shù)臅r(shí)候會(huì)導(dǎo)致系統(tǒng)完全無(wú)實(shí)時(shí)性可言(可能導(dǎo)致系統(tǒng)完全偏離要求的時(shí)間需求)。而使用得當(dāng),則會(huì)變成一種快速、高效的同步方式。
2.任務(wù)臨界區(qū)
掛起調(diào)度器也稱(chēng)為鎖定調(diào)度器。基本臨界區(qū)是保護(hù)一段代碼不被其他任務(wù)或中斷打斷,而由掛起調(diào)度器實(shí)現(xiàn)的臨界區(qū)只能保護(hù)一段代碼不被其他任務(wù)打斷,并不能約束中斷,因?yàn)樵谶@種方式下,中斷是使能的。
編輯:黃飛
?
評(píng)論