【導(dǎo)讀】如果您的 MCU 應(yīng)用程序需要處理數(shù)字音頻,請(qǐng)考慮采用多線程方法。使用多線程設(shè)計(jì)方法使設(shè)計(jì)人員能夠以直接的方式重用他們的設(shè)計(jì)部分。
如果您的 MCU 應(yīng)用程序需要處理數(shù)字音頻,請(qǐng)考慮采用多線程方法。使用多線程設(shè)計(jì)方法使設(shè)計(jì)人員能夠以直接的方式重用他們的設(shè)計(jì)部分。
多核和多線程是設(shè)計(jì)實(shí)時(shí)系統(tǒng)的有效方法。使用這些技術(shù),系統(tǒng)被設(shè)計(jì)為許多任務(wù)的集合,這些任務(wù)獨(dú)立運(yùn)行并在需要時(shí)相互通信。將系統(tǒng)設(shè)計(jì)從大型單片代碼塊分解為更易于管理的任務(wù),可以大大簡(jiǎn)化系統(tǒng)設(shè)計(jì)并加快產(chǎn)品開發(fā)。因此,整個(gè)系統(tǒng)的實(shí)時(shí)屬性更容易理解。設(shè)計(jì)者只需要擔(dān)心每個(gè)任務(wù)實(shí)現(xiàn)的保真度,提出諸如“網(wǎng)絡(luò)協(xié)議是否正確實(shí)現(xiàn)?”之類的問題。
在本文中,我們將討論如何使用多線程或多核設(shè)計(jì)方法來設(shè)計(jì)對(duì)數(shù)據(jù)流進(jìn)行操作的實(shí)時(shí)系統(tǒng),例如數(shù)字音頻系統(tǒng)。我們使用幾個(gè)數(shù)字音頻系統(tǒng)來說明設(shè)計(jì)方法,包括異步 USB 音頻 2、以太網(wǎng) AVB 和 MP3 播放器的數(shù)字基座。在展示如何有效地使用多核和多線程來設(shè)計(jì)所需的緩沖和時(shí)鐘方案之前,我們將簡(jiǎn)要討論數(shù)字音頻、多核和多線程的概念。
數(shù)字音頻
在許多消費(fèi)市場(chǎng)中,數(shù)字音頻已經(jīng)取代了模擬音頻,原因有二。首先,大多數(shù)音頻源都是數(shù)字的。無論是以有損壓縮格式 (MP3) 還是以非壓縮格式 (CD) 交付,數(shù)字標(biāo)準(zhǔn)已經(jīng)取代了傳統(tǒng)的模擬標(biāo)準(zhǔn),例如磁帶和磁帶。其次,數(shù)字音頻比模擬音頻更容易處理。數(shù)據(jù)可以通過現(xiàn)有標(biāo)準(zhǔn)(例如 IP 或 USB)傳輸而不會(huì)丟失,并且硬件設(shè)計(jì)不需要任何“魔法”來降低本底噪聲。就數(shù)字路徑而言,本底噪聲是恒定的,不受移動(dòng)電話可能引起的 TDMA 噪聲的影響。
數(shù)字音頻系統(tǒng)對(duì)樣本流進(jìn)行操作。每個(gè)樣本代表一個(gè)或多個(gè)音頻通道在某個(gè)時(shí)間點(diǎn)的幅度,樣本之間的時(shí)間由采樣率控制。CD 標(biāo)準(zhǔn)有兩個(gè)通道(左聲道和右聲道)并使用 44.1 kHz 的采樣率。常見的音頻標(biāo)準(zhǔn)使用 2、6 (5.1) 和 8 (7.1) 通道,以及 44.1 kHz、48 kHz 或倍數(shù)的采樣率。我們使用 48 kHz 作為運(yùn)行示例,但這絕不是唯一的標(biāo)準(zhǔn)。
多核和多線程
在多線程設(shè)計(jì)方法中,系統(tǒng)被表示為并發(fā)任務(wù)的集合。使用并發(fā)任務(wù),而不是單一的單一程序,有幾個(gè)優(yōu)點(diǎn):
多任務(wù)是支持關(guān)注點(diǎn)分離的好方法,這是軟件工程最重要的方面之一。關(guān)注點(diǎn)分離意味著設(shè)計(jì)的不同任務(wù)可以單獨(dú)設(shè)計(jì)、實(shí)現(xiàn)、測(cè)試和驗(yàn)證。一旦指定了任務(wù)之間的交互,團(tuán)隊(duì)或個(gè)人就可以各自完成自己的任務(wù)。
并發(fā)任務(wù)提供了一個(gè)簡(jiǎn)單的框架來指定系統(tǒng)應(yīng)該做什么。例如,數(shù)字音頻系統(tǒng)將播放通過網(wǎng)絡(luò)接口接收的音頻樣本。換句話說,系統(tǒng)應(yīng)該同時(shí)執(zhí)行兩項(xiàng)任務(wù):從網(wǎng)絡(luò)接口接收數(shù)據(jù)并在其音頻接口上播放樣本。將這兩個(gè)任務(wù)表示為單個(gè)順序任務(wù)是令人困惑的。
表示為并發(fā)任務(wù)集合的系統(tǒng)可以通過一個(gè)或多個(gè)多線程內(nèi)核中的線程集合來實(shí)現(xiàn)(參見圖 1)。我們假設(shè)線程是在指令級(jí)調(diào)度的,就像XMOS XCore 處理器上的情況一樣,因?yàn)檫@使得并發(fā)任務(wù)能夠?qū)崟r(shí)運(yùn)行。請(qǐng)注意,這與 Linux 上的多線程不同,例如,線程被調(diào)度在具有上下文切換的單處理器上。這可能使這些線程對(duì)人類而言似乎是并發(fā)的,但對(duì)一組實(shí)時(shí)設(shè)備而言卻不是。
并發(fā)任務(wù)在邏輯上設(shè)計(jì)為通過消息傳遞進(jìn)行通信,當(dāng)兩個(gè)任務(wù)由兩個(gè)線程實(shí)現(xiàn)時(shí),它們通過發(fā)送數(shù)據(jù)和控制通道進(jìn)行通信。在內(nèi)核內(nèi)部,通道通信由內(nèi)核本身執(zhí)行,當(dāng)線程位于不同的內(nèi)核上時(shí),通道通信通過交換機(jī)執(zhí)行(參見圖 2)。
多線程設(shè)計(jì)已被嵌入式系統(tǒng)設(shè)計(jì)人員使用了數(shù)十年。為了實(shí)現(xiàn)嵌入式系統(tǒng),系統(tǒng)設(shè)計(jì)人員過去常常使用大量微控制器。例如,在音樂播放器內(nèi)部,可能會(huì)發(fā)現(xiàn)三個(gè)控制閃存、DAC 和 MP3 解碼器芯片的微控制器。
圖 1:線程、通道、內(nèi)核、交換機(jī)和鏈接。并發(fā)線程通過內(nèi)核內(nèi)部、芯片上的內(nèi)核之間或不同芯片上的內(nèi)核之間的通道進(jìn)行通信。
我們認(rèn)為,現(xiàn)代多線程環(huán)境可以替代這種設(shè)計(jì)策略。單個(gè)多線程芯片可以替代多個(gè) MCU,并提供任務(wù)之間的集成通信模型。該系統(tǒng)不必在單獨(dú)的 MCU 上的任務(wù)之間實(shí)現(xiàn)定制通信,而是作為一組通過通道進(jìn)行通信的線程來實(shí)現(xiàn)。
使用多線程設(shè)計(jì)方法使設(shè)計(jì)人員能夠以直接的方式重用他們的設(shè)計(jì)部分。在傳統(tǒng)的軟件工程中,功能和模塊結(jié)合起來執(zhí)行復(fù)雜的任務(wù)。但是,這種方法不一定適用于實(shí)時(shí)環(huán)境,因?yàn)橐来螆?zhí)行兩個(gè)函數(shù)可能會(huì)破壞函數(shù)或模塊的實(shí)時(shí)性要求。
在理想的多線程環(huán)境中,實(shí)時(shí)任務(wù)的組合是微不足道的,因?yàn)樗皇菫槊總€(gè)新的實(shí)時(shí)任務(wù)添加一個(gè)線程(或核心)的情況。實(shí)際上,設(shè)計(jì)人員會(huì)對(duì)內(nèi)核數(shù)量有所限制(例如,出于經(jīng)濟(jì)原因),因此必須決定哪些任務(wù)將組成并發(fā)線程,以及哪些任務(wù)將作為集合集成到單個(gè)線程中的功能。
多線程數(shù)字音頻
一個(gè)數(shù)字音頻系統(tǒng)很容易拆分為多個(gè)線程,包括一個(gè)網(wǎng)絡(luò)協(xié)議棧線程、一個(gè)時(shí)鐘恢復(fù)線程、一個(gè)音頻傳輸線程,以及可選的用于 DSP、設(shè)備升級(jí)和驅(qū)動(dòng)程序認(rèn)證的線程。網(wǎng)絡(luò)協(xié)議??梢韵褚蕴W(wǎng)/IP 棧一樣復(fù)雜并包含多個(gè)并發(fā)任務(wù),或者像 S/PDIF 接收器一樣簡(jiǎn)單。
圖 2:具有 24 個(gè)并發(fā)線程的三核系統(tǒng)的物理化身。頂部設(shè)備有兩個(gè)核心,底部設(shè)備有一個(gè)核心。
我們假設(shè)系統(tǒng)中的線程通過通道發(fā)送數(shù)據(jù)樣本進(jìn)行通信。在這種設(shè)計(jì)方法中,線程是在單核還是多核系統(tǒng)上執(zhí)行并不重要,因?yàn)槎嗪酥皇菫樵O(shè)計(jì)增加了可擴(kuò)展性。我們假設(shè)每個(gè)線程的計(jì)算要求可以靜態(tài)建立并且不依賴于數(shù)據(jù),這通常是未壓縮音頻的情況。
我們將把注意力集中在設(shè)計(jì)的兩個(gè)部分:線程之間的緩沖(以及它們對(duì)性能的影響)和時(shí)鐘恢復(fù)。一旦做出了這些設(shè)計(jì)決策,實(shí)現(xiàn)每個(gè)線程的內(nèi)部就遵循正常的軟件工程原則,并且與人們預(yù)期的一樣難或容易。緩沖和時(shí)鐘恢復(fù)很有趣,因?yàn)樗鼈兌紝?duì)用戶體驗(yàn)有定性影響(促進(jìn)穩(wěn)定的低延遲音頻),并且在多線程編程環(huán)境中很容易理解。
緩沖
在數(shù)字解決方案中,數(shù)據(jù)樣本不一定在交付時(shí)進(jìn)行傳輸。這需要緩沖數(shù)字音頻。例如,考慮一個(gè)采樣率為 48 kHz 的 USB 2.0 揚(yáng)聲器。USB 層將在每 125 μs 窗口中傳輸六個(gè)樣本的突發(fā)。無法保證在 125 μs 的窗口中將傳送六個(gè)樣本,因此需要至少 12 個(gè)樣本的緩沖區(qū),以保證樣本可以實(shí)時(shí)流式傳輸?shù)綋P(yáng)聲器。
設(shè)計(jì)挑戰(zhàn)是建立適量的緩沖。在模擬系統(tǒng)中,緩沖不是問題。信號(hào)按時(shí)傳遞。在基于非實(shí)時(shí)操作系統(tǒng)設(shè)計(jì)的數(shù)字系統(tǒng)中,程序員通常堅(jiān)持使用相當(dāng)大的緩沖區(qū)(250 或 1,000 個(gè)樣本)以應(yīng)對(duì)調(diào)度策略中的不確定性。然而,大緩沖區(qū)在內(nèi)存方面、增加延遲方面以及證明它們足夠大以保證無點(diǎn)擊交付方面都是昂貴的。
多線程設(shè)計(jì)提供了一個(gè)很好的框架來非正式地和正式地推理緩沖并避免不必要的大緩沖區(qū)。例如,考慮上述 USB 揚(yáng)聲器增加了環(huán)境噪聲校正系統(tǒng)。該系統(tǒng)將包括以下線程:
通過網(wǎng)絡(luò)接收 USB 樣本的線程。
過濾樣本流的一系列 10 個(gè)或更多線程,每個(gè)線程都有一組不同的系數(shù)。
使用 I 2 S將過濾后的輸出樣本傳送到立體聲編解碼器的線程。
從連接到麥克風(fēng)采樣環(huán)境噪聲的編解碼器中讀取樣本的線程。
將環(huán)境噪聲二次采樣到 8 kHz 采樣率的線程。
建立環(huán)境噪聲頻譜特性的線程。
根據(jù)計(jì)算的光譜特性更改濾波器系數(shù)的線程。
所有線程都將在 48 kHz 基本周期的某個(gè)倍數(shù)上運(yùn)行。例如,每個(gè)過濾線程將每 48 kHz 周期過濾一個(gè)樣本;交付線程將在每個(gè)周期交付一個(gè)樣本。每個(gè)線程也有一個(gè)定義的窗口,它在上面操作,以及一個(gè)定義的方法,通過這個(gè)方法推進(jìn)這個(gè)窗口。例如,如果我們的過濾器線程是使用雙二階實(shí)現(xiàn)的,它將在一個(gè)包含三個(gè)樣本的窗口上運(yùn)行,每個(gè)周期提前一個(gè)樣本。頻譜線程可以在每 64 個(gè)樣本推進(jìn) 64 個(gè)樣本的 256 個(gè)樣本窗口(以執(zhí)行 FFT(Fest Fourier Transform))上運(yùn)行。
現(xiàn)在可以建立在同一周期運(yùn)行的系統(tǒng)的所有部分,并將它們以同步部分的形式連接在一起。在這些同步部分內(nèi)不需要緩沖區(qū),盡管如果線程要在管道中運(yùn)行,則需要單個(gè)緩沖區(qū)。在各個(gè)同步部分之間需要緩沖區(qū)。在我們的示例中,我們最終得到三個(gè)部分:
從 USB 接收樣本、過濾并以 48 kHz 傳輸?shù)牟糠帧?/p>
以 48 kHz 采樣環(huán)境噪聲并以 8 kHz 傳輸?shù)牟糠帧?/p>
建立頻譜特性并在 125 Hz 時(shí)更改濾波器設(shè)置的部分。
這三個(gè)部分如圖 3 所示。從 USB 緩沖區(qū)接收樣本的第一部分需要緩沖 12 個(gè)立體聲樣本。
圖 3:根據(jù)頻率分組在一起的線程。
傳遞的部分需要緩沖一個(gè)立體聲樣本。將 10 個(gè)過濾器線程作為管道運(yùn)行需要 11 個(gè)緩沖區(qū)。這意味著從接收器到編解碼器的總延遲包括 24 個(gè)采樣時(shí)間,即 500 μs,并且可以添加一個(gè)額外的采樣以應(yīng)對(duì)時(shí)鐘恢復(fù)算法中的中期抖動(dòng)。這部分以 48 kHz 運(yùn)行。
對(duì)環(huán)境噪聲進(jìn)行采樣的第二部分需要在輸入端存儲(chǔ)一個(gè)樣本,并在二次采樣中存儲(chǔ)六個(gè)樣本。因此,在 48 kHz 或 145 μs 處有 7 個(gè)樣本延遲。
建立頻譜特性的第三部分需要以 8 kHz 的采樣率存儲(chǔ) 256 個(gè)樣本。不需要其他緩沖區(qū)。因此,環(huán)境噪聲和濾波器校正之間的延遲為 8 kHz 下的 256 個(gè)樣本,二次采樣時(shí)間為 145 μs,或剛好超過 32 ms。請(qǐng)注意,這些是我們選擇使用的算法的最小緩沖區(qū)大??;如果此延遲不可接受,則必須選擇不同的算法。
設(shè)計(jì)線程以對(duì)數(shù)據(jù)塊而不是單個(gè)樣本進(jìn)行操作通常很容易,但這會(huì)增加所經(jīng)歷的整體延遲,增加內(nèi)存需求并增加復(fù)雜性。僅當(dāng)有明顯的好處時(shí)才應(yīng)考慮這一點(diǎn),例如增加吞吐量。
計(jì)時(shí)數(shù)字音頻
數(shù)字音頻和模擬音頻之間的一個(gè)很大區(qū)別在于,模擬音頻基于此基礎(chǔ)采樣率,而數(shù)字音頻需要將時(shí)鐘信號(hào)分配給系統(tǒng)的所有部分。盡管組件都可以使用不同的采樣率(例如,系統(tǒng)的某些部分可能使用 48 kHz,而其他一些部分可能使用 96 kHz,中間有一個(gè)采樣率轉(zhuǎn)換器),所有組件都應(yīng)就一秒的長度達(dá)成一致,并且因此在測(cè)量頻率的基礎(chǔ)上達(dá)成一致。
數(shù)字音頻的一個(gè)有趣特性是系統(tǒng)內(nèi)的所有線程都與這個(gè)時(shí)鐘頻率的基數(shù)無關(guān),假設(shè)有一個(gè)黃金標(biāo)準(zhǔn)的基頻。系統(tǒng)中的多個(gè)核心是否使用不同的晶體并不重要,只要它們對(duì)樣本進(jìn)行操作即可。然而,在系統(tǒng)的邊緣,真正的時(shí)鐘頻率很重要,采樣在途中產(chǎn)生的延遲也很重要。
在多線程環(huán)境中,將留出一個(gè)線程來明確測(cè)量真實(shí)時(shí)鐘頻率,實(shí)施時(shí)鐘恢復(fù)算法,測(cè)量本地時(shí)鐘與全局時(shí)鐘,并在時(shí)鐘偏移上與主時(shí)鐘達(dá)成一致。
可以使用互連的底層比特率隱含地測(cè)量時(shí)鐘,例如 S/PDIF 或 ADAT。測(cè)量其中任何一個(gè)網(wǎng)絡(luò)上的每秒比特?cái)?shù)將給出主時(shí)鐘的測(cè)量值。時(shí)鐘可以通過使用為此目的而設(shè)計(jì)的協(xié)議來明確測(cè)量,例如以太網(wǎng)上的 PTP。
在時(shí)鐘恢復(fù)線程中,可以實(shí)現(xiàn)一個(gè)控制循環(huán),它估計(jì)時(shí)鐘頻率,并根據(jù)觀察到的誤差進(jìn)行調(diào)整。在最簡(jiǎn)單的形式中,誤差用作調(diào)整頻率的指標(biāo),但濾波器可用于減少抖動(dòng)。該軟件線程實(shí)現(xiàn)了傳統(tǒng)上由 PLL 但在軟件中執(zhí)行的功能,因此它可以廉價(jià)地適應(yīng)環(huán)境。
結(jié)論
多線程開發(fā)方法使數(shù)字音頻系統(tǒng)能夠使用分而治之的方法進(jìn)行開發(fā),其中一個(gè)問題被分成一組并發(fā)任務(wù),每個(gè)任務(wù)在多線程內(nèi)核上的單獨(dú)線程中執(zhí)行。
像許多實(shí)時(shí)系統(tǒng)一樣,數(shù)字音頻適合多線程設(shè)計(jì)方法,因?yàn)閿?shù)字音頻系統(tǒng)顯然由一組處理數(shù)據(jù)的任務(wù)組成,并且還需要這些任務(wù)同時(shí)執(zhí)。
免責(zé)聲明:本文為轉(zhuǎn)載文章,轉(zhuǎn)載此文目的在于傳遞更多信息,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問題,請(qǐng)聯(lián)系小編進(jìn)行處理。
推薦閱讀:
射頻通信接收機(jī)設(shè)計(jì)的主要結(jié)構(gòu)
利用ADP1055數(shù)字開關(guān)穩(wěn)壓器改善動(dòng)態(tài)環(huán)路響應(yīng)
紅外熱成像儀對(duì)放大器的芯片結(jié)溫的仿真測(cè)試
新的寬帶隙半導(dǎo)體技術(shù)提高了功率轉(zhuǎn)換效率
為何在開關(guān)穩(wěn)壓器中,電流模式控制非常重要?