0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何让RTOS多任务访问同一个UART?

strongerHuang 来源:strongerHuang 作者:strongerHuang 2021-03-12 17:18 次阅读

RTOS多任务编程的时候,同一个硬件(比如UARTI2C等)被多个任务访问的情况比较多,如果不合理处理,就会导致“混乱”的局面。 处理“混乱”局面的方法比较多,下面基于FreeRTOS,以UART为例讲讲常见的互斥、队列这两种方法。

1

互斥访问方法互斥量:是一个可以处于两态之一的变量:解锁和加锁。 原理:创建一个互斥量,任务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); } }} 信号量与互斥量区别:信号量:多个任务同步使用某个资源; 一个任务完成某个动作后通过信号告诉别的任务,别的任务才可以执行某些动作; 互斥量:多任务互斥使用某个资源; 一个任务占用某个资源,那么别的任务就无法访问,直到该任务离开,其他任务才可以访问该资源;

2

队列操作方法队列操作方法就是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); } }}

以上两种方法比较常用,也比较简单,希望对大家有帮助。

提示:代码仅供学习理解原理,在项目中需要结合实际情况增、删、修改代码。

原文标题:RTOS多任务访问同一个UART的方法

文章出处:【微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编程
    +关注

    关注

    88

    文章

    3438

    浏览量

    92317
  • RTOS
    +关注

    关注

    20

    文章

    773

    浏览量

    118772

原文标题:RTOS多任务访问同一个UART的方法

文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    采用同一个触发源和双重采样有什么区别?有什么好处呢?

    采用同一个触发源和双重采样有什么区别?有什么好处?假如两通道采样,方式是采用双重采样,宁外
    发表于 04-10 06:29

    同一个芯片不同封装的原因

    同一个芯片的不同封装可能是为了满足不同的应用需求和设计要求。不同的封装可以影响芯片的功耗、散热性能、引脚数量和布局等方面。
    的头像 发表于 12-18 18:15 549次阅读

    ZMC运动控制器多任务编程

    广泛应用,有效提升生产和运行效率。 ZMC运动控制器多任务概念:任务是执行 I/O 刷新和用户程序等系列指令处理的功能,
    发表于 11-07 09:52

    RTOS相比裸机有什么优点?RTOS相比裸机更方便吗?

    理实时任务。在本文中,我们将探讨使用RTOS而不是裸金属系统的优点,以及它是否更方便。 RTOS相对于裸机系统的优势 1.多任务处理 RTOS
    的头像 发表于 10-29 16:33 989次阅读

    STM32 RTOS介绍

    R(real) T(time) OS 实时多任务操作系统、RTOS种操作系统,属于嵌入式操作系统,RTOS种类很多:有商业的、DIY和开源的。
    发表于 09-07 08:08

    如何通过多任务访问Keil RTX程序EEPROM

    应用: 本代码演示如何通过多任务访问 Keil RTX 程序 EEPROM 。 BSP 版本: NUC230/240系列 BSP CMSIS V3.01.001 硬件:努埃杜-EVB-NUC240
    发表于 09-01 07:42

    如何通过多任务访问Keil RTX程序EEPROM

    应用: 本代码演示如何通过多任务访问 Keil RTX 程序 EEPROM 。 BSP 版本: NUC230/240系列 BSP CMSIS V3.01.001 硬件:努埃杜-EVB-NUC240
    发表于 08-23 06:04

    创建RTX内核系统来完成CAN任务

    同时必须处理许多任务时, 我们可以使用 RTOS (实时操作系统) 来帮助我们管理这些任务。 在 RTOS 系统中, CPU 处理时间被分为若干时间段。 每个时段处理不同的
    发表于 08-22 07:19

    51单片机多任务执行例子

    51单片机多任务同时执行。RTX51 tiny是一种实时操作系统(RTOS),可以用它来建立多个任务(函数)同时执行的应用(从宏观上看是同时执行的,但从微观上看,还是独立运行的)。嵌入式应用系统经常
    发表于 08-04 15:59 0次下载

    51单片机多任务同时执行

    51单片机多任务同时执行。RTX51 Tiny是种实时操作系统(RTOS),可以用它来建立多个任务(函数)同时执行的应用(从宏观上看是同时执行的,但从微观上看,还是独立运行的)。嵌入
    发表于 08-03 16:58

    Arduino上的多任务处理

    电子发烧友网站提供《Arduino上的多任务处理.zip》资料免费下载
    发表于 06-14 11:05 0次下载
    Arduino上的<b class='flag-5'>多任务</b>处理

    两个网络IP地址是否在同一个段中的判断方法

    我们知道IP地址是由“网络号+子网号+主机号”组成,判断两个IP地址是否在同一个网段主要看“网络号”,如果网络号一样,那么他们就在同一个网段,否则就不在一个网段。
    的头像 发表于 06-02 14:31 1.1w次阅读
    两个网络IP地址是否在<b class='flag-5'>同一个</b>段中的判断方法

    是否有人同时使用所有三mcus的Rx-&gt;Tx 和 Tx-&gt;Rx成功地将3esp连接到同一个uart (uart0)?

    我想知道是否有人同时使用所有三 mcus 的 Rx->Tx 和 Tx->Rx 成功地将 3 esp 连接到同一个 uart (ua
    发表于 06-02 08:39

    嵌入式RTOS任务栈 和 系统栈

    简介明了带你了解嵌入式RTOS任务栈 和 系统栈
    的头像 发表于 05-16 09:57 2035次阅读
    嵌入式<b class='flag-5'>RTOS</b>的 <b class='flag-5'>任务</b>栈 和 系统栈

    LittleFS如何在不关闭并重新打开同一个文件的情况下连续读取同一个文件的值?

    - pixel information for LED Array } f.close(); f.open() 函数似乎需要些时间。我的问题是,如何在不关闭并重新打开同一个文件的情况下连续读取同一个
    发表于 05-16 07:46