我是靠谱客的博主 坦率冥王星,最近开发中收集的这篇文章主要介绍RTOS多任务访问同一个UART的方法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

作者 | strongerHuang

微信公众号 | 嵌入式专栏

在RTOS多任务编程的时候,同一个硬件(比如UART、I2C等)被多个任务访问的情况比较多,如果不合理处理,就会导致“混乱”的局面。

处理“混乱”局面的方法比较多,下面基于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);
    }
  }
}

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

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

------------ END ------------

后台回复『STM32』『FreeRTOS』『嵌入式软件设计与开发』阅读更多相关文章。

欢迎关注我的公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。

欢迎关注我的视频号:

点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。

最后

以上就是坦率冥王星为你收集整理的RTOS多任务访问同一个UART的方法的全部内容,希望文章能够帮你解决RTOS多任务访问同一个UART的方法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部