色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

多線程RTOS系統:如何加速原子同步

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

同步

原子操作的動機來自于在共享資源時需要同步兩個或多個實體。一個簡單的例子可能是基于多線程 RTOS 的系統中的兩個線程,這兩個線程都需要偶爾向它們共享的 UART 外圍設備發送消息。

在操作中,一個線程可能會獲得對 UART 的控制權并持有該控制權,直到其整個消息被發送。否則,如果另一個線程決定在第一個線程未完成時發送消息,這兩個線程可能會通過 UART 發送替代字符,從而導致控制臺端口出現一堆難以理解的亂碼。

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

當線程 1 有消息要發送時,它會讀取鎖定字。它看到它是 0,所以它寫一個 1 到這個位置。任何其他想要發送消息的線程都會發現這個鎖或信號量包含一個 1,并且會等到它被清除后再嘗試獲取資源以供自己使用。

如果檢查和設置鎖的過程被中斷,就會出現問題。

考慮以下情況:

任務 1 讀取鎖定字。

它找到包含零的單詞。

任務 1 由于更高優先級的任務或導致其暫停的中斷而停止。

當任務 1 被掛起時,任務 2 以更高的優先級運行。

任務 2 需要發送一條消息并讀取它發現包含零的鎖定字。

任務 1 將 1 寫入鎖定字,知道它現在擁有 UART 的唯一控制權,直到其消息被發送。

由于所需資源不可用,任務 2 釋放控制權。

任務 1 繼續運行,知道鎖包含 0,將 1 寫入鎖字。

現在,任務 1 和任務 2 都確定它們對 UART 資源具有獨特的控制權,并將交錯地向其發送字符,因為他們看到它在逐個字符的基礎上變得可用。

原子操作

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

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

對原子操作的支持內置于 C11 及更高版本等語言標準中。但是,用于在機器指令級別和硬件級別實現這一點的實際機制必須存在于 CPU 的指令集架構 (ISA) 和系統硬件實現中,以確保正確操作。

在上述情況下,任務 1 必須完成所有測試和設置鎖的步驟,然后任何其他任務或實體才能訪問內存中的鎖字。

在單核系統中,這通常可以通過簡單地在讀取鎖定字之前禁用所有中斷并在寫入鎖定后重新啟用它們來確保。通過這種方式,不會發生中斷,因此不會導致內核在其測試和設置操作的中間搶占任務 1。

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

多核復雜性

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

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

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

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

這樣,系統可以保證沒有其他總線主控器可以修改內存中的值,從而使兩個主控器都認為他們擁有共享資源的所有權。

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

現實世界的影響

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

調試多核同步

多核調試器可以通過顯示在多個內核或線程上運行的程序來幫助查找同步問題,以及根據另一個內核上的斷點有選擇地停止和啟動內核的能力應該是確定這種機制問題的理想選擇。

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

poYBAGKYjiWAE2OSAADhRC2fgzE974.png

圖 1:每個內核獨立的調試器控制。(來源:IAR 系統)

圖 2 顯示了在不同 CPU 上運行的代碼中使用多個斷點并結合使用互斥鎖(Arm 提供的示例):_mutex_acquire() 和 _mutex_release(),設置標志以阻止所使用對象的在素數計算中。

poYBAGKYjjGAYdxhAAPpeEG7Mr4459.png

圖 2:在單個內核中使用互斥鎖和斷點。(來源:IAR 系統)

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

pYYBAGKYjkOAe3wmAACG35krBBM017.png

圖 3:使用交叉觸發接口 (CTI) 進行完全控制。(來源:IAR 系統)

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

poYBAGKYjliAPL7vAARd40o5hIQ446.png

圖 4:在配備 4 個 Cortex-A53 和 1 個 Cortex-M4 的 NXP i.MX 8 設備上運行的多核會話。(來源:IAR 系統)

在應用程序中使用并行性和并發性旨在更有效地使用可用內核。然而,它的代價是增加了應用程序的復雜性,以及如何將源代碼拆分成更小的部分以盡可能高效地運行。

概括

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

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • ARM
    ARM
    +關注

    關注

    134

    文章

    9087

    瀏覽量

    367398
  • uart
    +關注

    關注

    22

    文章

    1235

    瀏覽量

    101355
收藏 人收藏

    評論

    相關推薦

    Java多線程的用法

    能力。 什么是進程 是指正在運行的程序的實例。 每個進程都擁有自己的內存空間、代碼、數據和文件等資源,可以獨立運行、調度和管理。在操作系統中,進程是系統資源分配的最小單位,是實現多任務的基礎。 Java多線程 Java
    的頭像 發表于 09-30 17:07 ?947次閱讀

    多線程編程之四 線程同步

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

    Linux多線程線程同步

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

    QNX環境下多線程編程

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

    多線程與聊天室程序的創建

    多線程程序的編寫,多線程應用中容易出現的問題。互斥對象的講解,如何采用互斥對象來實現多線程同步。如何利用命名互斥對象保證應用程序只有一個實例運行。應用
    發表于 05-16 15:22 ?0次下載

    設計多線程和多核系統

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

    基于多線程環境下值的遞增操作--原子操作

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

    Linux多線程同步

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

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

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

    通過多線程來實現ADC采集功能和OLED顯示功能

    RTOS編程和裸機編程最大的區別就是RTOS可實現多線程管理,這是RTOS的最大優勢。既然跑了操作系統,為何不用
    的頭像 發表于 11-20 09:30 ?6052次閱讀
    通過<b class='flag-5'>多線程</b>來實現ADC采集功能和OLED顯示功能

    RT-Thread學習筆記 --(4)RT-Thread多線程學習過程總結

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

    RTOS多線程必須要MMU才行?

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

    多線程同步的幾種方法

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

    多線程如何保證數據的同步

    多線程編程是一種并發編程的方法,意味著程序中同時運行多個線程,每個線程可獨立執行不同的任務,共享同一份數據。由于多線程并發執行的特點,會引發數據同步
    的頭像 發表于 11-17 14:22 ?1222次閱讀

    mfc多線程編程實例

    (圖形用戶界面)應用程序的開發。在這篇文章中,我們將重點介紹MFC中的多線程編程。 多線程編程在軟件開發中非常重要,它可以實現程序的并發執行,提高程序的效率和響應速度。MFC提供了豐富的多線程支持,可以輕松地實現
    的頭像 發表于 12-01 14:29 ?1503次閱讀
    主站蜘蛛池模板: 少妇内射视频播放舔大片| 午夜福利32集云播| 亚洲电影成人 成人影院| 97蜜桃网123.com| 娇女的呻吟亲女禁忌h16| 乳交高H糙汉宠文| 99久久久久亚洲AV无码| 精品午夜视频| 爽爽影院线观看免费| WWW国产亚洲精品久久麻豆| 美女扒开屁股让男人桶| 曰韩一本道高清无码av| 果冻传媒独家原创在线观看| 色久悠悠无码偷拍自怕| 成年视频国产免费观看| 欧美亚洲日本日韩在线| 99这里有精品视频视频| 免费在线观看国产| 97夜夜澡人人爽人人模人人喊| 极品美女穴| 伊人久久大香线蕉综合影| 挤奶门事件完整照片 | 美女脱精光让男生桶下面| 亚洲最大日夜无码中文字幕| 国色天香视频在线社区| 亚洲风情无码免费视频| 国产亚洲视频精彩在线播放| 我的年轻漂亮继坶三级| 国产偷国产偷亚洲高清app| 亚洲成A人片在线观看中文不卡 | 欧美精品一区二区三区四区| pkf女尸studiosxnxx| 四虎国产精品永久一区高清 | 久草色在线| 99视频这里只有精品| 无码专区aaaaaa免费视频| 京香在线观看| 成年女人免费播放影院| 亚洲精品乱码久久久久久直播| 蜜臀色欲AV无人A片一区| 大地影院免费观看视频|