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

    文章

    1304

    浏览量

    106117
  • 多线程
    +关注

    关注

    0

    文章

    279

    浏览量

    20915
  • RTOS
    +关注

    关注

    25

    文章

    862

    浏览量

    122611
  • 串口打印
    +关注

    关注

    0

    文章

    11

    浏览量

    3312
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    多线程的系统

    多线程系统的事件响应也是在中断中完成的,但事件的处理是在线程中完成的。在多线程系统中,线程跟中断样,也具有优先级,优先级高的
    发表于 12-08 07:55

    RTOS Crash 问题全维度分析与解决指南

    指针、数组越界) 如果能补充具体RTOS型号(FreeRTOS V10.4、RT-Thread 4.1)、硬件架构(ARM Cortex-M3/M4/M7)、Crash时的异常寄存器值或具体现象,可进
    发表于 12-08 03:56

    利用开源uart2axi4实现串口访问axi总线

    microblaze和jtag-to-axi(jtag2axi)虽然也提供了访问axi总线的能力,但是依赖于xilinx平台。而uart-to-axi(uart2axi4)桥接器并不依赖任何平台
    的头像 发表于 12-02 10:05 1578次阅读
    利用开源<b class='flag-5'>uart</b>2axi4实现串口<b class='flag-5'>访问</b>axi总线

    Linux多线程对比单线程的优势

    :「资源利用率」:通过多线程,可以更有效地利用CPU资源,特别是多核CPU。「并行处理」:线程允许同时执行多个任务,提高程序的执行效率。「简化设计」:使用线程可以简化程序设计,因为线程
    发表于 12-01 06:11

    rt-thread studio 如何进行多线程编译?

    ,使用的是5800h+32g内存+sn550 ssd,开启16线程编译时cpu的占用率也只能到30%,编译完整个工程需要3分钟 感觉多线程编译设置没有生效,有办法提高编译速度吗 rtthread studio版本是 2.2.9
    发表于 10-11 09:16

    【RA4E2开发板评测】LED1及LED2轮流点亮并同时亮8秒,体验FreeRTOS多线程

    我们要多线程操作时,就需要用到RTOS(Real-Time Operating System)。FreeRTOS实时操作系统开发里面使用到vTaskDelay函数,它是对CPU的时分复用,系统将这个
    发表于 08-24 17:24

    从底层解读labview的TDMS高级异步写入的工作原理

    : 不是同时直接写文件: 异步写入并不意味着多个线程可以在同一时刻直接对同一个 TDMS 文件的同一部分进行物理写入操作。磁盘操作本身在底层通常需要序列化
    发表于 08-14 17:05

    多线程的安全注意事项

    多线程安全是指多个线程同时访问或修改共享资源时,能够保证程序的正确性和可靠性。 开发者选择TaskPool或Worker进行多线程开发时,在TaskPool和Worker的工作
    发表于 06-20 07:49

    工控体机多线程任务调度优化:聚徽分享破解工业复杂流程高效协同密码

    在当今工业 4.0 的浪潮下,工业生产正朝着高度自动化、智能化的方向大步迈进。生产流程日益复杂,众多任务需要同时、高效地协同执行,这对工业控制系统的核心 —— 工控体机提出了前所未有的挑战。多线程
    的头像 发表于 05-28 14:06 486次阅读

    RTOS如何在FX3中工作?

    大家好, 我正在使用 FX3 进行个项目。 我想知道 RTOS 调度是如何工作的。 我知道调用“CyU3PKernelEntry();”后 RTOS 就会开始工作。 如果我只注册
    发表于 05-06 13:20

    种实时多线程VSLAM框架vS-Graphs介绍

    针对现有VSLAM系统语义表达不足、地图可解释性差的问题,本文提出vS-Graphs,种实时多线程VSLAM框架。该方案显著提升了重建地图的语义丰富度、可解释性及定位精度。实验表明
    的头像 发表于 04-19 14:07 730次阅读
    <b class='flag-5'>一</b>种实时<b class='flag-5'>多线程</b>VSLAM框架vS-Graphs介绍

    请问如何在Python中实现多线程与多进程的协作?

    大家好!我最近在开发个Python项目时,需要同时处理多个任务,且每个任务需要不同的计算资源。我想通过多线程和多进程的组合来实现并发,但遇到了些问题。 具体来说,我有两个任务,
    发表于 03-11 06:57

    请问rt-thread studio如何进行多线程编译?

    ,使用的是5800h+32g内存+sn550 ssd,开启16线程编译时cpu的占用率也只能到30%,编译完整个工程需要3分钟 感觉多线程编译设置没有生效,有办法提高编译速度吗
    发表于 02-19 08:30

    程序中断的100种写法

    在编程中,实现程序中断的方式取决于所使用的编程语言、硬件平台以及具体的应用需求。虽然没有100种独立的中断实现方式,但可以通过不同的方法和技术来实现中断。以下是些常见的中断实现方式: 1.
    发表于 01-28 08:25

    EE-303:将VisualDSP线程安全库与第三方RTOS配合使用

    电子发烧友网站提供《EE-303:将VisualDSP线程安全库与第三方RTOS配合使用.pdf》资料免费下载
    发表于 01-07 14:09 0次下载
    EE-303:将VisualDSP<b class='flag-5'>线程</b>安全库与第三方<b class='flag-5'>RTOS</b>配合使用