精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

多線程RTOS系統(tǒng):如何加速原子同步

要長高 ? 來源:embedded ? 作者:Aaron Bauch ? 2022-06-02 18:19 ? 次閱讀

同步

原子操作的動(dòng)機(jī)來自于在共享資源時(shí)需要同步兩個(gè)或多個(gè)實(shí)體。一個(gè)簡單的例子可能是基于多線程 RTOS 的系統(tǒng)中的兩個(gè)線程,這兩個(gè)線程都需要偶爾向它們共享的 UART 外圍設(shè)備發(fā)送消息。

在操作中,一個(gè)線程可能會(huì)獲得對(duì) UART 的控制權(quán)并持有該控制權(quán),直到其整個(gè)消息被發(fā)送。否則,如果另一個(gè)線程決定在第一個(gè)線程未完成時(shí)發(fā)送消息,這兩個(gè)線程可能會(huì)通過 UART 發(fā)送替代字符,從而導(dǎo)致控制臺(tái)端口出現(xiàn)一堆難以理解的亂碼。

為了解決這個(gè)問題,我們可以定義一個(gè)資源,就像單個(gè)內(nèi)存位置一樣簡單,它包含一個(gè)指示 UART 是忙還是可用的數(shù)據(jù)字。假設(shè)這個(gè)位置的 0 表示 UART 空閑,而 1 表示它正在使用中。

當(dāng)線程 1 有消息要發(fā)送時(shí),它會(huì)讀取鎖定字。它看到它是 0,所以它寫一個(gè) 1 到這個(gè)位置。任何其他想要發(fā)送消息的線程都會(huì)發(fā)現(xiàn)這個(gè)鎖或信號(hào)量包含一個(gè) 1,并且會(huì)等到它被清除后再嘗試獲取資源以供自己使用。

如果檢查和設(shè)置鎖的過程被中斷,就會(huì)出現(xiàn)問題。

考慮以下情況:

任務(wù) 1 讀取鎖定字。

它找到包含零的單詞。

任務(wù) 1 由于更高優(yōu)先級(jí)的任務(wù)或?qū)е缕鋾和5闹袛喽V埂?/p>

當(dāng)任務(wù) 1 被掛起時(shí),任務(wù) 2 以更高的優(yōu)先級(jí)運(yùn)行。

任務(wù) 2 需要發(fā)送一條消息并讀取它發(fā)現(xiàn)包含零的鎖定字。

任務(wù) 1 將 1 寫入鎖定字,知道它現(xiàn)在擁有 UART 的唯一控制權(quán),直到其消息被發(fā)送。

由于所需資源不可用,任務(wù) 2 釋放控制權(quán)。

任務(wù) 1 繼續(xù)運(yùn)行,知道鎖包含 0,將 1 寫入鎖字。

現(xiàn)在,任務(wù) 1 和任務(wù) 2 都確定它們對(duì) UART 資源具有獨(dú)特的控制權(quán),并將交錯(cuò)地向其發(fā)送字符,因?yàn)樗麄兛吹剿谥饌€(gè)字符的基礎(chǔ)上變得可用。

原子操作

解決這個(gè)問題需要一個(gè)原子操作,以確保檢查和設(shè)置鎖定字的完整事務(wù)在任何其他代理(即使具有更高優(yōu)先級(jí)的代理)可以中斷正在進(jìn)行的關(guān)鍵操作之前完成。

原子操作只是以一個(gè)不間斷的順序完成的操作。即使這是一個(gè)復(fù)雜的事件序列。

對(duì)原子操作的支持內(nèi)置于 C11 及更高版本等語言標(biāo)準(zhǔn)中。但是,用于在機(jī)器指令級(jí)別和硬件級(jí)別實(shí)現(xiàn)這一點(diǎn)的實(shí)際機(jī)制必須存在于 CPU 的指令集架構(gòu) (ISA) 和系統(tǒng)硬件實(shí)現(xiàn)中,以確保正確操作。

在上述情況下,任務(wù) 1 必須完成所有測試和設(shè)置鎖的步驟,然后任何其他任務(wù)或?qū)嶓w才能訪問內(nèi)存中的鎖字。

在單核系統(tǒng)中,這通常可以通過簡單地在讀取鎖定字之前禁用所有中斷并在寫入鎖定后重新啟用它們來確保。通過這種方式,不會(huì)發(fā)生中斷,因此不會(huì)導(dǎo)致內(nèi)核在其測試和設(shè)置操作的中間搶占任務(wù) 1。

當(dāng)然,在具有其他總線主控器的單核系統(tǒng)的情況下,例如 DMA 控制器和可以直接寫入內(nèi)存的外圍設(shè)備,這可能會(huì)因這些其他總線主控器之一在錯(cuò)誤的時(shí)間寫入鎖定值而被違反。但是,可以通過確保存儲(chǔ)鎖變量的內(nèi)存不能被系統(tǒng)中的任何其他總線主控器訪問來防止這種情況發(fā)生。

多核復(fù)雜性

現(xiàn)在我們看看在同一個(gè)芯片上有多個(gè)計(jì)算元素的情況,比如多核芯片,其中使用內(nèi)存鎖定來確保在不同內(nèi)核上運(yùn)行的線程也可以共享資源而不會(huì)相互破壞。

在這種情況下,我們無法阻止不同的總線主機(jī)訪問鎖定位置。這是因?yàn)殒i定位置是每個(gè)內(nèi)核必須能夠讀取和設(shè)置的位置,以確保正確共享公共資源(如上述 UART)。

現(xiàn)在我們必須確保一個(gè)核心一旦啟動(dòng)就可以完成其讀-修改-寫序列,在任何其他核心或總線主控器可以訪問正在設(shè)置鎖的內(nèi)存位置之前。

Arm 架構(gòu)的 8.1 版及更高版本中,為此添加了新的原子指令。我將把這個(gè)例子集中在新的指令上。一種這樣的指令是 LDADD 指令及其變體。該指令從內(nèi)存中讀取一個(gè)值,將芯片上的一個(gè)寄存器中的值相加,然后將結(jié)果寫回內(nèi)存,同時(shí)保持內(nèi)存總線,直到整個(gè)操作完成。

這樣,系統(tǒng)可以保證沒有其他總線主控器可以修改內(nèi)存中的值,從而使兩個(gè)主控器都認(rèn)為他們擁有共享資源的所有權(quán)。

這段代碼完成后,處理器可以檢查讀取的值,以驗(yàn)證它實(shí)際上是資源的唯一所有者,并且它的值對(duì)應(yīng)于在操作開始之前可用的資源。

現(xiàn)實(shí)世界的影響

好消息是,如果您使用 RTOS 或操作系統(tǒng)在單核或多核線程環(huán)境中管理線程,這一切都在較低級(jí)別的系統(tǒng)代碼中得到處理。然而,了解底層指令集和內(nèi)存硬件必須設(shè)計(jì)為支持這些鎖定機(jī)制以使這一切正常工作是有用的。如果這些機(jī)制設(shè)計(jì)不正確或被直接操縱寄存器誤用,多個(gè)內(nèi)核可能會(huì)無意中同時(shí)控制打算在使用時(shí)獨(dú)占的資源。要調(diào)試這類情況,需要先進(jìn)的多核調(diào)試功能,其中可以觀察和控制在系統(tǒng)中的多個(gè)內(nèi)核上運(yùn)行的代碼。

調(diào)試多核同步

多核調(diào)試器可以通過顯示在多個(gè)內(nèi)核或線程上運(yùn)行的程序來幫助查找同步問題,以及根據(jù)另一個(gè)內(nèi)核上的斷點(diǎn)有選擇地停止和啟動(dòng)內(nèi)核的能力應(yīng)該是確定這種機(jī)制問題的理想選擇。

在圖 1 中,我們可以在 IAR Embedded Workbench 中看到帶有 4 個(gè) CPU 的 NXP i.MX 8。所有核心都可以單獨(dú)啟動(dòng)和停止。

poYBAGKYjiWAE2OSAADhRC2fgzE974.png

圖 1:每個(gè)內(nèi)核獨(dú)立的調(diào)試器控制。(來源:IAR 系統(tǒng))

圖 2 顯示了在不同 CPU 上運(yùn)行的代碼中使用多個(gè)斷點(diǎn)并結(jié)合使用互斥鎖(Arm 提供的示例):_mutex_acquire() 和 _mutex_release(),設(shè)置標(biāo)志以阻止所使用對(duì)象的在素?cái)?shù)計(jì)算中。

poYBAGKYjjGAYdxhAAPpeEG7Mr4459.png

圖 2:在單個(gè)內(nèi)核中使用互斥鎖和斷點(diǎn)。(來源:IAR 系統(tǒng))

最常見的錯(cuò)誤之一是濫用或未使用交叉觸發(fā)接口 (CTI)。對(duì)于 Arm,CoreSight 交叉觸發(fā)接口 (CTI) 通過交叉觸發(fā)矩陣 (CTM) 連接到每個(gè)內(nèi)核。CTI 使調(diào)試邏輯、ETM 跟蹤單元和 PMU 能夠相互交互并與其他 CoreSight 組件交互。這使得每個(gè)核心可以獨(dú)立地停止和重置。不得不操縱“自制”的 CTI 變通方法,手動(dòng)控制和停止內(nèi)核,也許動(dòng)態(tài)使用宏是一項(xiàng)不可能完成的任務(wù)。默認(rèn)情況下,這應(yīng)該并且需要由來自探針(CTI 接口信號(hào))和軟件調(diào)試端的良好調(diào)試器處理。圖 3 顯示了完全控制 CTI 的用例。

pYYBAGKYjkOAe3wmAACG35krBBM017.png

圖 3:使用交叉觸發(fā)接口 (CTI) 進(jìn)行完全控制。(來源:IAR 系統(tǒng))

一旦全部結(jié)合在一起,具有多核支持的調(diào)試器就可以在非對(duì)稱和對(duì)稱場景中控制內(nèi)核,甚至可以組合在一起。圖 4 顯示了運(yùn)行 4 個(gè) Cortex-A53 和 1 個(gè) Cortex-M4 的 NXP i.MX 8 設(shè)備。MCU 和 MPU 可以獨(dú)立停止、監(jiān)控和控制。雖然所有 4 個(gè) Cortex-A53 內(nèi)核或單個(gè)內(nèi)核都從主會(huì)話運(yùn)行,但可以在 Cortex-M4 合作伙伴端設(shè)置斷點(diǎn),并專注于可能正在運(yùn)行整個(gè)設(shè)備的安全監(jiān)視器的此應(yīng)用程序。

poYBAGKYjliAPL7vAARd40o5hIQ446.png

圖 4:在配備 4 個(gè) Cortex-A53 和 1 個(gè) Cortex-M4 的 NXP i.MX 8 設(shè)備上運(yùn)行的多核會(huì)話。(來源:IAR 系統(tǒng))

在應(yīng)用程序中使用并行性和并發(fā)性旨在更有效地使用可用內(nèi)核。然而,它的代價(jià)是增加了應(yīng)用程序的復(fù)雜性,以及如何將源代碼拆分成更小的部分以盡可能高效地運(yùn)行。

概括

在單個(gè)芯片或系統(tǒng)中同步多個(gè)內(nèi)核需要原子操作和執(zhí)行這些操作的硬件。首次開發(fā)這種硬件/軟件組合時(shí),支持多核調(diào)試和觀察的全功能調(diào)試器對(duì)于發(fā)現(xiàn)此類系統(tǒng)的問題至關(guān)重要。無法想象如何通過在整個(gè)代碼中使用 print 語句來實(shí)現(xiàn)相同的控制,并使所有內(nèi)容完美同步。每個(gè)開發(fā)人員都應(yīng)該得到一個(gè)可以處理多核并完全控制所有線程的調(diào)試解決方案。IAR Embedded Workbench 及其調(diào)試器功能提供了這樣一個(gè)工具,在開發(fā)和調(diào)試這些復(fù)雜系統(tǒng)時(shí)非常有用。

Aaron Bauch是IAR Systems的一名高級(jí)現(xiàn)場應(yīng)用工程師,與美國東部和加拿大的客戶合作。Aaron 曾為英特爾Analog Devices 和 Digital Equipment Corporation 等公司從事嵌入式系統(tǒng)和軟件方面的工作。他的設(shè)計(jì)涵蓋了廣泛的應(yīng)用,包括醫(yī)療儀器、導(dǎo)航和銀行系統(tǒng)。Aaron 還以南新罕布什爾大學(xué)教授的身份教授了許多大學(xué)水平的課程,包括嵌入式系統(tǒng)設(shè)計(jì)。Bauch 先生擁有紐約州紐約市 The Cooper Union 的電氣工程學(xué)士學(xué)位和哥倫比亞大學(xué)的電氣工程碩士學(xué)位。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    134

    文章

    9052

    瀏覽量

    366827
  • uart
    +關(guān)注

    關(guān)注

    22

    文章

    1227

    瀏覽量

    101177
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Java多線程的用法

    能力。 什么是進(jìn)程 是指正在運(yùn)行的程序的實(shí)例。 每個(gè)進(jìn)程都擁有自己的內(nèi)存空間、代碼、數(shù)據(jù)和文件等資源,可以獨(dú)立運(yùn)行、調(diào)度和管理。在操作系統(tǒng)中,進(jìn)程是系統(tǒng)資源分配的最小單位,是實(shí)現(xiàn)多任務(wù)的基礎(chǔ)。 Java多線程 Java
    的頭像 發(fā)表于 09-30 17:07 ?926次閱讀

    多線程編程之四 線程同步

    多線程編程之四 線程同步八、線程同步  雖然多線程能給我們帶來好處,但是也有不少問題需要解決
    發(fā)表于 10-22 11:43

    Linux多線程線程同步

    pthread_mutex_lock先加鎖,操作完之后pthread_mutex_unlock再解鎖。5、線程同步條件變量:使用條件變量可以以原子方式阻塞線程,直到某個(gè)特定條件為真為
    發(fā)表于 12-08 14:14

    QNX環(huán)境下多線程編程

    介紹了QNX 實(shí)時(shí)操作系統(tǒng)多線程編程技術(shù),包括線程同步的方法、多線程程序的分析步驟、線程基本
    發(fā)表于 08-12 17:37 ?30次下載

    多線程與聊天室程序的創(chuàng)建

    多線程程序的編寫,多線程應(yīng)用中容易出現(xiàn)的問題。互斥對(duì)象的講解,如何采用互斥對(duì)象來實(shí)現(xiàn)多線程同步。如何利用命名互斥對(duì)象保證應(yīng)用程序只有一個(gè)實(shí)例運(yùn)行。應(yīng)用
    發(fā)表于 05-16 15:22 ?0次下載

    設(shè)計(jì)多線程和多核系統(tǒng)

    如果您的微控制器應(yīng)用程序需要處理數(shù)字音頻,請(qǐng)考慮采用多線程方法。使用多線程設(shè)計(jì)方法可以使設(shè)計(jì)者以簡單的方式重用其部分設(shè)計(jì)。
    發(fā)表于 08-14 15:42 ?9次下載
    設(shè)計(jì)<b class='flag-5'>多線程</b>和多核<b class='flag-5'>系統(tǒng)</b>

    基于多線程環(huán)境下值的遞增操作--原子操作

    因此在多線程環(huán)境中對(duì)一個(gè)變量進(jìn)行讀寫時(shí),我們需要有一種方法能夠保證對(duì)一個(gè)值的遞增操作是原子操作——即不可打斷性,一個(gè)線程在執(zhí)行原子操作時(shí),其它線程
    的頭像 發(fā)表于 01-10 11:16 ?6147次閱讀
    基于<b class='flag-5'>多線程</b>環(huán)境下值的遞增操作--<b class='flag-5'>原子</b>操作

    Linux多線程同步

    overflow的問題。)?并發(fā)多線程相當(dāng)于一個(gè)并發(fā)(concunrrency)系統(tǒng)。并發(fā)系統(tǒng)一般同時(shí)執(zhí)行多個(gè)任務(wù)。如果多個(gè)任務(wù)可以共享資源,特別是同時(shí)寫入某個(gè)變量的時(shí)候,就需要解決同步
    發(fā)表于 04-02 14:47 ?412次閱讀

    RTOS多線程訪問同一硬件(如UART)的方法

    RTOS多線程(任務(wù))訪問同一硬件(如UART)的方法
    的頭像 發(fā)表于 03-12 11:28 ?5412次閱讀

    通過多線程來實(shí)現(xiàn)ADC采集功能和OLED顯示功能

    RTOS編程和裸機(jī)編程最大的區(qū)別就是RTOS可實(shí)現(xiàn)多線程管理,這是RTOS的最大優(yōu)勢。既然跑了操作系統(tǒng),為何不用
    的頭像 發(fā)表于 11-20 09:30 ?5982次閱讀
    通過<b class='flag-5'>多線程</b>來實(shí)現(xiàn)ADC采集功能和OLED顯示功能

    RT-Thread學(xué)習(xí)筆記 --(4)RT-Thread多線程學(xué)習(xí)過程總結(jié)

    多線程是實(shí)時(shí)操作系統(tǒng)里面最重要的知識(shí)點(diǎn)之一,要學(xué)習(xí)RTOS多線程是必須(沒錯(cuò),是必須)要熟練掌握的內(nèi)容,只有熟練掌握多線程的使用...
    發(fā)表于 01-25 18:54 ?0次下載
    RT-Thread學(xué)習(xí)筆記 --(4)RT-Thread<b class='flag-5'>多線程</b>學(xué)習(xí)過程總結(jié)

    RTOS多線程必須要MMU才行?

    的作用。 但是,并不是所有操作系統(tǒng)都需要MMU才行,我們嵌入式中很多常用的RTOS(實(shí)時(shí)操作系統(tǒng))沒有MMU一樣可以實(shí)現(xiàn)多線程。 只是RTOS
    的頭像 發(fā)表于 10-11 18:56 ?2352次閱讀

    多線程同步的幾種方法

    多線程同步是指在多個(gè)線程并發(fā)執(zhí)行的情況下,為了保證線程執(zhí)行的正確性和一致性,需要采用特定的方法來協(xié)調(diào)線程之間的執(zhí)行順序和共享資源的訪問。下面
    的頭像 發(fā)表于 11-17 14:16 ?1121次閱讀

    多線程如何保證數(shù)據(jù)的同步

    多線程編程是一種并發(fā)編程的方法,意味著程序中同時(shí)運(yùn)行多個(gè)線程,每個(gè)線程可獨(dú)立執(zhí)行不同的任務(wù),共享同一份數(shù)據(jù)。由于多線程并發(fā)執(zhí)行的特點(diǎn),會(huì)引發(fā)數(shù)據(jù)同步
    的頭像 發(fā)表于 11-17 14:22 ?1157次閱讀

    mfc多線程編程實(shí)例

    (圖形用戶界面)應(yīng)用程序的開發(fā)。在這篇文章中,我們將重點(diǎn)介紹MFC中的多線程編程。 多線程編程在軟件開發(fā)中非常重要,它可以實(shí)現(xiàn)程序的并發(fā)執(zhí)行,提高程序的效率和響應(yīng)速度。MFC提供了豐富的多線程支持,可以輕松地實(shí)現(xiàn)
    的頭像 發(fā)表于 12-01 14:29 ?1440次閱讀