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

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

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

3天內不再提示

韋東山freeRTOS系列教程之同步互斥與通信(4)

嵌入式Linux那些事 ? 2021-12-13 14:31 ? 次閱讀

文章目錄

  • 系列教程總目錄
  • 概述
  • 4.1 同步與互斥的概念
  • 4.2 同步與互斥并不簡單
  • 4.3 各類方法的對比

需要獲取更好閱讀體驗的同學,請訪問我專門設立的站點查看,地址:http://rtos.100ask.net/

系列教程總目錄

本教程連載中,篇章會比較多,為方便同學們閱讀,點擊這里可以查看文章的 目錄列表,目錄列表頁面地址:https://blog.csdn.net/thisway_diy/article/details/121399484

概述

本章是概述性的內容。可以把多任務系統當做一個團隊,里面的每一個任務就相當于團隊里的一個人。團隊成員之間要協調工作進度(同步)、爭用會議室(互斥)、溝通(通信)。多任務系統中所涉及的概念,都可以在現實生活中找到例子。

各類RTOS都會涉及這些概念:任務通知(task notification)、隊列(queue)、事件組(event group)、信號量(semaphoe)、互斥量(mutex)等。我們先站在更高角度來講解這些概念。

4.1 同步與互斥的概念

一句話理解同步與互斥:我等你用完廁所,我再用廁所

  • 什么叫同步?就是:哎哎哎,我正在用廁所,你等會。
  • 什么叫互斥?就是:哎哎哎,我正在用廁所,你不能進來。

同步與互斥經常放在一起講,是因為它們之的關系很大,“互斥”操作可以使用“同步”來實現。我“等”你用完廁所,我再用廁所。這不就是用“同步”來實現“互斥”嗎?

再舉一個例子。在團隊活動里,同事A先寫完報表,經理B才能拿去向領導匯報。經理B必須等同事A完成報表,AB之間有依賴,B必須放慢腳步,被稱為同步。在團隊活動中,同事A已經使用會議室了,經理B也想使用,即使經理B是領導,他也得等著,這就叫互斥。經理B跟同事A說:你用完會議室就提醒我。這就是使用"同步"來實現"互斥"。

有時候看代碼更容易理解,偽代碼如下:

01 void  搶廁所(void)
02 {
03    if (有人在用) 我瞇一會;
04    用廁所;
05    喂,醒醒,有人要用廁所嗎;
06 }

假設有A、B兩人早起搶廁所,A先行一步占用了;B慢了一步,于是就瞇一會;當A用完后叫醒B,B也就愉快地上廁所了。
在這個過程中,A、B是互斥地訪問“廁所”,“廁所”被稱之為臨界資源。我們使用了“休眠-喚醒”的同步機制實現了“臨界資源”的“互斥訪問”。

同一時間只能有一個人使用的資源,被稱為臨界資源。比如任務A、B都要使用串口來打印,串口就是臨界資源。如果A、B同時使用串口,那么打印出來的信息就是A、B混雜,無法分辨。所以使用串口時,應該是這樣:A用完,B再用;B用完,A再用。

4.2 同步與互斥并不簡單

4.3 各類方法的對比

能實現同步、互斥的內核方法有:任務通知(task notification)、隊列(queue)、事件組(event group)、信號量(semaphoe)、互斥量(mutex)。

它們都有類似的操作方法:獲取/釋放、阻塞/喚醒、超時。比如:

  • A獲取資源,用完后A釋放資源
  • A獲取不到資源則阻塞,B釋放資源并把A喚醒
  • A獲取不到資源則阻塞,并定個鬧鐘;A要么超時返回,要么在這段時間內因為B釋放資源而被喚醒。

這些內核對象五花八門,記不住怎么辦?我也記不住,通過對比的方法來區分它們。

  • 能否傳信息?只能傳遞狀態?
  • 為眾生?只為你?
  • 我生產,你們消費?
  • 我上鎖,只能由我開鎖
內核對象 生產者 消費者 數據/狀態 說明
隊列 ALL ALL 數據:若干個數據
誰都可以往隊列里扔數據,
誰都可以從隊列里讀數據
用來傳遞數據,
發送者、接收者無限制,
一個數據只能喚醒一個接收者
事件組 ALL ALL 多個位:或、與
誰都可以設置(生產)多個位,
誰都可以等待某個位、若干個位
用來傳遞事件,
可以是N個事件,
發送者、接受者無限制,
可以喚醒多個接收者:像廣播
信號量 ALL ALL 數量:0~n
誰都可以增加一個數量,
誰都可消耗一個數量
用來維持資源的個數,
生產者、消費者無限制,
1個資源只能喚醒1個接收者
任務通知 ALL 只有我 數據、狀態都可以傳輸,
使用任務通知時,
必須指定接受者
N對1的關系:
發送者無限制,
接收者只能是這個任務
互斥量 只能A開鎖 A上鎖 位:0、1
我上鎖:1變為0,
只能由我開鎖:0變為1
就像一個空廁所,
誰使用誰上鎖,
也只能由他開鎖

使用圖形對比如下:

  • 隊列:
    • 里面可以放任意數據,可以放多個數據
    • 任務、ISR都可以放入數據;任務、ISR都可以從中讀出數據
  • 事件組:
    • 一個事件用一bit表示,1表示事件發生了,0表示事件沒發生
    • 可以用來表示事件、事件的組合發生了,不能傳遞數據
    • 有廣播效果:事件或事件的組合發生了,等待它的多個任務都會被喚醒
  • 信號量:
    • 核心是"計數值"
    • 任務、ISR釋放信號量時讓計數值加1
    • 任務、ISR獲得信號量時,讓計數值減1
  • 任務通知:
    • 核心是任務的TCB里的數值
    • 會被覆蓋
    • 發通知給誰?必須指定接收任務
    • 只能由接收任務本身獲取該通知
  • 互斥量:
    • 數值只有0或1
    • 誰獲得互斥量,就必須由誰釋放同一個互斥量
在這里插入圖片描述
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 通信
    +關注

    關注

    18

    文章

    5977

    瀏覽量

    135872
  • RTOS
    +關注

    關注

    22

    文章

    809

    瀏覽量

    119454
  • FreeRTOS
    +關注

    關注

    12

    文章

    483

    瀏覽量

    62019
收藏 人收藏

    評論

    相關推薦

    東山freeRTOS系列程之信號量(6)

    文章目錄 系列教程總目錄 概述 6.1 信號量的特性 6.1.1 信號量的常規操作 6.1.2 信號量跟隊列的對比 6.1.3 兩種信號量的對比 6.2 信號量函數 6.2.1 創建 6.2.2
    的頭像 發表于 12-13 14:35 ?5024次閱讀
    <b class='flag-5'>韋</b><b class='flag-5'>東山</b><b class='flag-5'>freeRTOS</b><b class='flag-5'>系列</b>教<b class='flag-5'>程之</b>信號量(6)

    東山freeRTOS系列程之隊列(queue)(5)

    文章目錄 系列教程總目錄 概述 5.1 隊列的特性 5.1.1 常規操作 5.1.2 傳輸數據的兩種方法 5.1.3 隊列的阻塞訪問 5.2 隊列函數 5.2.1 創建 5.2.2 復位 5.2.3
    的頭像 發表于 12-13 14:33 ?5819次閱讀
    <b class='flag-5'>韋</b><b class='flag-5'>東山</b><b class='flag-5'>freeRTOS</b><b class='flag-5'>系列</b>教<b class='flag-5'>程之</b>隊列(queue)(5)

    東山freeRTOS系列程之互斥量(mutex)(7)

    文章目錄 系列教程總目錄 概述 7.1 互斥量的使用場合 7.2 互斥量函數 7.2.1 創建 7.2.2 其他函數 7.3 示例15: 互斥量基本使用 7.4 示例16: 誰上鎖就由
    的頭像 發表于 12-13 14:38 ?7664次閱讀
    <b class='flag-5'>韋</b><b class='flag-5'>東山</b><b class='flag-5'>freeRTOS</b><b class='flag-5'>系列</b>教<b class='flag-5'>程之</b><b class='flag-5'>互斥</b>量(mutex)(7)

    基于FreeRTOS的STM32F103系統—隊列

    FreeRTOS中,隊列是實現任務之間同步互斥通信的一種重要方法(其他的實現方法有:任務通知、事件組、信號量、互斥量)。
    的頭像 發表于 11-10 11:37 ?1102次閱讀
    基于<b class='flag-5'>FreeRTOS</b>的STM32F103系統—隊列

    東山linux視頻

    東山linux視頻主要內容包括:uboot、裸機、文件系統、驅動初步,又需要的可以下載看看東山的視頻還是很不錯的,可惜沒有找到后兩期的。【整理】
    發表于 12-21 23:49

    轉:第23章 FreeRTOS互斥信號量

    FreeRTOS互斥信號量的源碼實現是基于消息隊列實現的。本章教程配套的例子含Cortex-M3內核的STM32F103和Cortex-M4內核的STM32F407以及F429。23.1
    發表于 09-06 14:58

    多線程同步互斥有幾種實現方法

    線程同步是指線程之間所具有的一種制約關系,一個線程的執行依賴另一個線程的消息,當它沒有得到另一個線程的消息時應等待,直到消息到達時才被喚醒。線程互斥是指對于共享的進程系統資源,在各單個線程訪問時的排
    發表于 08-05 06:06

    同步互斥通信相關資料下載

    慕課電子科技大學.嵌入式系統.第八章.同步互斥通信.異步信號和管道0 目錄8 同步互斥通信8
    發表于 12-22 06:37

    東山freeRTOS系列教程:入門文檔教程+進階視頻教程

    文章目錄 學前知識普及 初級文檔教程 進階視頻教程 進階一:FreeRTOS的內部機制 進階二:深入理解FreeRTOS隊列之隊列實戰 進階三:RTOS商業產品案例源碼講解 學前知識普及 對于
    發表于 11-29 16:36 ?2222次閱讀
    <b class='flag-5'>韋</b><b class='flag-5'>東山</b><b class='flag-5'>freeRTOS</b><b class='flag-5'>系列</b>教程:入門文檔教程+進階視頻教程

    東山freeRTOS程之FreeRTOS概述與體驗(1)

    文章目錄 教程目錄 1.1 FreeRTOS目錄結構 1.1 FreeRTOS目錄結構 1.2 核心文件 1.3 移植時涉及的文件 1.4 頭文件相關 1.4.1 頭文件目錄 1.4.2 頭文件
    發表于 11-29 16:56 ?1988次閱讀
    <b class='flag-5'>韋</b><b class='flag-5'>東山</b><b class='flag-5'>freeRTOS</b>教<b class='flag-5'>程之</b><b class='flag-5'>FreeRTOS</b>概述與體驗(1)

    東山freeRTOS系列程之內存管理(2)

    文章目錄 教程目錄 2.1 為什么要自己實現內存管理 2.2 FreeRTOS的5種內存管理方法 2.2.1 Heap_1 2.2.2 Heap_2 2.2.3 Heap_3 2.2.4
    發表于 11-29 16:58 ?1014次閱讀
    <b class='flag-5'>韋</b><b class='flag-5'>東山</b><b class='flag-5'>freeRTOS</b><b class='flag-5'>系列</b>教<b class='flag-5'>程之</b>內存管理(2)

    東山freeRTOS系列程之任務管理(3)

    文章目錄 系列教程總目錄 概述 3.1 基本概念 3.2 任務創建與刪除 3.2.1 什么是任務 3.2.2 創建任務 3.2.3 示例1: 創建任務 3.2.4 示例2: 使用任務參數 3.2.5
    發表于 11-29 17:00 ?1064次閱讀
    <b class='flag-5'>韋</b><b class='flag-5'>東山</b><b class='flag-5'>freeRTOS</b><b class='flag-5'>系列</b>教<b class='flag-5'>程之</b>任務管理(3)

    東山嵌入式Linux學習——012 按鍵中斷

    東山嵌入式Linux學習——012 按鍵中斷
    發表于 12-04 17:36 ?10次下載
    <b class='flag-5'>韋</b><b class='flag-5'>東山</b>嵌入式Linux學習——012 按鍵中斷

    FreeRTOS 隊列 信號量 互斥

    文章目錄前言Queue 隊列semaphore 信號量Mutex 互斥量微信公眾號前言FreeRTOS STM32CubeMX配置 內存管理 任務管理上節介紹了用STM32CubeMX生成帶
    發表于 12-09 09:51 ?0次下載
    <b class='flag-5'>FreeRTOS</b> 隊列 信號量 <b class='flag-5'>互斥</b>量

    FreeRTOS的二值信號量

    FreeRTOS中的信號量是一種任務間通信的方式,信號量包括:二值信號量、互斥信號量、計數信號量,本次實驗只使用二值信號量。信號量用于任務間的同步
    的頭像 發表于 02-10 15:07 ?1467次閱讀