广告
返回顶部
首页 > 资讯 > 操作系统 >FreeRTOS实时操作系统的任务通知方法
  • 548
分享到

FreeRTOS实时操作系统的任务通知方法

2024-04-02 19:04:59 548人浏览 八月长安
摘要

目录前言1.发送通知-方法11.1函数描述1.2参数描述1.3返回值2.发送通知-方法22.1函数描述2.2参数描述2.3用法举例3.获取通知3.1函数描述3.2参数描述3.3返回值

前言

注:本文介绍任务通知的基础知识,详细源码分析见FreeRTOS进阶任务通知示例分析

每个RTOS任务都有一个32位的通知值,任务创建时,这个值被初始化为0。RTOS任务通知相当于直接向任务发送一个事件,接收到通知的任务可以解除阻塞状态,前提是这个阻塞事件是因等待通知而引起的。发送通知的同时,也可以可选的改变接收任务的通知值。

可以通过下列方法向接收任务更新通知:

  • 不覆盖接收任务的通知值
  • 覆盖接收任务的通知值
  • 设置接收任务通知值的某些位
  • 增加接收任务的通知值

相对于用前必须分别创建队列、二进制信号量、计数信号量或事件组的情况,使用任务通知显然更灵活。更好的是,相比于使用信号量解除任务阻塞,使用任务通知可以快45%、使用更少的RAM(使用GCC编译器,-o2优化级别)。

使用api函数xTaskNotify()和xTaskNotifyGive()(中断保护等价函数为xTaskNotifyFromISR()和vTaskNotifyGiveFromISR())发送通知,在接收RTOS任务调用API函数xTaskNotifyWait()或ulTaskNotifyTake()之前,这个通知都被保持着。如果接收RTOS任务已经因为等待通知而进入阻塞状态,则接收到通知后任务解除阻塞并清除通知。

RTOS任务通知功能默认是使能的,可以通过在文件FreeRTOSConfig.h中设置宏configUSE_TASK_NOTIFICATioNS为0来禁止这个功能,禁止后每个任务节省8字节内存。

虽然RTOS任务通知速度更快并且占用内存更少,但它也有一些限制:

只能有一个任务接收通知事件。

接收通知的任务可以因为等待通知而进入阻塞状态,但是发送通知的任务即便不能立即完成通知发送也不能进入阻塞状态。

1.发送通知-方法1

1.1函数描述

         BaseType_t xTaskNotify( TaskHandle_txTaskToNotify,
                         uint32_t ulValue,
                         eNotifyAction eAction);

向指定任务发送指定的通知值。如果打算使用RTOS任务通知实现轻量级的二进制或计数信号量,推荐使用API函数xTaskNotifyGive()来代替本函数。

此函数不可以在中断服务例程中调用,中断保护等价函数为xTaskNotifyFromISR()。

1.2参数描述

xTaskToNotify:被通知的任务句柄。

ulValue:通知更新值eAction:枚举类型,指明更新通知值的方法

枚举变量成员以及作用如下表所示。

1.3返回值

参数eAction为eSetValueWithoutOverwrite时,如果被通知任务还没取走上一个通知,又接收到了一个通知,则这次通知值未能更新并返回pdfALSE,否则返回pdPASS。

2.发送通知-方法2

2.1函数描述

BaseType_t xTaskNotifyGive(TaskHandle_t xTaskToNotify );

其实这是一个宏,本质上相当于xTaskNotify( ( xTaskToNotify ), ( 0 ), eIncrement )。可以使用该API函数代替二进制或计数信号量,但速度更快。在这种情况下,应该使用API函数ulTaskNotifyTake()来等待通知,而不应该使用API函数xTaskNotifyWait()。

此函数不可以在中断服务例程中调用,中断保护等价函数为vTaskNotifyGiveFromISR()。

2.2参数描述

xTaskToNotify:被通知的任务句柄。

2.3用法举例

staticvoid prvTask1( void *pvParameters );
staticvoid prvTask2( void *pvParameters );

staticTaskHandle_t xTask1 = NULL, xTask2 = NULL;

voidmain( void )
{
    xTaskCreate( prvTask1, "Task1",200, NULL, tskIDLE_PRIORITY, &xTask1 );
    xTaskCreate( prvTask2, "Task2",200, NULL, tskIDLE_PRIORITY, &xTask2 );
    vTaskStartScheduler();
}

staticvoid prvTask1( void *pvParameters )
{
    for( ;; )
    {
        
        xTaskNotifyGive( xTask2 );
 
        
        ulTaskNotifyTake( pdTRUE, portMAX_DELAY);
    }
}

staticvoid prvTask2( void *pvParameters )
{
    for( ;; )
    {
        
        ulTaskNotifyTake( pdTRUE, portMAX_DELAY);
        
        xTaskNotifyGive( xTask1 );
    }
}

3.获取通知

3.1函数描述

         uint32_t ulTaskNotifyTake( BaseType_txClearCountOnExit,
                            TickType_txTicksToWait );

ulTaskNotifyTake()是专门为使用更轻量级更快的方法来代替二进制或计数信号量而量身打造的。FreeRTOS获取信号量的API函数为xSemaphoreTake(),可以使用ulTaskNotifyTake()函数等价代替。

当一个任务使用通知值来实现二进制或计数信号量时,其它任务或者中断要使用API函数xTaskNotifyGive()或者使用参数eAction为eIncrement的API函数xTaskNotify()。推荐使用xTaskNotifyGive()函数(其实是个宏,我们这里把它看作一个API函数)。另外需要注意的是,如果在中断中使用,要使用它们的中断保护等价函数:vTaskNotifyGiveFromISR()和xTaskNotifyFromISR()。

API函数xTaskNotifyTake()有两种方法处理任务的通知值,一种方法是在函数退出时将通知值清零,这种方法适用于实现二进制信号量;另外一种方法是在函数退出时将通知值减1,这种方法适用于实现计数信号量。

如果RTOS任务的通知值为0,使用xTaskNotifyTake()可以可选的使任务进入阻塞状态,直到该任务的通知值不为0。进入阻塞的任务不消耗CPU时间。

3.2参数描述

xClearCountOnExit:如果该参数设置为pdFALSE,则API函数xTaskNotifyTake()退出前,将任务的通知值减1;如果该参数设置为pdTRUE,则API函数xTaskNotifyTake()退出前,将任务通知值清零。

xTicksToWait:因等待通知而进入阻塞状态的最大时间。时间单位为系统节拍周期。宏pdMS_TO_TICKS用于将指定的毫秒时间转化为相应的系统节拍数。

3.3返回值

返回任务的当前通知值,为0或者为调用API函数xTaskNotifyTake()之前的通知值减1。

3.4用法举例


voidvANInterruptHandler( void )
{
BaseType_txHigherPriorityTaskWoken;
    prvClearInterruptSource();
     
    xHigherPriorityTaskWoken = pdFALSE;
    
    vTaskNotifyGiveFromISR( xHandlingTask,&xHigherPriorityTaskWoken );
    
    portYIELD_FROM_ISR(xHigherPriorityTaskWoken );
}


voidvHandlingTask( void *pvParameters )
{
BaseType_txEvent;
    for( ;; )
    {
        
        ulTaskNotifyTake( pdTRUE, portMAX_DELAY);
        
        do
        {
            xEvent = xQueryPeripheral();
            if( xEvent != NO_MORE_EVENTS )
            {
                vProcessPeripheralEvent( xEvent);
            }
        } while( xEvent != NO_MORE_EVENTS );
    }
}

4.等待通知

4.1函数描述

         BaseType_t xTaskNotifyWait( uint32_tulBitsToClearOnEntry,
                             uint32_tulBitsToClearOnExit,
                             uint32_t*pulNotificationValue,
                             TickType_txTicksToWait );

如果打算使用RTOS任务通知实现轻量级的二进制或计数信号量,推荐使用API函数ulTaskNotifyTake()来代替本函数。

4.2参数描述

ulBitsToClearOnEntry:在使用通知之前,先将任务的通知值与参数ulBitsToClearOnEntry的按位取反值按位与操作。设置参数ulBitsToClearOnEntry为0xFFFFFFFF(ULONG_MAX),表示清零任务通知值。

ulBitsToClearOnExit:在函数xTaskNotifyWait()退出前,将任务的通知值与参数ulBitsToClearOnExit的按位取反值按位与操作。

设置参数ulBitsToClearOnExit为0xFFFFFFFF(ULONG_MAX),表示清零任务通知值。

pulNotificationValue:用于向外回传任务的通知值。这个通知值在参数ulBitsToClearOnExit起作用前将通知值拷贝到*pulNotificationValue中。如果不需要返回任务的通知值,这里设置成NULL。

xTicksToWait:因等待通知而进入阻塞状态的最大时间。时间单位为系统节拍周期。宏pdMS_TO_TICKS用于将指定的毫秒时间转化为相应的系统节拍数。

4.3返回值

如果接收到通知,返回pdTRUE,如果API函数xTaskNotifyWait()等待超时,返回pdFALSE。

4.4用法举例


voidvAnEventProcessingTask( void *pvParameters )
{
uint32_tulNotifiedValue;
    for( ;; )
    {
        
        xTaskNotifyWait( 0x00, ULONG_MAX,&ulNotifiedValue, portMAX_DELAY );
 
        
        if( ( ulNotifiedValue & 0x01 ) != 0)
        {
            prvProcessBit0Event();
        }
        if( ( ulNotifiedValue & 0x02 ) != 0)
        {
            prvProcessBit1Event();
        }
        if( ( ulNotifiedValue & 0x04 ) != 0)
        {
            prvProcessBit2Event();
        }
        
    }
}

5.任务通知并查询

5.1函数描述

         BaseType_t xTaskNotifyAndQuery(TaskHandle_t xTaskToNotify,
                                 uint32_tulValue,
                                 eNotifyActioneAction,
                                 uint32_t*pulPreviousNotifyValue );

此函数与任务通知API函数xTaskNotify()非常像,只不过此函数具有一个附加参数,用来回传任务当前的通知值,然后根据参数ulValue和eAction更新任务的通知值。

此函数不能在中断服务例程中使用,在中断服务例程中使用xTaskNotifyAndQueryFromISR()函数。

5.2参数描述

xTaskToNotify:被通知的任务句柄。

ulValue:通知更新值

eAction:枚举类型,指明更新通知值的方法,枚举变量成员以及作用见xTaskNotify()一节。

pulPreviousNotifyValue:回传未被更新的任务通知值。如果不需要回传未被更新的任务通知值,这里设置为NULL,这样就等价于调用xTaskNotify()函数。

5.3返回值

参数eAction为eSetValueWithoutOverwrite时,如果被通知任务还没取走上一个通知,又接收到了一个通知,则这次通知值未能更新并返回pdFALSE,否则返回pdPASS。

以上就是FreeRTOS实时操作系统的任务通知方法的详细内容,更多关于FreeRTOS任务通知方法的资料请关注编程网其它相关文章!

--结束END--

本文标题: FreeRTOS实时操作系统的任务通知方法

本文链接: https://www.lsjlt.com/news/145289.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • FreeRTOS实时操作系统的任务通知方法
    目录前言1.发送通知-方法11.1函数描述1.2参数描述1.3返回值2.发送通知-方法22.1函数描述2.2参数描述2.3用法举例3.获取通知3.1函数描述3.2参数描述3.3返回值...
    99+
    2022-11-13
  • FreeRTOS实时操作系统的任务通知怎么实现
    这篇文章主要介绍“FreeRTOS实时操作系统的任务通知怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“FreeRTOS实时操作系统的任务通知怎么实现”文章能帮助大家解决问题。前言注:本文介绍...
    99+
    2023-06-29
  • FreeRTOS实时操作系统多任务管理基础知识
    目录什么是多任务系统?FreeRTOS  任务与协程1.任务(Task) 的特性2.协程(Co-routine)的特性任务状态运行态就绪态阻塞态挂起态任务优先级任务实现任务...
    99+
    2022-11-13
  • FreeRTOS实时操作系统的任务是什么
    这篇文章主要介绍了FreeRTOS实时操作系统的任务是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇FreeRTOS实时操作系统的任务是什么文章都会有所收获,下面我们一起来看看吧。1. 任务和协程(Co-r...
    99+
    2023-06-29
  • FreeRTOS实时操作系统的任务概要讲解
    目录1. 任务和协程(Co-routines)1.1任务的特性1.2任务概要2. 任务状态3.任务优先级4.实现一个任务5.空闲任务和空闲任务钩子(idle task和Idle Ta...
    99+
    2022-11-13
  • FreeRTOS实时操作系统的任务创建与任务切换
    目录任务控制块数据结构任务创建函数定义就绪表就绪表初始化启动调度器任务切换    任务控制块数据结构 任务控制块数据结构在task.c声明 typedef str...
    99+
    2022-11-13
  • FreeRTOS实时操作系统的任务创建和删除
    目录前言 1.任务创建1.1函数描述1.2参数描述1.3返回值1.4用法举例2.任务删除2.1任务描述2.2参数描述前言  在FreeRTOS移植到Cortex-...
    99+
    2022-11-13
  • FreeRTOS实时操作系统多任务管理基础知识有哪些
    本篇内容主要讲解“FreeRTOS实时操作系统多任务管理基础知识有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“FreeRTOS实时操作系统多任务管理基础知识有哪些”吧!RTOS 系统的核心...
    99+
    2023-06-29
  • FreeRTOS实时操作系统空闲任务的阻塞延时实现
    目录什么是阻塞延时、为什么需要空闲任务空闲任务的实现阻塞延时的实现xTicksToDelay 递减SysTick初始化仿真什么是阻塞延时、为什么需要空闲任务 RTOS中的延时叫阻塞延...
    99+
    2022-11-13
  • FreeRTOS实时操作系统的任务应用函数详解
    目录1.获取任务系统状态1.1函数描述1.2参数描述1.3返回值1.4用法举例2.获取当前任务句柄2.1函数描述2.2返回值3.获取空闲任务句柄3.1函数描述3.2返回值4.获取任务...
    99+
    2022-11-13
  • FreeRTOS实时操作系统内核配置的方法
    今天小编给大家分享一下FreeRTOS实时操作系统内核配置的方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。FreeRTO...
    99+
    2023-06-29
  • FreeRTOS实时操作系统的任务怎么创建和删除
    本文小编为大家详细介绍“FreeRTOS实时操作系统的任务怎么创建和删除”,内容详细,步骤清晰,细节处理妥当,希望这篇“FreeRTOS实时操作系统的任务怎么创建和删除”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧...
    99+
    2023-06-29
  • FreeRTOS实时操作系统的任务应用函数是什么
    本文小编为大家详细介绍“FreeRTOS实时操作系统的任务应用函数是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“FreeRTOS实时操作系统的任务应用函数是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧...
    99+
    2023-06-29
  • FreeRTOS实时操作系统空闲任务的阻塞延时怎么实现
    这篇文章主要介绍“FreeRTOS实时操作系统空闲任务的阻塞延时怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“FreeRTOS实时操作系统空闲任务的阻塞延时怎么实现”文章能帮助大家解决问题。...
    99+
    2023-06-29
  • freertos实时操作系统空闲任务阻塞延时示例解析
    目录前言空闲任务阻塞延时SysTick实验现象前言 阻塞态:如果一个任务当前正在等待某个外部事件,则称它处于阻塞态。 rtos中的延时叫阻塞延时,即任务需要延时的时候,会放弃CPU的...
    99+
    2022-11-13
  • FreeRTOS实时操作系统之可视化追踪调试的方法
    这篇文章主要讲解了“FreeRTOS实时操作系统之可视化追踪调试的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“FreeRTOS实时操作系统之可视化追踪调试的方法”吧!前言用RTOS编程...
    99+
    2023-06-29
  • FreeRTOS实时操作系统的多优先级实现
    目录如何实现任务多优先级软件通用方法和硬件指令方法如何实现任务多优先级 FreeRTOS中,数字优先级越小,逻辑优先级也越小,空闲任务优先级为0.List_t pxReadyTask...
    99+
    2022-11-13
  • FreeRTOS实时操作系统信号量基础知识点有哪些
    今天小编给大家分享一下FreeRTOS实时操作系统信号量基础知识点有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.信...
    99+
    2023-06-29
  • FreeRTOS实时操作系统的内存管理分析
    目录前言1.heap_1.c功能简介:2.heap_2.c功能简介:3.heap_3.c功能简介:4.heap_4.c功能简介:5.heap_5.c(V8.1.0新增)前言 本文介绍...
    99+
    2022-11-13
  • FreeRTOS实时操作系统的内存怎么管理
    这篇“FreeRTOS实时操作系统的内存怎么管理”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“FreeRTOS实时操作系统的...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作