專注差異化嵌入式產(chǎn)品解決方案 給智能產(chǎn)品定制注入靈魂給予生命
提供開(kāi)發(fā)工具、應(yīng)用測(cè)試 完善的開(kāi)發(fā)代碼案例庫(kù)分享
從全面的產(chǎn)品導(dǎo)入到強(qiáng)大技術(shù)支援服務(wù) 全程貼心伴隨服務(wù),創(chuàng)造無(wú)限潛能!
在單片機(jī)項(xiàng)目開(kāi)發(fā)過(guò)程中,經(jīng)常會(huì)出現(xiàn)一個(gè)有趣的問(wèn)題,即弄清楚如何延遲代碼執(zhí)行。有時(shí),單片機(jī)開(kāi)發(fā)人員可能只是希望有10微秒的延遲,以使I/O線在讀取之前穩(wěn)定下來(lái),或者可能希望在兩次讀取之間指定的時(shí)間間隔使它反跳。在本文中,我們將探討五種延遲代碼執(zhí)行的技術(shù)。
一、條件循環(huán)
第一種技術(shù)是使用條件循環(huán)(可能是最常用和最簡(jiǎn)單的)。條件循環(huán)延遲通常會(huì)使用for、while或do while循環(huán)重復(fù)執(zhí)行無(wú)操作(NOP)指令。例如:
for(int i = 0; i < 100000; i++)
{
__NOP();
}
條件延遲在緊要關(guān)頭可能會(huì)很有用,但很難準(zhǔn)確或有效。如果開(kāi)發(fā)人員要針對(duì)其他操作模式(例如低功耗操作)調(diào)整時(shí)鐘頻率,則延遲時(shí)間將完全不同。另外,總會(huì)有一個(gè)問(wèn)題,那就是到底有多長(zhǎng)時(shí)間?有人可能會(huì)認(rèn)為這是100000條指令,但是每次通過(guò)循環(huán)時(shí),都會(huì)有其他指令來(lái)檢查循環(huán)變量并遞增i。這些時(shí)序循環(huán)對(duì)于在任何生產(chǎn)代碼中使用來(lái)說(shuō)都是不可預(yù)測(cè)的。
二、使用計(jì)時(shí)器
可以使用的第二種技術(shù)是利用單片機(jī)內(nèi)置的硬件計(jì)時(shí)器。通常有幾種不同的硬件計(jì)時(shí)器可用于跟蹤系統(tǒng)時(shí)間,生成波形,捕獲輸入和通用。如果開(kāi)發(fā)人員需要延遲(例如10微秒),則可以向硬件計(jì)時(shí)器加載表示10微秒的計(jì)數(shù)值。在這種情況下,計(jì)時(shí)器將設(shè)置為單次計(jì)時(shí)器。該代碼將啟動(dòng)計(jì)時(shí)器并等待計(jì)時(shí)器溢出標(biāo)志被設(shè)置,然后該標(biāo)志將指示時(shí)間已過(guò)。
該代碼類似于以下內(nèi)容:
Timer_Reload (DELAY_VALUE );
while(Timer_Expired ()== false )
{
__NOP ();
}
這種技術(shù)比條件循環(huán)要強(qiáng)大得多。它還具有更高的靈活性,并且可以更輕松地針對(duì)所需的延遲時(shí)間進(jìn)行調(diào)整。實(shí)際上,可以在整個(gè)代碼中重用該API,以允許單個(gè)計(jì)時(shí)器用于所需的任何數(shù)量的延遲。
三、使用系統(tǒng)刻度(HAL示例)
在某些情況下,可能沒(méi)有專用的硬件計(jì)時(shí)器。在這種情況下,單片機(jī)開(kāi)發(fā)人員可以利用板載系統(tǒng)時(shí)鐘來(lái)創(chuàng)建延遲。即使是裸機(jī)系統(tǒng),通常也具有作為系統(tǒng)時(shí)鐘的后臺(tái)計(jì)時(shí)器,以便從單片機(jī)啟動(dòng)的那一刻起,軟件就具有時(shí)間參考。通常,在典型系統(tǒng)中,將這些系統(tǒng)時(shí)鐘設(shè)置為每1或10毫秒發(fā)生一次。
系統(tǒng)通常使用一些API,這些API允許開(kāi)發(fā)人員訪問(wèn)當(dāng)前的系統(tǒng)刻度,例如SysTick_Get()。開(kāi)發(fā)人員可以利用此延遲來(lái)創(chuàng)建類似于以下內(nèi)容的延遲:
TimeStart = SysTick_Get();
do
{
TimeNow = SysTick_Get();
TimeDelta = TimeNow – TimeStart;
}while(TimeDelta < DelayTime);
單片機(jī)開(kāi)發(fā)人員只需要確保如果他們這樣做,就不會(huì)陷入計(jì)算問(wèn)題或其他潛在問(wèn)題中,因此應(yīng)檢查邊界條件。
四、使用RTOS產(chǎn)量函數(shù)
在使用實(shí)時(shí)操作系統(tǒng)(RTOS)的更高級(jí)的系統(tǒng)中,開(kāi)發(fā)人員可以利用內(nèi)置的RTOS API調(diào)用來(lái)產(chǎn)生創(chuàng)建延遲的任務(wù)。例如,如果開(kāi)發(fā)人員正在使用FreeRTOS,則在他們的任務(wù)中他們可以使用如下代碼:
VTaskDelay (1);
此延遲功能將使任務(wù)產(chǎn)生一個(gè)RTOS滴答聲的當(dāng)前任務(wù)。取決于配置,RTOS滴答可以設(shè)置為1毫秒或10。使用這樣的延遲機(jī)制可能會(huì)出現(xiàn)問(wèn)題,因?yàn)槿蝿?wù)將在該時(shí)間段內(nèi)產(chǎn)生CPU,但不能保證一旦系統(tǒng)滴答時(shí)間到期,該任務(wù)將是最高優(yōu)先級(jí)的任務(wù)!如果任務(wù)是準(zhǔn)備運(yùn)行的最高優(yōu)先級(jí)任務(wù),則該任務(wù)僅在延遲后立即運(yùn)行,因此延遲時(shí)間可能會(huì)有些抖動(dòng)。
五、使用RTOS對(duì)象
使用RTOS對(duì)象來(lái)延遲時(shí)間。如果你仔細(xì)查看自己喜歡的RTOS中的對(duì)象(例如信號(hào)量、互斥對(duì)象和隊(duì)列)的API,你會(huì)注意到大多數(shù)等待等待的API調(diào)用還將包含延遲時(shí)間。此延遲時(shí)間也可導(dǎo)致應(yīng)用程序延遲。
與RTOS對(duì)象相關(guān)的是,大多數(shù)RTOS都還包含軟定時(shí)器。這些是基于軟件的計(jì)時(shí)器,是從運(yùn)行中的硬件計(jì)時(shí)器觸發(fā)的。然后,可以將與上面第一、二點(diǎn)中顯示的技術(shù)相似的技術(shù)與這些軟計(jì)時(shí)器一起使用,以在代碼執(zhí)行中產(chǎn)生延遲。
單片機(jī)開(kāi)發(fā)人員想要延遲代碼執(zhí)行,可以使用多種不同的技術(shù),使用的技術(shù)將取決于系統(tǒng)中可用的軟件和硬件資源。然后,開(kāi)發(fā)人員可以決定他們要使用的解決方案的復(fù)雜程度??傊?,肯定有很多種機(jī)制可以幫助將代碼執(zhí)行延遲一定的時(shí)間。
以上就是英銳恩單片機(jī)開(kāi)發(fā)工程師分享的單片機(jī)開(kāi)發(fā)過(guò)程中5種延遲代碼執(zhí)行的技術(shù)。英銳恩專注單片機(jī)應(yīng)用方案設(shè)計(jì)與開(kāi)發(fā),同時(shí)提供8位單片機(jī)、16位單片機(jī)、32位單片機(jī)、運(yùn)放芯片和模擬開(kāi)關(guān)。如果你需要更多單片機(jī)方案產(chǎn)品的信息,請(qǐng)撥打官網(wǎng)電話:4007-888-234,或點(diǎn)擊“在線咨詢”,我們的客服人員將為你提供更詳細(xì)的解答。