良许Linux教程网 干货合集 RTOS多任务访问同一个UART的方法

RTOS多任务访问同一个UART的方法

在RTOS多任务编程中,经常会出现多个任务同时访问同一个硬件设备(如UART、I2C等)的情况,如果不妥善处理,就会出现混乱的局面。为了避免这种情况的发生,采用互斥和队列这两种常见的方法来处理这个问题。

在FreeRTOS中,采用互斥量来实现互斥访问的方法。互斥量是一种可以处于两个状态之一的变量:解锁和加锁。任务A在需要访问资源(比如使用UART发送数据)的时候,会请求占用该资源,并成功获取到互斥量。此时,其他任务,包括任务B,都不能访问该资源。当任务A完成操作,释放互斥量时,其他任务就可以抢占该资源了。通过采用互斥量这种方法,可以保证硬件资源被任务独占,避免了多个任务同时操作同一硬件设备而导致的混乱情况。

创建互斥量

任务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);
    }
  }
}

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

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部