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

本文介绍了在RTOS环境下,如何通过互斥量和队列机制来避免多任务同时访问UART或I2C等硬件时的资源混乱。互斥量确保任务按顺序占用资源,而队列则采用先进先出原则,实现数据发送的同步管理。
摘要由CSDN通过智能技术生成

在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);    }  }}

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

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

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值