【FreeRTOS】小白进阶之如何在产品中同时使用FreeRTOS队列和中断

举报
产品人卫朋 发表于 2021/10/30 00:27:46 2021/10/30
【摘要】 简析队列和中断的综合运用。 1、头文件声明 #include "FreeRTOS.h"#include "task.h"#include "queue.h"#include "supporting_functions.h" // 模拟中断号,中断号 0 和 2 已经被 FreeRTOS Windows port 占用#define ...

简析队列和中断的综合运用。

1、头文件声明


  
  1. #include "FreeRTOS.h"
  2. #include "task.h"
  3. #include "queue.h"
  4. #include "supporting_functions.h"
  5. // 模拟中断号,中断号 0 和 2 已经被 FreeRTOS Windows port 占用
  6. #define mainINTERRUPT_NUMBER 3
  7. // 任务
  8. static void vIntegerGenerator( void *pvParameters );
  9. static void vStringPrinter( void *pvParameters );
  10. // 中断函数
  11. static uint32_t ulExampleInterruptHandler( void );
  12. // 队列
  13. QueueHandle_t xIntegerQueue, xStringQueue;

2、启动任务


  
  1. int main( void )
  2. {
  3. // 创建队列
  4. xIntegerQueue = xQueueCreate( 10, sizeof( uint32_t ) );
  5. xStringQueue = xQueueCreate( 10, sizeof( char * ) );
  6. // 创建任务:传递整形数据到中断
  7. xTaskCreate( vIntegerGenerator, "IntGen", 1000, NULL, 1, NULL );
  8. // 创建任务:处理字符串
  9. xTaskCreate( vStringPrinter, "String", 1000, NULL, 2, NULL );
  10. // 注册中断处理函数
  11. vPortSetInterruptHandler( mainINTERRUPT_NUMBER, ulExampleInterruptHandler );
  12. // 启动任务调度
  13. vTaskStartScheduler();
  14. for( ;; );
  15. return 0;
  16. }

 3、任务


  
  1. static void vIntegerGenerator( void *pvParameters )
  2. {
  3. TickType_t xLastExecutionTime;
  4. const TickType_t xDelay200ms = pdMS_TO_TICKS( 200UL ), xDontBlock = 0;
  5. uint32_t ulValueToSend = 0;
  6. BaseType_t i;
  7. // 获取当前 tick
  8. xLastExecutionTime = xTaskGetTickCount();
  9. for( ;; )
  10. {
  11. // 延时 200ms 并更新时间 tick
  12. vTaskDelayUntil( &xLastExecutionTime, xDelay200ms );
  13. // 写数据到队列
  14. for( i = 0; i < 5; i++ )
  15. {
  16. xQueueSendToBack( xIntegerQueue, &ulValueToSend, xDontBlock );
  17. ulValueToSend++;
  18. }
  19. // 启动模拟中断
  20. vPrintString( "Generator task - About to generate an interrupt.\r\n" );
  21. vPortGenerateSimulatedInterrupt( mainINTERRUPT_NUMBER );
  22. vPrintString( "Generator task - Interrupt generated.\r\n\r\n\r\n" );
  23. }
  24. }
  25. static void vStringPrinter( void *pvParameters )
  26. {
  27. char *pcString;
  28. for( ;; )
  29. {
  30. // block 等待数据
  31. xQueueReceive( xStringQueue, &pcString, portMAX_DELAY );
  32. vPrintString( pcString );
  33. }
  34. }
  35. // 中断处理函数
  36. static uint32_t ulExampleInterruptHandler( void )
  37. {
  38. BaseType_t xHigherPriorityTaskWoken;
  39. uint32_t ulReceivedNumber;
  40. static const char *pcStrings[] =
  41. {
  42. "String 0\r\n",
  43. "String 1\r\n",
  44. "String 2\r\n",
  45. "String 3\r\n"
  46. };
  47. xHigherPriorityTaskWoken = pdFALSE;
  48. // 读取队列数据
  49. while( xQueueReceiveFromISR( xIntegerQueue, &ulReceivedNumber, &xHigherPriorityTaskWoken ) != errQUEUE_EMPTY )
  50. {
  51. ulReceivedNumber &= 0x03;
  52. xQueueSendToBackFromISR( xStringQueue, &pcStrings[ ulReceivedNumber ], &xHigherPriorityTaskWoken );
  53. }
  54. portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
  55. }

 

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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