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

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

3天内不再提示

RTOS共享串口常见处理方法

Dp1040 来源:strongerHuang 2023-07-29 10:02 次阅读
RTOS多任务编程的时候,同一个串口(硬件)被多个任务访问的情况比较多,如果不合理处理,就会导致“混乱的局面。 处理混乱局面的方法比较多,下面基于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);
    }
  }
}

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


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

    关注

    14

    文章

    1540

    浏览量

    76016
  • uart
    +关注

    关注

    22

    文章

    1218

    浏览量

    101091
  • RTOS
    +关注

    关注

    21

    文章

    809

    浏览量

    119348

原文标题:RTOS共享串口常见处理方法

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

收藏 人收藏

    评论

    相关推荐

    典型的支持多核处理器的RTOS功能解析

    对多核处理器的支持,是一种常见的对RTOS的扩展,不需要对现行的RTOS做太大修改,只需要增加一个相对独立的扩展库,就可以实现对于多核处理
    发表于 06-29 08:30

    基于RTOS的STM32串口通信有哪几种方法

    串行端口的通信方式是指什么?基于RTOS的STM32串口通信有哪几种方法呢?
    发表于 12-07 08:03

    电动自行车常见的问题及处理方法

    电动自行车常见的问题及处理方法   1. 电池充不上电或充不足电。
    发表于 11-11 14:03 2184次阅读

    常见CPU故障处理方法

    常见CPU故障处理方法 ●频率有时自动降低开机后本来166MHz的CPU
    发表于 01-12 10:21 834次阅读

    电动机常见故障分析及处理方法

    电动机常见故障分析及处理方法
    发表于 02-07 18:05 29次下载

    变频器常见故障及处理方法

    变频器常见故障及处理方法
    发表于 02-07 18:25 25次下载

    处理器SDK及RTOS操作系统的作用介绍

    处理器 SDK RTOS
    的头像 发表于 08-10 01:38 5036次阅读

    Linux常见故障的紧急处理方法分享

    本文主要详细介绍了Linux常见故障的紧急处理方法,具体的跟随小编一起来了解一下。
    的头像 发表于 10-05 08:53 3191次阅读

    KGPS中频电源常见故障与处理方法

    KGPS中频电源常见故障与处理方法(深圳市核达中远通电源技术股份有限公司电话)-KGPS中频电源常见故障与处理
    发表于 09-24 09:29 7次下载
    KGPS中频电源<b class='flag-5'>常见</b>故障与<b class='flag-5'>处理</b><b class='flag-5'>方法</b>

    如何处理RTOS错误和超时

      在典型系统中,许多路径流经 RTOS,因此它处于检测和处理错误的良好位置。一般来说,函数的返回值,尤其是 RTOS 服务,不应该在没有检查的情况下使用。
    的头像 发表于 06-29 09:46 3067次阅读
    如何<b class='flag-5'>处理</b><b class='flag-5'>RTOS</b>错误和超时

    STM32移植UCOS RTOS的步骤方法

    STM32移植UCOS RTOS的步骤方法,一步步的,很详细
    发表于 09-23 17:22 8次下载

    串口通信是什么,常见的问题以及解决方法

    (Universal Synchronous/Asynchronous Receiver/Transmitter)——通用同/异步串行接收/发送器。其中最常见串口通信的时序如下图:
    的头像 发表于 11-18 10:19 3192次阅读

    松下贴片机NPM常见报警处理方法

    松下贴片机NPM常见报警处理方法
    的头像 发表于 06-28 09:49 1.5w次阅读

    串口通信常见的错误和故障排除方法

    在进行串口通信时,确实可能会遇到一些常见的错误和问题。
    的头像 发表于 03-02 14:19 3777次阅读

    RTOS的特性和类型

    实时操作系统(RTOS)是一种可运行实时计算应用程序的软件平台,用于处理具有明确时间约束的事件和数据。与通用操作系统(GPOS)不同,RTOS必须在有限的硬件资源上调度应用程序之间的处理
    的头像 发表于 08-20 11:29 438次阅读