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

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

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

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

strongerHuang ? 來源:strongerHuang ? 作者:strongerHuang ? 2021-03-12 17:18 ? 次閱讀

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

1

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

創(chuàng)建互斥量 任務(wù)A占用資源 使用資源(發(fā)送數(shù)據(jù)) 任務(wù)A釋放資源 優(yōu)先級高的任務(wù)B占用資源 使用資源 任務(wù)B釋放資源 依次,優(yōu)先級任務(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); } }} 信號量與互斥量區(qū)別:信號量:多個任務(wù)同步使用某個資源; 一個任務(wù)完成某個動作后通過信號告訴別的任務(wù),別的任務(wù)才可以執(zhí)行某些動作; 互斥量:多任務(wù)互斥使用某個資源; 一個任務(wù)占用某個資源,那么別的任務(wù)就無法訪問,直到該任務(wù)離開,其他任務(wù)才可以訪問該資源;

2

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

創(chuàng)建一個隊列(發(fā)送數(shù)據(jù)隊列) 創(chuàng)建一個任務(wù)(UART發(fā)送數(shù)據(jù)任務(wù)) 任務(wù)A加入隊列 任務(wù)B加入隊列 · · · 另外一邊的任務(wù),依次讀取隊列數(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)操作 //加入隊列 xQueueSend(xQueue, &TaskA_Buf, 10) }} void TaskB(void *pvParameters){ for(;;) { //任務(wù)相關(guān)操作 //加入隊列 xQueueSend(xQueue, &TaskB_Buf, 10) }} void UART_Send_Task(void *pvParameters){ for(;;) { //循環(huán)讀取隊列BUF if(xQueueReceive(xQueue, &Buf, 10) == pdTRUE) { USART_SendNByte(&Buf); } }}

以上兩種方法比較常用,也比較簡單,希望對大家有幫助。

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

原文標(biāo)題:RTOS多任務(wù)訪問同一個UART的方法

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

責(zé)任編輯:haq

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

    關(guān)注

    88

    文章

    3544

    瀏覽量

    93478
  • RTOS
    +關(guān)注

    關(guān)注

    21

    文章

    808

    瀏覽量

    119296

原文標(biāo)題:RTOS多任務(wù)訪問同一個UART的方法

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

收藏 人收藏

    評論

    相關(guān)推薦

    LV和組態(tài)王上位機(jī)軟件在同一電腦通過網(wǎng)線讀寫同一個PLC失敗

    問題:LV和組態(tài)王上位機(jī)軟件在同一電腦通過同一個網(wǎng)卡、同一根網(wǎng)線和IP讀寫同一個PLC失敗 PLC型號:西門子S7-200 smart 現(xiàn)狀:非標(biāo)設(shè)備自帶組態(tài)王上位機(jī)軟件,因整條產(chǎn)線有
    發(fā)表于 10-18 08:26

    大家好,請教恒流源芯片并聯(lián)使用接同一個LED的問題

    大家好,請教個問題,如果三路同款恒流源芯片都設(shè)定為1A的輸出電流,三路并聯(lián),然后接同一個LED,那流過LED的實際電流是多少呢每路恒流源芯片的實際輸出電流是多少呢假設(shè)是理想情況下。 如果兩路同款
    發(fā)表于 10-12 09:39

    運放的帶寬與運放的單位增益帶寬是同一個概念嗎?

    運放的帶寬與運放的單位增益帶寬是同一個概念嗎?
    發(fā)表于 09-04 06:18

    freertos和rtos區(qū)別是什么

    RTOS 的主要特點是實時性、多任務(wù)處理、資源管理、中斷處理等。 FreeRTOS 是開源的實時操作系統(tǒng),由英
    的頭像 發(fā)表于 09-02 14:18 ?651次閱讀

    同一個Thread對Socket的切換不成功,為什么?

    你好我想問下在外部調(diào)用5bit的接口時,怎么我下面同一個Thread對Socket的切換不成功? 我是看了其他帖子的回復(fù)進(jìn)行相關(guān)配置的,請問是否配置錯誤? 下面是時序圖: 下面是參考的帖子: 如果可以請詳細(xì)描述下錯誤的點
    發(fā)表于 05-31 07:51

    采用同一個觸發(fā)源和雙重采樣有什么區(qū)別?有什么好處呢?

    采用同一個觸發(fā)源和雙重采樣有什么區(qū)別?有什么好處?假如兩通道采樣,方式是采用雙重采樣,寧外
    發(fā)表于 04-10 06:29

    進(jìn)程內(nèi)多次使用open打開同一個文件,可以嗎?

    當(dāng)進(jìn)程內(nèi)多次使用 open 打開同一個文件時,每次都會得到新的文件描述符(file descriptor)。
    的頭像 發(fā)表于 02-27 13:54 ?1073次閱讀

    蘋果手機(jī)用同一個id怎么取消同步

    蘋果手機(jī)用同一個id怎么取消同步? 取消蘋果手機(jī)間的同步功能可以通過以下步驟完成。請注意,這些步驟適用于iOS 11及更高版本。 步驟1:打開“設(shè)置”應(yīng)用程序 首先,打開您的iPhone或iPad
    的頭像 發(fā)表于 02-19 10:19 ?2798次閱讀

    雙應(yīng)用的bootloadable程序,EEPROM怎樣指向同一個地址?

    bootloadable程序中的EEPROM指向同一個地址,這樣boot升級后,新的程序可以調(diào)用以前保存的數(shù)據(jù),附件是我的bootloader和bootloadable工程
    發(fā)表于 02-06 08:28

    同一個芯片不同封裝的原因

    同一個芯片的不同封裝可能是為了滿足不同的應(yīng)用需求和設(shè)計要求。不同的封裝可以影響芯片的功耗、散熱性能、引腳數(shù)量和布局等方面。
    的頭像 發(fā)表于 12-18 18:15 ?1014次閱讀

    如何設(shè)置兩路由器使用同一個Wi-Fi網(wǎng)絡(luò)?

    如何設(shè)置兩路由器使用同一個Wi-Fi網(wǎng)絡(luò) 隨著無線網(wǎng)絡(luò)的普及和需求量的增加,很多家庭和辦公室都會購買多個路由器來擴(kuò)展無線網(wǎng)絡(luò)覆蓋范圍。然而,許多人可能不知道如何正確設(shè)置兩路由器以使它們使用
    的頭像 發(fā)表于 12-11 10:50 ?1.2w次閱讀

    RTOS內(nèi)功修煉記()— 任務(wù)到底應(yīng)該怎么寫?

    本篇文章講述了任務(wù)的三大元素:任務(wù)控制塊、任務(wù)棧、任務(wù)入口函數(shù),并講述了編寫RTOS任務(wù)入口函數(shù)
    的頭像 發(fā)表于 12-01 16:36 ?662次閱讀
    <b class='flag-5'>RTOS</b>內(nèi)功修煉記(<b class='flag-5'>一</b>)— <b class='flag-5'>任務(wù)</b>到底應(yīng)該怎么寫?

    ZMC運動控制器多任務(wù)編程

    廣泛應(yīng)用,有效提升生產(chǎn)和運行效率。 ZMC運動控制器多任務(wù)概念:任務(wù)是執(zhí)行 I/O 刷新和用戶程序等系列指令處理的功能,
    發(fā)表于 11-07 09:52

    RTOS相比裸機(jī)有什么優(yōu)點?RTOS相比裸機(jī)更方便嗎?

    理實時任務(wù)。在本文中,我們將探討使用RTOS而不是裸金屬系統(tǒng)的優(yōu)點,以及它是否更方便。 RTOS相對于裸機(jī)系統(tǒng)的優(yōu)勢 1.多任務(wù)處理 RTOS
    的頭像 發(fā)表于 10-29 16:33 ?1495次閱讀

    請問設(shè)備上有兩顆mcu可以使用同一個晶振嗎?

    我按到很多設(shè)計用同一個晶振,也有分開用的,請問分開和不分開有什么優(yōu)缺點
    發(fā)表于 10-26 06:28