【FreeRTOS】小白进阶之如何使用FreeRTOS任务通知Notify

举报
产品人卫朋 发表于 2021/10/30 01:23:39 2021/10/30
1.4k+ 0 0
【摘要】 简析 notify 使用基础。 基于 windows vs2012 运行效果: 每个 RTOS 任务都有一个 32 位的通知值,任务创建时,这个值被初始化为 0。RTOS 任务通知相当于直接向任务发送一个事件,接收到通知的任务可以解除阻塞状态,前提是这个阻塞事件是因等待通知而引起的。发送通知的同时,也可以可选的改变接收任务的通知...

简析 notify 使用基础。

基于 windows vs2012 运行效果:

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

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

a、不覆盖接收任务的通知值

b、覆盖接收任务的通知值

c、设置接收任务通知值的某些位

d、增加接收任务的通知值

1、头文件声明


      #include "FreeRTOS.h"
      #include "task.h"
      #include "semphr.h"
      #include "supporting_functions.h"
      // 中断号
      #define mainINTERRUPT_NUMBER 3
      static void vHandlerTask( void *pvParameters );
      static void vPeriodicTask( void *pvParameters );
      // 中断处理函数
      static uint32_t ulExampleInterruptHandler( void );
      // 延时
      static const TickType_t xInterruptFrequency = pdMS_TO_TICKS( 500UL );
      static TaskHandle_t xHandlerTask = NULL;
  
 

2、启动任务


      int main( void )
      {
     	xTaskCreate( vHandlerTask, "Handler", 1000, NULL, 3, &xHandlerTask );
     	xTaskCreate( vPeriodicTask, "Periodic", 1000, NULL, 1, NULL );
     	vPortSetInterruptHandler( mainINTERRUPT_NUMBER, ulExampleInterruptHandler );
     	vTaskStartScheduler();
     	for( ;; );
     	return 0;
      }
  
 

3、Notify 接收任务


      static void vHandlerTask( void *pvParameters )
      {
     	const TickType_t xMaxExpectedBlockTime = xInterruptFrequency + pdMS_TO_TICKS( 10 );
      	uint32_t ulEventsToProcess;
     	for( ;; )
      	{
     		// 等待接收 notify
      		ulEventsToProcess = ulTaskNotifyTake( pdTRUE, xMaxExpectedBlockTime );
     		if( ulEventsToProcess != 0 )
      		{
     			while( ulEventsToProcess > 0 )
      			{
     				vPrintString( "Handler task - Processing event.\r\n" );
      				ulEventsToProcess--;
      			}
      		}
      	}
      }
  
 

4、中断处理函数


      static uint32_t ulExampleInterruptHandler( void )
      {
     	BaseType_t xHigherPriorityTaskWoken;
      	xHigherPriorityTaskWoken = pdFALSE;
     	// 发送 notify 到 任务
     	vTaskNotifyGiveFromISR( xHandlerTask,
      							&xHigherPriorityTaskWoken );
     	portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
      }
  
 

5、触发中断


      static void vPeriodicTask( void *pvParameters )
      {
     	for( ;; )
      	{
      		vTaskDelay( xInterruptFrequency );
      		vPrintString( "Periodic task - About to generate an interrupt.\r\n" );
      		vPortGenerateSimulatedInterrupt( mainINTERRUPT_NUMBER );
      		vPrintString( "Periodic task - Interrupt generated.\r\n\r\n\r\n" );
      	}
      }
  
 

文章来源: blog.csdn.net,作者:简一商业,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/liwei16611/article/details/82620736

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。