首页 > 其他分享 >FreeRTOS--邮箱

FreeRTOS--邮箱

时间:2023-12-02 18:44:35浏览次数:32  
标签:FreeRTOS -- pxQueue 队列 API interrupt 邮箱 xQueue

示例源码基于FreeRTOS V9.0.0

邮箱

1. 概述

一种特殊的队列,队列深度只有1,写数据的时候是覆盖写,读数据的时候,读完不会把数据从队列删除;

写数据的时候永远是成功的,读数据的时候仅第一次队列无数据时会阻塞或失败,当队列有数据后,读都会是成功的;

2. 接口API

// 写队列
#define xQueueOverwrite( xQueue, pvItemToQueue ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), 0, queueOVERWRITE )
#define xQueueOverwriteFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueOVERWRITE )

// 读队列
#define xQueuePeek( xQueue, pvBuffer, xTicksToWait ) xQueueGenericReceive( ( xQueue ), ( pvBuffer ), ( xTicksToWait ), pdTRUE )
BaseType_t xQueuePeekFromISR( QueueHandle_t xQueue, void * const pvBuffer );
  • 写队列时通过宏xQueueOverwrite和xQueueOverwriteFromISR调用,其中FromISR是中断服务程序接口,仅在中断服务内使用。写队列的实际接口同普通队列操作,区别在函数参数,xTicksToWait=0,因为写永远成功,不需要阻塞;xCopyPosition=queueOVERWRITE,覆盖写方式;

  • 读队列时通过宏xQueuePeek调用,实际接口同普通队列读接口,区别在函数参数,xJustPeek=pdTRUE,表示仅读,读后不删除。中断服务程序使用的接口是xQueuePeekFromISR;

  • 创建队列同普通队列,需要注意队列深度只有1;

普通队列的相关接口API见 队列

2.1 xQueuePeekFromISR源码

BaseType_t xQueuePeekFromISR( QueueHandle_t xQueue,  void * const pvBuffer )
{
BaseType_t xReturn;
UBaseType_t uxSavedInterruptStatus;
int8_t *pcOriginalReadPosition;
Queue_t * const pxQueue = ( Queue_t * ) xQueue;

    configASSERT( pxQueue );
    configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) );
    configASSERT( pxQueue->uxItemSize != 0 ); /* Can't peek a semaphore. */

    /* RTOS ports that support interrupt nesting have the concept of a maximum
    system call (or maximum API call) interrupt priority.  Interrupts that are
    above the maximum system call priority are kept permanently enabled, even
    when the RTOS kernel is in a critical section, but cannot make any calls to
    FreeRTOS API functions.  If configASSERT() is defined in FreeRTOSConfig.h
    then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion
    failure if a FreeRTOS API function is called from an interrupt that has been
    assigned a priority above the configured maximum system call priority.
    Only FreeRTOS functions that end in FromISR can be called from interrupts
    that have been assigned a priority at or (logically) below the maximum
    system call	interrupt priority.  FreeRTOS maintains a separate interrupt
    safe API to ensure interrupt entry is as fast and as simple as possible.
    More information (albeit Cortex-M specific) is provided on the following
    link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */
    portASSERT_IF_INTERRUPT_PRIORITY_INVALID();

    uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();
    {
        /* Cannot block in an ISR, so check there is data available. */
        if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 )
        {
            traceQUEUE_PEEK_FROM_ISR( pxQueue );

            /* Remember the read position so it can be reset as nothing is
            actually being removed from the queue. */
            pcOriginalReadPosition = pxQueue->u.pcReadFrom;
            prvCopyDataFromQueue( pxQueue, pvBuffer );
            pxQueue->u.pcReadFrom = pcOriginalReadPosition;

            xReturn = pdPASS;
        }
        else
        {
            xReturn = pdFAIL;
            traceQUEUE_PEEK_FROM_ISR_FAILED( pxQueue );
        }
    }
    portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus );

    return xReturn;
}

2.2 xQueuePeekFromISR分析

img

标签:FreeRTOS,--,pxQueue,队列,API,interrupt,邮箱,xQueue
From: https://www.cnblogs.com/hjx168/p/17872013.html

相关文章

  • FreeRTOS--队列集
    示例源码基于FreeRTOSV9.0.0队列集1.概述队列集的本质也是队列,只不过里面存放的是“队列句柄”。当任务需要及时读取多个队列时,可以使用队列集。它类似于posix的多路复用思想。可以将想要监听消息的队列放入队列集中,当其中有队列有数据达到时,队列集的接口会返回可读的队列句......
  • [Codeforces] CF1675D Vertical Paths
    题目描述给定一棵由\(n\)个顶点组成的有根树。顶点由\(1\)到\(n\)编号。任何顶点都可以是树的根。请在树上找出这样一组路径:每个顶点恰好属于一条路径,每条路径可以包含一个或多个顶点;在每条路径中,每个节点的下一个节点是当前节点的子节点(即路径总是向下——从父节点......
  • 关于 SAP 标准 OData 服务 /sap/bc/adt/ato/settings 的作用
    SAPODataService/sap/bc/adt/ato/settings介绍简介/sap/bc/adt/ato/settings是SAP中一个标准的OData服务,用于处理与ABAPDevelopmentTools(ADT)相关的设置。ADT提供了开发、维护和管理ABAP程序的工具,而这个OData服务允许通过HTTP协议访问ADT设置的相关信......
  • SAP ABAP 里如何高效找到修改某个数据库表字段的 ABAP 程序的三种思路介绍试读版
    我的知识星球里,有朋友提问:公司的SAP中,总部开发了一个功能去更新采购订单行上的收货地址字段EKPO-ADRN2,我尝试着去Debug,但找不到最终是哪段程序更新了这一个字段。SAT也用了,也发现不了。不过我对SAT也不熟。有什么思路可以快速Debug找到那段更新程序不?其实这种需......
  • 关于企业级 Web 应用搜索引擎优化(Search Engine Optimization)的一些工作经验分享
    笔者之前的社区文章,分享了自己在日常工作中从事企业级Web应用开发的一些工作体会:企业级Web应用里使用CSS调整应用外观的一些例子谈谈企业级Angular应用的二次开发-基于AngularComponent替换的Extensibility支持案例介绍所谓企业级前端应用,是指为大型企业或组......
  • 聪明办法学Python_task4_11.28-12.2
    聪明办法学Python_task4_11.28-12.2聪明办法学Python_task4_11.28-12.21.task06循环1.1while循环1.2for循环1.3循环控制语句1.4range()函数2.task07字符串2.1字符串构成2.2字符串操作2.2.1字符串运算2.2.2索引&切片2.2.3相关函数1.task06......
  • 什么是电商领域的 drop sale
    "Dropsale"是电商领域的一种销售策略,通常指的是在特定时间点、短暂时间内发布限量商品,以抢购的形式进行销售。这种销售模式旨在通过短时间内的高度紧张和竞争,刺激消费者的购买欲望,从而达到快速销售产品的目的。在Dropsale中,商品的数量有限,往往比较稀缺,因此消费者需要迅速采取......
  • 事务码 RZ11 对 SAP ABAP 系统管理员( Basis )的作用
    SAPABAP系统中的事务码RZ11是一个非常重要的工具,它主要用于显示和维护SAP系统的参数。这些参数影响了SAP系统的运行,包括内存管理,数据库交互,安全性设置等。RZ11提供了一种方法,允许管理员或开发者查看和修改这些参数,以便调整系统的运行方式,以满足特定的需求或优化性能。例......
  • FreeRTOS--队列
    示例源码基于FreeRTOSV9.0.0队列1.概述FreeRTOS的队列,支持任务与任务间的通信,以及任务与中断间的通信。它是FreeRTOS系统中主要的任务间通信方式。队列内的消息,是通过拷贝方式传递,而非指针。队列除了基本的先进先出特性,也支持往队列首部写入数据。FreeRTOS基于队列进行扩......
  • 华为云IotDA平台与OBS进行数据转发并使用ECS服务器完成数据调用
    华为云IotDA平台与OBS进行数据转发并使用ECS服务器完成数据调用一、通过IotDA平台接入物联网设备参考博客:https://www.cnblogs.com/gitcatone/p/17796975.html二、注册ECS服务器并进行远程控制产品简介ECS弹性服务器,一款运行在云端的弹性虚拟计算机,能够实现弹性储存容量与......