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

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

简析 notify 使用基础。

基于 windows vs2012 运行效果:

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

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

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

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

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

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

1、头文件声明


  
  1. #include "FreeRTOS.h"
  2. #include "task.h"
  3. #include "semphr.h"
  4. #include "supporting_functions.h"
  5. // 中断号
  6. #define mainINTERRUPT_NUMBER 3
  7. static void vHandlerTask( void *pvParameters );
  8. static void vPeriodicTask( void *pvParameters );
  9. // 中断处理函数
  10. static uint32_t ulExampleInterruptHandler( void );
  11. // 延时
  12. static const TickType_t xInterruptFrequency = pdMS_TO_TICKS( 500UL );
  13. static TaskHandle_t xHandlerTask = NULL;

2、启动任务


  
  1. int main( void )
  2. {
  3. xTaskCreate( vHandlerTask, "Handler", 1000, NULL, 3, &xHandlerTask );
  4. xTaskCreate( vPeriodicTask, "Periodic", 1000, NULL, 1, NULL );
  5. vPortSetInterruptHandler( mainINTERRUPT_NUMBER, ulExampleInterruptHandler );
  6. vTaskStartScheduler();
  7. for( ;; );
  8. return 0;
  9. }

3、Notify 接收任务


  
  1. static void vHandlerTask( void *pvParameters )
  2. {
  3. const TickType_t xMaxExpectedBlockTime = xInterruptFrequency + pdMS_TO_TICKS( 10 );
  4. uint32_t ulEventsToProcess;
  5. for( ;; )
  6. {
  7. // 等待接收 notify
  8. ulEventsToProcess = ulTaskNotifyTake( pdTRUE, xMaxExpectedBlockTime );
  9. if( ulEventsToProcess != 0 )
  10. {
  11. while( ulEventsToProcess > 0 )
  12. {
  13. vPrintString( "Handler task - Processing event.\r\n" );
  14. ulEventsToProcess--;
  15. }
  16. }
  17. }
  18. }

4、中断处理函数


  
  1. static uint32_t ulExampleInterruptHandler( void )
  2. {
  3. BaseType_t xHigherPriorityTaskWoken;
  4. xHigherPriorityTaskWoken = pdFALSE;
  5. // 发送 notify 到 任务
  6. vTaskNotifyGiveFromISR( xHandlerTask,
  7. &xHigherPriorityTaskWoken );
  8. portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
  9. }

5、触发中断


  
  1. static void vPeriodicTask( void *pvParameters )
  2. {
  3. for( ;; )
  4. {
  5. vTaskDelay( xInterruptFrequency );
  6. vPrintString( "Periodic task - About to generate an interrupt.\r\n" );
  7. vPortGenerateSimulatedInterrupt( mainINTERRUPT_NUMBER );
  8. vPrintString( "Periodic task - Interrupt generated.\r\n\r\n\r\n" );
  9. }
  10. }

 

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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