1. gzyueqian
      18078865874

      嵌入式開(kāi)發(fā):延遲代碼執(zhí)行的5種技術(shù)

      更新時(shí)間: 2022-04-27 11:20:32來(lái)源: 粵嵌教育瀏覽量:9433

        嵌入式軟件實(shí)現(xiàn)中經(jīng)常出現(xiàn)的一個(gè)有趣問(wèn)題是弄清楚如何延遲代碼執(zhí)行。有時(shí),嵌入式開(kāi)發(fā)人員可能只希望有 10 微秒的延遲,以允許 I/O 線在讀取之前穩(wěn)定下來(lái),或者可能希望在讀取之間有一個(gè)指定的時(shí)間段來(lái)消除它的抖動(dòng)。在這篇文章中,我們將探討五種延遲代碼執(zhí)行的技術(shù)。



        技術(shù) #1 – 條件循環(huán)

        第一種可能是最常用和最簡(jiǎn)單的技術(shù)是使用條件循環(huán)。條件循環(huán)延遲通常會(huì)使用 for、while 或 do while 循環(huán)來(lái)重復(fù)執(zhí)行無(wú)操作 (NOP) 指令。例如:



        有條件的延遲在緊要關(guān)頭可能很有用,但它幾乎不準(zhǔn)確或有效。如果開(kāi)發(fā)人員要針對(duì)不同的操作模式(例如低功耗操作)調(diào)整時(shí)鐘頻率,則延遲時(shí)間將完全不同。另外,總是有一個(gè)問(wèn)題,那就是延遲到底有多少?有人可能認(rèn)為它有 100,000 條指令,但每次循環(huán)都會(huì)有額外的指令來(lái)檢查循環(huán)變量并增加 i。這些時(shí)序循環(huán)太難以預(yù)測(cè),無(wú)法在任何生產(chǎn)代碼中使用。

        技巧 #2 – 使用計(jì)時(shí)器

        可以使用的第二種技術(shù)是利用內(nèi)置在微控制器中的硬件定時(shí)器。通常有幾種不同的硬件定時(shí)器可用于跟蹤系統(tǒng)時(shí)間、生成波形、捕獲輸入和通用目的。如果嵌入式開(kāi)發(fā)人員需要延遲,例如 10 微秒,硬件計(jì)時(shí)器可以加載表示 10 微秒的計(jì)數(shù)值。在這種情況下,定時(shí)器將被設(shè)置為一次性定時(shí)器。代碼將啟動(dòng)計(jì)時(shí)器并等待設(shè)置計(jì)時(shí)器溢出標(biāo)志,這將指示時(shí)間已過(guò)。

        此代碼的抽象版本可能如下所示:


        這種技術(shù)比我們之前看到的條件循環(huán)要強(qiáng)大得多。它也更便攜,可以更容易地調(diào)整到所需的延遲時(shí)間。事實(shí)上,API 可以在整個(gè)代碼中重復(fù)使用,以允許將單個(gè)計(jì)時(shí)器用于所需的任意數(shù)量的延遲。

        技術(shù) #3 – 使用系統(tǒng)記號(hào)(HAL 示例)

        可能存在專(zhuān)用硬件計(jì)時(shí)器不可用或不希望設(shè)置一次性計(jì)時(shí)器的情況。在這些情況下,開(kāi)發(fā)人員可以利用板載系統(tǒng)滴答聲來(lái)產(chǎn)生延遲。即使是裸機(jī)系統(tǒng)通常也有一個(gè)后臺(tái)定時(shí)器,它充當(dāng)系統(tǒng)滴答聲,以便軟件從微控制器啟動(dòng)的那一刻起就有一個(gè)時(shí)間參考。通常,這些系統(tǒng)滴答聲在典型系統(tǒng)中設(shè)置為每 1 或 10 毫秒發(fā)生一次。

        系統(tǒng)通常使用一些 API 允許開(kāi)發(fā)人員訪問(wèn)當(dāng)前系統(tǒng)時(shí)鐘,例如 SysTick_Get()。開(kāi)發(fā)人員可以利用它來(lái)創(chuàng)建類(lèi)似于以下內(nèi)容的延遲:



        開(kāi)發(fā)人員只需要確保如果他們做這樣的事情,他們不會(huì)遇到計(jì)算問(wèn)題或其他潛在問(wèn)題,因此應(yīng)該檢查邊界條件。

        技巧 #4 – 使用 RTOS 屈服函數(shù)

        在使用實(shí)時(shí)操作系統(tǒng) (RTOS) 的更高級(jí)系統(tǒng)中,嵌入式開(kāi)發(fā)人員可以利用內(nèi)置的 RTOS API 調(diào)用來(lái)生成任務(wù)以產(chǎn)生延遲。例如,如果開(kāi)發(fā)人員正在使用 FreeRTOS,他們可以在他們的任務(wù)中使用如下代碼:



        此延遲功能將導(dǎo)致任務(wù)在一個(gè) RTOS 滴答聲中產(chǎn)生當(dāng)前任務(wù)。根據(jù)配置,RTOS 滴答聲可以設(shè)置為 1 毫秒或 10 毫秒。使用這樣的延遲機(jī)制可能會(huì)出現(xiàn)問(wèn)題,因?yàn)樵撊蝿?wù)將在該時(shí)間段內(nèi)產(chǎn)生 CPU,但不能保證一旦系統(tǒng)滴答期到期,該任務(wù)將成為最高優(yōu)先級(jí)的任務(wù)!如果任務(wù)是準(zhǔn)備好運(yùn)行的最高優(yōu)先級(jí)任務(wù),則該任務(wù)只會(huì)在延遲后立即運(yùn)行,因此延遲時(shí)間可能會(huì)有一些抖動(dòng)。

        技巧 #5 – 使用 RTOS 對(duì)象

        我們今天要討論的最后一個(gè)技術(shù)是使用其他 RTOS 對(duì)象來(lái)延遲時(shí)間。如果你仔細(xì)查看你最喜歡的 RTOS 中的信號(hào)量、互斥體和隊(duì)列等對(duì)象的 API,你會(huì)注意到大多數(shù)等待的 API 調(diào)用也包含延遲時(shí)間。此延遲時(shí)間也可用于導(dǎo)致應(yīng)用程序延遲。

        與 RTOS 對(duì)象相關(guān)的是大多數(shù) RTOS 還包括軟定時(shí)器。這些是基于軟件的定時(shí)器,由正在運(yùn)行的硬件定時(shí)器觸發(fā)。然后可以將與技術(shù)#2 和技術(shù)#3 中所示的技術(shù)類(lèi)似的技術(shù)與這些軟計(jì)時(shí)器一起使用,以在代碼執(zhí)行中產(chǎn)生延遲。

        結(jié)語(yǔ)

        有幾種不同的技術(shù)可供想要延遲代碼執(zhí)行的開(kāi)發(fā)人員使用,所使用的技術(shù)將取決于系統(tǒng)中可用的軟件和硬件資源。然后,嵌入式開(kāi)發(fā)人員可以決定他們想要使用的解決方案有多復(fù)雜。不過(guò),歸根結(jié)底,肯定有幾種機(jī)制可以幫助將代碼執(zhí)行延遲定義的時(shí)間段。

      免費(fèi)預(yù)約試聽(tīng)課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 亚洲欧洲日本韩国精品 | 亚洲中文AⅤ在线视频 | 在线国产精品一区二区 | 亚洲综合在线另类色区奇米97 | 中文字幕亚洲日本韩无线码 | 亚洲欧美日韩国产国产a |