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

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

3天内不再提示

如何让RTOS多任务访问同一个UART?

strongerHuang 来源:strongerHuang 作者:strongerHuang 2021-03-12 17:18 次阅读

RTOS多任务编程的时候,同一个硬件(比如UARTI2C等)被多个任务访问的情况比较多,如果不合理处理,就会导致“混乱”的局面。 处理“混乱”局面的方法比较多,下面基于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); } }}

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

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

原文标题:RTOS多任务访问同一个UART的方法

文章出处:【微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

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

    关注

    88

    文章

    3591

    浏览量

    93588
  • RTOS
    +关注

    关注

    21

    文章

    809

    浏览量

    119417

原文标题:RTOS多任务访问同一个UART的方法

文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    LV和组态王上位机软件在同一电脑通过网线读写同一个PLC失败

    问题:LV和组态王上位机软件在同一电脑通过同一个网卡、同一根网线和IP读写同一个PLC失败 PLC型号:西门子S7-200 smart 现状:非标设备自带组态王上位机软件,因整条产线有
    发表于 10-18 08:26

    大家好,请教恒流源芯片并联使用接同一个LED的问题

    大家好,请教个问题,如果三路同款恒流源芯片都设定为1A的输出电流,三路并联,然后接同一个LED,那流过LED的实际电流是多少呢每路恒流源芯片的实际输出电流是多少呢假设是理想情况下。 如果两路同款
    发表于 10-12 09:39

    运放的带宽与运放的单位增益带宽是同一个概念吗?

    运放的带宽与运放的单位增益带宽是同一个概念吗?
    发表于 09-04 06:18

    freertos和rtos区别是什么

    RTOS 的主要特点是实时性、多任务处理、资源管理、中断处理等。 FreeRTOS 是开源的实时操作系统,由英
    的头像 发表于 09-02 14:18 953次阅读

    简单认识RTOS实时操作系统

    RTOS(Real Time Operating System,实时操作系统)是种专门设计用于在严格时间限制内处理任务的操作系统。它以其高实时性、多任务处理能力和资源管理能力在工业自
    的头像 发表于 08-20 11:20 2355次阅读

    ESP32-C3 BLE client如何连接同一个server的多个service?

    最近在做一个项目需要ESP32-C3作为BLE client 连接同一个server的两service。 网上的例程都是连接多个server的各
    发表于 06-13 08:29

    同一个Thread对Socket的切换不成功,为什么?

    你好我想问下在外部调用5bit的接口时,怎么我下面同一个Thread对Socket的切换不成功? 我是看了其他帖子的回复进行相关配置的,请问是否配置错误? 下面是时序图: 下面是参考的帖子: 如果可以请详细描述下错误的点
    发表于 05-31 07:51

    STM32F103能在PWM周期内对同一个AD通道采样两次吗?

    求助各位大神: 小弟在此感谢:STM32F103,,希望能在PWM周期内对同一个AD通道采样两次?或者多次,可以控制采样起点,连续采样不合适。有什么办法吗?类似于在周期下溢点,上溢点触发采样,可以连续触发多次。或者中间比较值
    发表于 04-17 07:25

    采用同一个触发源和双重采样有什么区别?有什么好处呢?

    采用同一个触发源和双重采样有什么区别?有什么好处?假如两通道采样,方式是采用双重采样,宁外
    发表于 04-10 06:29

    进程内多次使用open打开同一个文件,可以吗?

    进程内多次使用 open 打开同一个文件时,每次都会得到新的文件描述符(file descriptor)。
    的头像 发表于 02-27 13:54 1169次阅读

    苹果手机用同一个id怎么取消同步

    苹果手机用同一个id怎么取消同步  取消苹果手机间的同步功能可以通过以下步骤完成。请注意,这些步骤适用于iOS 11及更高版本。 步骤1:打开“设置”应用程序 首先,打开您的iPhone或iPad
    的头像 发表于 02-19 10:19 2982次阅读

    双应用的bootloadable程序,EEPROM怎样指向同一个地址?

    bootloadable程序中的EEPROM指向同一个地址,这样boot升级后,新的程序可以调用以前保存的数据,附件是我的bootloader和bootloadable工程
    发表于 02-06 08:28

    同一个芯片不同封装的原因

    同一个芯片的不同封装可能是为了满足不同的应用需求和设计要求。不同的封装可以影响芯片的功耗、散热性能、引脚数量和布局等方面。
    的头像 发表于 12-18 18:15 1091次阅读

    如何设置两路由器使用同一个Wi-Fi网络?

    如何设置两路由器使用同一个Wi-Fi网络 随着无线网络的普及和需求量的增加,很多家庭和办公室都会购买多个路由器来扩展无线网络覆盖范围。然而,许多人可能不知道如何正确设置两路由器以使它们使用
    的头像 发表于 12-11 10:50 1.2w次阅读

    RTOS内功修炼记()— 任务到底应该怎么写?

    本篇文章讲述了任务的三大元素:任务控制块、任务栈、任务入口函数,并讲述了编写RTOS任务入口函数
    的头像 发表于 12-01 16:36 710次阅读
    <b class='flag-5'>RTOS</b>内功修炼记(<b class='flag-5'>一</b>)— <b class='flag-5'>任务</b>到底应该怎么写?