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

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

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

RTOS互斥訪問(wèn)串口的方法

strongerHuang ? 來(lái)源:strongerHuang ? 作者:strongerHuang ? 2022-10-12 09:14 ? 次閱讀

RTOS多任務(wù)編程的時(shí)候,同一個(gè)硬件(比如UART、I2C等)被多個(gè)任務(wù)訪問(wèn)的情況比較多,如果不合理處理,就會(huì)導(dǎo)致“混亂”的局面。 處理“混亂”局面的方法比較多,下面基于FreeRTOS,以UART為例講講常見(jiàn)的互斥、隊(duì)列這兩種方法。

互斥訪問(wèn)串口的方法

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

創(chuàng)建互斥量 任務(wù)A占用資源 使用資源(發(fā)送數(shù)據(jù)) 任務(wù)A釋放資源 優(yōu)先級(jí)高的任務(wù)B占用資源 使用資源 任務(wù)B釋放資源 依次,優(yōu)先級(jí)任務(wù)占用資源 · · ·

代碼:

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


void TaskA(void *pvParameters)
{
  for(;;)
  {
    //占用資源
    if(xSemaphoreTake(xSemaphore, 10 ) == pdTRUE)
    {
      //使用資源(發(fā)送數(shù)據(jù))
      USART_SendNByte();
      //釋放資源
      xSemaphoreGive(xSemaphore);
    }
  }
}
信號(hào)量與互斥量區(qū)別信號(hào)量:多個(gè)任務(wù)同步使用某個(gè)資源; 一個(gè)任務(wù)完成某個(gè)動(dòng)作后通過(guò)信號(hào)告訴別的任務(wù),別的任務(wù)才可以執(zhí)行某些動(dòng)作; 互斥量:多任務(wù)互斥使用某個(gè)資源; 一個(gè)任務(wù)占用某個(gè)資源,那么別的任務(wù)就無(wú)法訪問(wèn),直到該任務(wù)離開(kāi),其他任務(wù)才可以訪問(wèn)該資源;

隊(duì)列訪問(wèn)串口的方法

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

創(chuàng)建一個(gè)隊(duì)列(發(fā)送數(shù)據(jù)隊(duì)列) 創(chuàng)建一個(gè)任務(wù)(UART發(fā)送數(shù)據(jù)任務(wù)) 任務(wù)A加入隊(duì)列 任務(wù)B加入隊(duì)列 · · · 另外一邊的任務(wù),依次讀取隊(duì)列數(shù)據(jù),使用UART發(fā)送出去。

代碼:

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(;;)
  {
    //任務(wù)相關(guān)操作


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


void TaskB(void *pvParameters)
{
  for(;;)
  {
    //任務(wù)相關(guān)操作


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


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

提示:代碼僅供學(xué)習(xí)理解原理,在項(xiàng)目中需要結(jié)合實(shí)際情況增、刪、修改代碼。

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

    關(guān)注

    8

    文章

    7073

    瀏覽量

    89140
  • 硬件
    +關(guān)注

    關(guān)注

    11

    文章

    3342

    瀏覽量

    66278
  • RTOS
    +關(guān)注

    關(guān)注

    22

    文章

    815

    瀏覽量

    119706

原文標(biāo)題:多線程通過(guò)互斥和隊(duì)列訪問(wèn)串口

文章出處:【微信號(hào):strongerHuang,微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    詳細(xì)談?wù)凩inux中的多線程同步和互斥機(jī)制

    互斥:多線程中互斥是指多個(gè)線程訪問(wèn)同一資源時(shí)同時(shí)只允許一個(gè)線程對(duì)其進(jìn)行訪問(wèn),具有唯一性和排它性。但互斥無(wú)法限制
    的頭像 發(fā)表于 03-20 09:09 ?1876次閱讀

    使用STM32CUBEMX創(chuàng)建一個(gè)基于RTOS的工程,互斥量創(chuàng)建不成功的原因?

    使用STM32CUBEMX創(chuàng)建一個(gè)基于RTOS的工程,使用了互斥量,但互斥量創(chuàng)建不成功
    發(fā)表于 05-15 07:22

    【MiCOKit試用體驗(yàn)】慶科MiCO系統(tǒng)篇(3)MiCO RTOS互斥

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

    第15章 互斥信號(hào)量

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

    信號(hào)量和互斥鎖的區(qū)別

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

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

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

    詳解互斥信號(hào)量的概念和運(yùn)行

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

    如何讓RTOS多任務(wù)訪問(wèn)同一個(gè)UART?

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

    RTOS開(kāi)發(fā)中的Mutex互斥

    在基于RTOS開(kāi)發(fā)項(xiàng)目時(shí),通常都會(huì)遇到互斥的情況,比如:幾個(gè)任務(wù)都要使用一個(gè)UART串口進(jìn)行發(fā)送數(shù)據(jù)。
    的頭像 發(fā)表于 04-07 10:32 ?2576次閱讀

    什么是Mutex互斥

    在基于RTOS開(kāi)發(fā)項(xiàng)目時(shí),通常都會(huì)遇到互斥的情況,比如:幾個(gè)任務(wù)都要使用一個(gè)UART串口進(jìn)行發(fā)送數(shù)據(jù)。
    的頭像 發(fā)表于 08-22 09:03 ?1235次閱讀

    Free RTOS互斥信號(hào)量

    二進(jìn)制信號(hào)量和互斥量非常相似,但確實(shí)有一些細(xì)微的區(qū)別。互斥體包含優(yōu)先級(jí)繼承機(jī)制,而二進(jìn)制信號(hào)量沒(méi)有。這使得二進(jìn)制信號(hào)量成為實(shí)現(xiàn)同步(任務(wù)之間或任務(wù)與中斷之間)的更好選擇,互斥體成為實(shí)現(xiàn)簡(jiǎn)單互斥
    的頭像 發(fā)表于 02-10 15:36 ?1199次閱讀
    Free <b class='flag-5'>RTOS</b>的<b class='flag-5'>互斥</b>信號(hào)量

    使用Linux互斥體實(shí)現(xiàn)互斥點(diǎn)燈

    互斥訪問(wèn)是指一次只有一個(gè)線程可以訪問(wèn)共享資源,不能遞歸申請(qǐng)互斥體。使用互斥體時(shí)要注意如下幾點(diǎn)。
    的頭像 發(fā)表于 04-13 15:13 ?874次閱讀
    使用Linux<b class='flag-5'>互斥</b>體實(shí)現(xiàn)<b class='flag-5'>互斥</b>點(diǎn)燈

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

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

    互斥鎖和自旋鎖的實(shí)現(xiàn)原理

    互斥鎖和自旋鎖是操作系統(tǒng)中常用的同步機(jī)制,用于控制對(duì)共享資源的訪問(wèn),以避免多個(gè)線程或進(jìn)程同時(shí)訪問(wèn)同一資源,從而引發(fā)數(shù)據(jù)不一致或競(jìng)爭(zhēng)條件等問(wèn)題。 互斥鎖(Mutex)
    的頭像 發(fā)表于 07-10 10:07 ?510次閱讀