搜索
ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU

[STM32F1] freertos如何实现合并阻塞与非阻塞任务

[复制链接]
682|10
 楼主 | 2019-12-11 10:07 | 显示全部楼层 |阅读模式
在优先级 osPriorityIdle上创建两个任务。这两个任务只是不停地打印输出字符串,然它什么事情也不做。
第三个任务创建在优先级 osPriorityLow 上,高于另外两个任务的优先级。这个任务虽然也是打印输出字符串,但它是周期性的,所以调用了osDelayUntil(),在每两次打印之间处于阻塞态。
但最后的结果是一直打印任务3的内容,并没有出现两者交替打印的现象。
本人刚刚自学freertos ,不知问题出现在哪里,请懂freertos的大神指教一二。
  1. /* definition and creation of myTask01 */
  2.   osThreadDef(myTask01, StartTask01, osPriorityIdle, 0, 128);
  3.   myTask01Handle = osThreadCreate(osThread(myTask01), NULL);

  4.   /* definition and creation of myTask02 */
  5.   osThreadDef(myTask02, StartTask02, osPriorityIdle, 0, 128);
  6.   myTask02Handle = osThreadCreate(osThread(myTask02), NULL);

  7.   /* definition and creation of myTask03 */
  8.   osThreadDef(myTask03, StartTask03, osPriorityLow, 0, 128);
  9.   myTask03Handle = osThreadCreate(osThread(myTask03), NULL);
复制代码
  1. /* USER CODE BEGIN Header_StartTask01 */
  2. /**
  3.   * [url=home.php?mod=space&uid=247401]@brief[/url]  Function implementing the myTask01 thread.
  4.   * @param  argument: Not used
  5.   * @retval None
  6.   */
  7. /* USER CODE END Header_StartTask01 */
  8. void StartTask01(void const * argument)
  9. {

  10.   /* USER CODE BEGIN StartTask01 */
  11.   /* Infinite loop */
  12.        
  13.   for(;;)
  14.   {
  15.     printf("task01 is runnning\r\n");
  16.                 //osDelay(1);
  17.   }
  18.   /* USER CODE END StartTask01 */
  19. }

  20. /* USER CODE BEGIN Header_StartTask02 */
  21. /**
  22. * @brief Function implementing the myTask02 thread.
  23. * @param argument: Not used
  24. * @retval None
  25. */
  26. /* USER CODE END Header_StartTask02 */
  27. void StartTask02(void const * argument)
  28. {
  29.   /* USER CODE BEGIN StartTask02 */
  30.   /* Infinite loop */
  31.   for(;;)
  32.   {
  33.                 printf("task02 is runnning\r\n");
  34.     //osDelay(1);
  35.   }
  36.   /* USER CODE END StartTask02 */
  37. }

  38. /* USER CODE BEGIN Header_StartTask03 */
  39. /**
  40. * @brief Function implementing the myTask03 thread.
  41. * @param argument: Not used
  42. * @retval None
  43. */
  44. /* USER CODE END Header_StartTask03 */
  45. void StartTask03(void const * argument)
  46. {
  47.   /* USER CODE BEGIN StartTask03 */
  48.   /* Infinite loop */
  49.         portTickType xLastWakeTime;
  50.         const portTickType xDelay5ms = pdMS_TO_TICKS(1000UL);
  51.         xLastWakeTime = xTaskGetTickCount();
  52.   for(;;)
  53.   {
  54.     printf("task03 is runnning\r\n");
  55.                 osDelayUntil(&xLastWakeTime,xDelay5ms);
  56.                 //osDelay(1);
  57.   }
  58.   /* USER CODE END StartTask03 */
  59. }
复制代码

使用特权

评论回复
| 2019-12-11 10:28 | 显示全部楼层
你把三个任务中OSDelay() 这行代码打开,试一试。

使用特权

评论回复
 楼主 | 2019-12-11 10:48 | 显示全部楼层
kingkits 发表于 2019-12-11 10:28
你把三个任务中OSDelay() 这行代码打开,试一试。

厉害呀,确实好用啦~能讲解下为啥吗?确实没理解

使用特权

评论回复
| 2019-12-11 11:15 | 显示全部楼层

使用特权

评论回复
| 2019-12-11 11:26 | 显示全部楼层
每个高优先级的任务都需要给低优先级的任务让出CPU的控制,OSDelay只是其中一个方法,其他的你可以去研究

使用特权

评论回复
 楼主 | 2019-12-11 11:35 | 显示全部楼层
kingkits 发表于 2019-12-11 11:26
每个高优先级的任务都需要给低优先级的任务让出CPU的控制,OSDelay只是其中一个方法,其他的你可以去研究 ...

理解啦,非常感谢,我把osDelayUntil函数理解成和OSDelay具有相同的阻塞作用啦,其实不然

使用特权

评论回复
 楼主 | 2019-12-11 11:40 | 显示全部楼层
确实把三个任务中OSDelay() 这行代码打开,实现啦交替打印的效果
1.PNG

使用特权

评论回复
 楼主 | 2019-12-11 13:08 | 显示全部楼层
也就是说 osDelayUntil(&xLastWakeTime,xDelay5ms); 没能实现定频阻塞的效果,这和freertos教程上的资料不符呀?真叫人头大

使用特权

评论回复
 楼主 | 2019-12-11 13:44 | 显示全部楼层
终于找到了根本原因,需要使能FreeRTOSConfig.h中的     #define INCLUDE_vTaskDelayUntil         1
可以实现预想的效果,说明之前的理解没有错,终于理解透彻点啦~
2.PNG

使用特权

评论回复
| 2020-1-7 14:41 | 显示全部楼层
设置优先级?

使用特权

评论回复
| 2020-1-7 15:00 | 显示全部楼层
没写过这么复杂的程序

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表