衡阳派盒市场营销有限公司

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

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

3天內不再提示

RTOS互斥訪問串口的方法

strongerHuang ? 來源:strongerHuang ? 作者:strongerHuang ? 2022-10-12 09:14 ? 次閱讀

RTOS多任務編程的時候,同一個硬件(比如UARTI2C等)被多個任務訪問的情況比較多,如果不合理處理,就會導致“混亂”的局面。 處理“混亂”局面的方法比較多,下面基于FreeRTOS,以UART為例講講常見的互斥、隊列這兩種方法。

互斥訪問串口的方法

互斥量:是一個可以處于兩態之一的變量:解鎖和加鎖。 原理:創建一個互斥量,任務A在需要占用資源(使用UART發送數據),把資源(UART)占用。此時,任務B及其他任務就不能占用該資源。當任務A使用完資源(UART發送完數據),釋放資源,其他任務就可以搶占該資源。

創建互斥量 任務A占用資源 使用資源(發送數據) 任務A釋放資源 優先級高的任務B占用資源 使用資源 任務B釋放資源 依次,優先級任務占用資源 · · ·

代碼:

//創建互斥量資源
SemaphoreHandle_t xSemaphore = NULL;
xSemaphore = xSemaphoreCreateMutex();


void TaskA(void *pvParameters)
{
  for(;;)
  {
    //占用資源
    if(xSemaphoreTake(xSemaphore, 10 ) == pdTRUE)
    {
      //使用資源(發送數據)
      USART_SendNByte();
      //釋放資源
      xSemaphoreGive(xSemaphore);
    }
  }
}
信號量與互斥量區別信號量:多個任務同步使用某個資源; 一個任務完成某個動作后通過信號告訴別的任務,別的任務才可以執行某些動作; 互斥量:多任務互斥使用某個資源; 一個任務占用某個資源,那么別的任務就無法訪問,直到該任務離開,其他任務才可以訪問該資源;

隊列訪問串口的方法

隊列操作方法就是FIFO,先入先出的原理。比如:任務A要使用UART發送一串數據,將其加入隊列;接著任務B也要使用UART發送一串數據。 那么,任務A將這串數據加入隊列,接著任務B又將要發送的一串數據加入隊列。 在另外一個UART發送的任務中,從隊列中按照FIFO方式讀取隊列里面的數據,依次發送出去即可。

創建一個隊列(發送數據隊列) 創建一個任務(UART發送數據任務) 任務A加入隊列 任務B加入隊列 · · · 另外一邊的任務,依次讀取隊列數據,使用UART發送出去。

代碼:

QueueHandle_t xQueue;
xQueue = xQueueCreate(QUEUE_LENGTH, QUEUE_ITEM_SIZE);


xTaskCreate(UART_Send_Task, "UART_Send", STACK_SIZE, NULL, TASK_PRIORITY, NULL);


void TaskA(void *pvParameters)
{
  for(;;)
  {
    //任務相關操作


    //加入隊列
    xQueueSend(xQueue, &TaskA_Buf, 10)
  }
}


void TaskB(void *pvParameters)
{
  for(;;)
  {
    //任務相關操作


    //加入隊列
    xQueueSend(xQueue, &TaskB_Buf, 10)
  }
}


void UART_Send_Task(void *pvParameters)
{
  for(;;)
  {
    //循環讀取隊列BUF
    if(xQueueReceive(xQueue, &Buf, 10) == pdTRUE)
    {
      USART_SendNByte(&Buf);
    }
  }
}
以上兩種方法比較常用,也比較簡單,希望對大家有幫助。

提示:代碼僅供學習理解原理,在項目中需要結合實際情況增、刪、修改代碼。

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

    關注

    8

    文章

    7139

    瀏覽量

    89576
  • 硬件
    +關注

    關注

    11

    文章

    3381

    瀏覽量

    66447
  • RTOS
    +關注

    關注

    22

    文章

    819

    瀏覽量

    119887

原文標題:多線程通過互斥和隊列訪問串口

文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

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

    獲取更好閱讀體驗的同學,請訪問我專門設立的站點查看,地址:http://rtos.100ask.net/ 系列教程總目錄 本教程連載中,篇章會比較多,為方便同學們閱讀,點擊這里可以查
    的頭像 發表于 12-13 14:38 ?7750次閱讀
    韋東山freeRTOS系列教程之<b class='flag-5'>互斥</b>量(mutex)(7)

    詳細談談Linux中的多線程同步和互斥機制

    互斥:多線程中互斥是指多個線程訪問同一資源時同時只允許一個線程對其進行訪問,具有唯一性和排它性。但互斥無法限制
    的頭像 發表于 03-20 09:09 ?1915次閱讀

    使用STM32CUBEMX創建一個基于RTOS的工程,互斥量創建不成功的原因?

    使用STM32CUBEMX創建一個基于RTOS的工程,使用了互斥量,但互斥量創建不成功
    發表于 05-15 07:22

    【MiCOKit試用體驗】慶科MiCO系統篇(3)MiCO RTOS互斥

    本帖最后由 gjianw217 于 2015-10-25 15:45 編輯 在本帖子中,主要分析一下慶科MiCO RTOS互斥鎖,具體包括:OS互斥鎖MiCO互斥鎖關鍵APIM
    發表于 10-24 17:02

    第15章 互斥信號量

    15.1 互斥信號量15.1.1互斥信號量的概念及其作用 互斥信號量就是信號量的一種特殊形式,也就是信號量初始值為1的情況。有些RTOS中也將信號量初始值設置為1的情況稱之為二值信號量
    發表于 10-06 16:40

    信號量和互斥鎖的區別

    互斥量用于線程的互斥,信號線用于線程的同步。這是互斥量和信號量的根本區別,也就是互斥和同步之間的區別。互斥:是指某一資源同時只允許一個
    發表于 11-13 17:43 ?1.3w次閱讀
    信號量和<b class='flag-5'>互斥</b>鎖的區別

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

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

    詳解互斥信號量的概念和運行

    值信號量實現資源獨享,即互斥訪問的例子,讓大家有一個形象的認識,進而引出要講解的互斥信號量。 運行條件: 讓兩個任務 Task1 和 Task2 都運行串口打印函數 printf,這里
    的頭像 發表于 10-22 11:57 ?1.2w次閱讀
    詳解<b class='flag-5'>互斥</b>信號量的概念和運行

    如何讓RTOS多任務訪問同一個UART?

    RTOS多任務編程的時候,同一個硬件(比如UART、I2C等)被多個任務訪問的情況比較多,如果不合理處理,就會導致“混亂”的局面。 處理“混亂”局面的方法比較多,下面基于FreeRTOS,以
    的頭像 發表于 03-12 17:18 ?2142次閱讀

    RTOS開發中的Mutex互斥

    在基于RTOS開發項目時,通常都會遇到互斥的情況,比如:幾個任務都要使用一個UART串口進行發送數據。
    的頭像 發表于 04-07 10:32 ?2603次閱讀

    什么是Mutex互斥

    在基于RTOS開發項目時,通常都會遇到互斥的情況,比如:幾個任務都要使用一個UART串口進行發送數據。
    的頭像 發表于 08-22 09:03 ?1272次閱讀

    Free RTOS互斥信號量

    二進制信號量和互斥量非常相似,但確實有一些細微的區別。互斥體包含優先級繼承機制,而二進制信號量沒有。這使得二進制信號量成為實現同步(任務之間或任務與中斷之間)的更好選擇,互斥體成為實現簡單互斥
    的頭像 發表于 02-10 15:36 ?1249次閱讀
    Free <b class='flag-5'>RTOS</b>的<b class='flag-5'>互斥</b>信號量

    使用Linux互斥體實現互斥點燈

    互斥訪問是指一次只有一個線程可以訪問共享資源,不能遞歸申請互斥體。使用互斥體時要注意如下幾點。
    的頭像 發表于 04-13 15:13 ?904次閱讀
    使用Linux<b class='flag-5'>互斥</b>體實現<b class='flag-5'>互斥</b>點燈

    Linux互斥鎖的作用 互斥鎖是什么

    1、互斥互斥鎖(mutex),在訪問共享資源之前對互斥鎖進行上鎖,在訪問完成后釋放互斥鎖(解
    的頭像 發表于 07-21 11:13 ?997次閱讀

    互斥鎖和自旋鎖的實現原理

    互斥鎖和自旋鎖是操作系統中常用的同步機制,用于控制對共享資源的訪問,以避免多個線程或進程同時訪問同一資源,從而引發數據不一致或競爭條件等問題。 互斥鎖(Mutex)
    的頭像 發表于 07-10 10:07 ?608次閱讀
    诚信百家乐官网平台| 百家乐官网上分器定位器| 百家乐投注网中国体育| 澳门1百家乐网| 百家乐官网庄和闲的赌法| 威尼斯人娱乐平台反| 百家乐官网是真人发牌吗| 金赞百家乐官网娱乐城| 大发888娱乐城出纳| 现场百家乐电话投注| 赤壁百家乐官网娱乐城| 百家乐官网如何破解| 大发888新址| 大世界百家乐娱乐场| 皇冠网百家乐官网啊| 366百家乐官网娱乐城| 德州扑克几副牌| 赌场百家乐的玩法技巧和规则 | 至尊百家乐官网规则| 大发888 m摩卡游戏| 大上海百家乐的玩法技巧和规则 | 百家乐官网折桌子| 博彩网大全| 盐城百家乐的玩法技巧和规则| 免费百家乐游戏机| 太阳城百家乐官网的破解| 嵊泗县| 娱乐城送钱| 大发888娱乐游戏平台| 百家乐官网游戏算牌| bet365充值| 大发888娱乐场官网官方下载| 百家乐园蒙| 三星百家乐的玩法技巧和规则 | 百家乐官网美国玩法| 网上百家乐官网博彩正网| 石台县| 香港六合彩开奖结果网| 南通棋牌游戏中心下载| 德州扑克桌| 明升网址 |