0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RTOS多线程访问同一硬件(如UART)的方法

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 2020-03-12 11:28 次阅读

读者*石 三*问:博主可以介绍下在RTOS下多个任务访问同一硬件的方法吗?比如说,多个任务都要用到串口打印信息

我的回答是:使用互斥量、队列两种方式都能解决访问冲突的问题。

多线程访问同一串行硬件在许多系统中经常使用,如多个线程都使用UART收发数据、多个线程使用读写SPI_FLASH、I2C_E2PROM,CAN总线收发数据等······

如果每个线程都同时抢占同一串口去读写操作,那么很容易出现问题。为了解决其中的冲突问题,就需要使用一定的办法。下面以UART为例,基于FreeRTOS讲述一下基本的互斥量和队列方式的解决方法。

Ⅰ互斥访问方法

互斥量:是一个可以处于两态之一的变量:解锁和加锁。

原理:创建一个互斥量,线程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); } }}

以上两种方法是常用的,希望大家都掌握一下。上述仅让大家掌握原理,代码不宜直接复制粘贴使用。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • uart
    +关注

    关注

    22

    文章

    1156

    浏览量

    99872
  • 多线程
    +关注

    关注

    0

    文章

    271

    浏览量

    19718
  • RTOS
    +关注

    关注

    20

    文章

    773

    浏览量

    118773
  • 串口打印
    +关注

    关注

    0

    文章

    10

    浏览量

    3045
收藏 人收藏

    评论

    相关推荐

    java实现多线程的几种方式

    8中的CompletableFuture 一、继承Thread类 继承Thread类是实现多线程的最基本方式,只需创建一个类并继承Thread类,重写run()方法即可。 ``
    的头像 发表于 03-14 16:55 167次阅读

    redis多线程还能保证线程安全吗

    是单线程的,多个客户端请求会按序执行,每个请求使用一个线程完成,这样可以避免多线程之间的竞争条件和锁等带来的开销。但是,由于Redis是存储内存中的数据的,当多个客户端同时对同一个数据
    的头像 发表于 12-05 10:28 637次阅读

    mfc多线程编程实例

    (图形用户界面)应用程序的开发。在这篇文章中,我们将重点介绍MFC中的多线程编程。 多线程编程在软件开发中非常重要,它可以实现程序的并发执行,提高程序的效率和响应速度。MFC提供了丰富的多线程支持,可以轻松地实现
    的头像 发表于 12-01 14:29 497次阅读

    多线程如何保证数据的同步

    多线程编程是一种并发编程的方法,意味着程序中同时运行多个线程,每个线程可独立执行不同的任务,共享同一份数据。由于
    的头像 发表于 11-17 14:22 338次阅读

    多线程并发查询oracle数据库

    多线程并发查询Oracle数据库是指在同一时间内有多个线程同时执行数据库查询操作。这种并发查询的方式可以提高系统的吞吐量和响应速度,提高数据库的效率和性能。本文将详细介绍多线程并发查询
    的头像 发表于 11-17 14:22 1512次阅读

    多线程同步的几种方法

    多线程同步是指在多个线程并发执行的情况下,为了保证线程执行的正确性和一致性,需要采用特定的方法来协调线程之间的执行顺序和共享资源的
    的头像 发表于 11-17 14:16 496次阅读

    多线程idm下载软件

    多线程idm下载软件
    发表于 10-23 09:23 0次下载

    个有许多线程的进程,如何才能改变其中线程的工作目录?

    个有许多线程的进程,我们如何才能改变其中线程的工作目录,而不影响其他?
    发表于 10-17 09:01

    Java多线程的用法

    本文将介绍一下Java多线程的用法。 基础介绍 什么是多线程 指的是在一个进程中同时运行多个线程,每个线程都可以独立执行不同的任务或操作。 与单线程
    的头像 发表于 09-30 17:07 608次阅读

    Rust的多线程编程概念和使用方法

    和字段、常见用法以及多线程的一些实践经验。由浅入深带你零基础玩转Rust的多线程编程。 线程的基本概念和使用方法 Thread是Rust中并发编程的一种基本方式。Rust中的Threa
    的头像 发表于 09-20 11:15 492次阅读

    labview AMC多线程

    labview_AMC多线程
    发表于 08-21 10:31 22次下载

    【感芯科技MC3172开发板体验】多线程串口功能测试

    。 可以看出对应的是GPIOC口。软件初始化端口时按照文档 《并行多线程处理器MC3172开发极简指南(2).pdf》中uart函数进行初始化 代码介绍 初始化完毕后,硬件链接,网上资料版本和测评版本不
    发表于 06-10 14:28

    基于QT自制上位机(多线程

    前言:应用程序在某些情况下需要处理比较复杂的逻辑,例如常规的图传上位机,如果在传输图片跑到较高码流或对图像执行一些处理任务是,引用多线程可以明显 改善响应度和反馈速度。 QT多线程使用的注意事项
    发表于 05-09 11:47 1次下载
    基于QT自制上位机(<b class='flag-5'>多线程</b>)

    网络工程师学Python-多线程技术简述

    Python多线程是一种并发编程的方式,通过使用多个线程同一时间内执行多个任务
    的头像 发表于 04-28 09:49 374次阅读
    网络工程师学Python-<b class='flag-5'>多线程</b>技术简述

    Linux中多线程编程的知识点

    Hello、Hello大家好,我是木荣,今天我们继续来聊一聊Linux中多线程编程中的重要知识点,详细谈谈多线程中同步和互斥机制。
    发表于 04-26 17:27 478次阅读
    Linux中<b class='flag-5'>多线程</b>编程的知识点