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

    文章

    6513

    浏览量

    87609
  • 硬件
    +关注

    关注

    11

    文章

    2923

    浏览量

    64823
  • RTOS
    +关注

    关注

    20

    文章

    776

    浏览量

    118800

原文标题:多线程通过互斥和队列访问串口

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

收藏 人收藏

    评论

    相关推荐

    详细谈谈Linux中的多线程同步和互斥机制

    互斥:多线程中互斥是指多个线程访问同一资源时同时只允许一个线程对其进行访问,具有唯一性和排它性。但互斥无法限制
    的头像 发表于 03-20 09:09 1344次阅读

    关于FreeRTOS互斥量的用法求解

    会引起锁死,比如当同一个任务多次抢占时, 最后还是得换到互斥量, 基于串口中断发送模式, 希望使用互斥量来访问串口的话 , 该如何释放发送完
    发表于 04-24 08:03

    【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.2w次阅读
    信号量和<b class='flag-5'>互斥</b>锁的区别

    Linux 多线程互斥互斥

    的同步问题, 线程同步的思路: 让多个线程依次访问共享资源,而不是并行互斥VS同步互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯
    发表于 04-02 14:47 201次阅读

    RTOS多线程访问同一硬件(如UART)的方法

    RTOS多线程(任务)访问同一硬件(如UART)的方法
    的头像 发表于 03-12 11:28 4999次阅读

    详解互斥信号量的概念和运行

    二值信号量实现资源独享,即互斥访问的例子,让大家有一个形象的认识,进而引出要讲解的互斥信号量。 运行条件: 让两个任务 Task1 和 Task2 都运行串口打印函数 printf,这
    的头像 发表于 10-22 11:57 1w次阅读
    详解<b class='flag-5'>互斥</b>信号量的概念和运行

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

    RTOS多任务编程的时候,同一个硬件(比如UART、I2C等)被多个任务访问的情况比较多,如果不合理处理,就会导致“混乱”的局面。 处理“混乱”局面的方法比较多,下面基于FreeRTOS
    的头像 发表于 03-12 17:18 1850次阅读

    RTOS开发中的Mutex互斥

    在基于RTOS开发项目时,通常都会遇到互斥的情况,比如:几个任务都要使用一个UART串口进行发送数据。
    的头像 发表于 04-07 10:32 2114次阅读

    什么是Mutex互斥

    在基于RTOS开发项目时,通常都会遇到互斥的情况,比如:几个任务都要使用一个UART串口进行发送数据。
    的头像 发表于 08-22 09:03 1042次阅读

    Free RTOS互斥信号量

    二进制信号量和互斥量非常相似,但确实有一些细微的区别。互斥体包含优先级继承机制,而二进制信号量没有。这使得二进制信号量成为实现同步(任务之间或任务与中断之间)的更好选择,互斥体成为实现简单互斥
    的头像 发表于 02-10 15:36 787次阅读
    Free <b class='flag-5'>RTOS</b>的<b class='flag-5'>互斥</b>信号量

    使用Linux互斥体实现互斥点灯

    互斥访问是指一次只有一个线程可以访问共享资源,不能递归申请互斥体。使用互斥体时要注意如下几点。
    的头像 发表于 04-13 15:13 669次阅读
    使用Linux<b class='flag-5'>互斥</b>体实现<b class='flag-5'>互斥</b>点灯

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

    1、互斥互斥锁(mutex),在访问共享资源之前对互斥锁进行上锁,在访问完成后释放互斥锁(解
    的头像 发表于 07-21 11:13 569次阅读

    自旋锁和互斥锁的区别有哪些

    自旋锁 自旋锁与互斥锁很相似,在访问共享资源之前对自旋锁进行上锁,在访问完成后释放自旋锁(解锁);事实上,从实现方式上来说,互斥锁是基于自旋锁来实现的,所以自旋锁相较于
    的头像 发表于 07-21 11:19 7709次阅读