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

    文章

    1483

    浏览量

    74511
  • uart
    +关注

    关注

    22

    文章

    1159

    浏览量

    99959
  • RTOS
    +关注

    关注

    20

    文章

    776

    浏览量

    118795

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

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

收藏 人收藏

    评论

    相关推荐

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

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

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

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

    将RTX迁移到CMSIS-RTOS

    CMSIS-RTOS API是基于Cortex-M处理器的设备的通用RTOS接口。 CMSIS-RTOS为需要RTOS功能的软件组件提供了标
    发表于 09-04 06:37

    RTOS中的中断是怎么处理的?

    RTOS中的中断是怎么处理
    发表于 09-22 06:06

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

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

    常见CPU故障处理方法

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

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

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

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

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

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

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

    日光灯常见故障及处理方法

    日光灯常见故障和处理方法有以下几种:
    发表于 05-03 15:44 1.4w次阅读

    CC2640R2F开发之:UART串口收发&TI-RTOS任务创建(二)

    对于蓝牙的数据传输来说UART串口起到至关重要的作用,本篇将介绍CC2640R2F的UART串口使用方法,结合TI-RTOS操作系统与RingBuf机制完成
    发表于 11-30 10:21 10次下载
    CC2640R2F开发之:UART<b class='flag-5'>串口</b>收发&TI-<b class='flag-5'>RTOS</b>任务创建(二)

    如何处理RTOS错误和超时

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

    STM32移植UCOS RTOS的步骤方法

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

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

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

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

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