在RTOS多任务编程的时候,同一个硬件(比如UART、I2C等)被多个任务访问的情况比较多,如果不合理处理,就会导致“混乱”的局面。 处理“混乱”局面的方法比较多,下面基于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); } } }以上两种方法比较常用,也比较简单,希望对大家有帮助。
提示:代码仅供学习理解原理,在项目中需要结合实际情况增、删、修改代码。
-
数据
+关注
关注
8文章
7193浏览量
89818 -
硬件
+关注
关注
11文章
3408浏览量
66534 -
RTOS
+关注
关注
22文章
821浏览量
119945
原文标题:多线程通过互斥和队列访问串口
文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
韦东山freeRTOS系列教程之互斥量(mutex)(7)
![韦东山freeRTOS系列教程之<b class='flag-5'>互斥</b>量(mutex)(7)](https://file.elecfans.com//web2/M00/21/AA/poYBAGGkmGeAboBTAAB9hsywI-k972.png)
详细谈谈Linux中的多线程同步和互斥机制
【MiCOKit试用体验】庆科MiCO系统篇(3)MiCO RTOS互斥锁
第15章 互斥信号量
信号量和互斥锁的区别
![信号量和<b class='flag-5'>互斥</b>锁的区别](https://file1.elecfans.com//web2/M00/A6/E3/wKgZomUMQRSANmWKAAAH5pLTmRE487.jpg)
详解互斥信号量的概念和运行
![详解<b class='flag-5'>互斥</b>信号量的概念和运行](https://file.elecfans.com/web1/M00/CB/DB/pIYBAF-RAqSAfdobAAAPVOLM-ek330.jpg)
如何让RTOS多任务访问同一个UART?
Free RTOS的互斥信号量
![Free <b class='flag-5'>RTOS</b>的<b class='flag-5'>互斥</b>信号量](https://file.elecfans.com/web2/M00/8F/D1/poYBAGPl88aAQierAADP34qVgyk228.png)
评论