打印
[STM32F1]

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

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

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

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

  /* USER CODE BEGIN StartTask01 */
  /* Infinite loop */
       
  for(;;)
  {
    printf("task01 is runnning\r\n");
                //osDelay(1);
  }
  /* USER CODE END StartTask01 */
}

/* USER CODE BEGIN Header_StartTask02 */
/**
* @brief Function implementing the myTask02 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask02 */
void StartTask02(void const * argument)
{
  /* USER CODE BEGIN StartTask02 */
  /* Infinite loop */
  for(;;)
  {
                printf("task02 is runnning\r\n");
    //osDelay(1);
  }
  /* USER CODE END StartTask02 */
}

/* USER CODE BEGIN Header_StartTask03 */
/**
* @brief Function implementing the myTask03 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask03 */
void StartTask03(void const * argument)
{
  /* USER CODE BEGIN StartTask03 */
  /* Infinite loop */
        portTickType xLastWakeTime;
        const portTickType xDelay5ms = pdMS_TO_TICKS(1000UL);
        xLastWakeTime = xTaskGetTickCount();
  for(;;)
  {
    printf("task03 is runnning\r\n");
                osDelayUntil(&xLastWakeTime,xDelay5ms);
                //osDelay(1);
  }
  /* USER CODE END StartTask03 */
}

使用特权

评论回复
沙发
kingkits| | 2019-12-11 10:28 | 只看该作者
你把三个任务中OSDelay() 这行代码打开,试一试。

使用特权

评论回复
板凳
DHZFSYJ|  楼主 | 2019-12-11 10:48 | 只看该作者
kingkits 发表于 2019-12-11 10:28
你把三个任务中OSDelay() 这行代码打开,试一试。

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

使用特权

评论回复
地板
mmuuss586| | 2019-12-11 11:15 | 只看该作者

使用特权

评论回复
5
kingkits| | 2019-12-11 11:26 | 只看该作者
每个高优先级的任务都需要给低优先级的任务让出CPU的控制,OSDelay只是其中一个方法,其他的你可以去研究

使用特权

评论回复
6
yufd123| | 2019-12-11 11:31 | 只看该作者
我也这样觉得的。

使用特权

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

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

使用特权

评论回复
8
DHZFSYJ|  楼主 | 2019-12-11 11:40 | 只看该作者
确实把三个任务中OSDelay() 这行代码打开,实现啦交替打印的效果

1.PNG (10.33 KB )

1.PNG

使用特权

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

使用特权

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

2.PNG (1.41 KB )

2.PNG

使用特权

评论回复
11
xiaoqizi| | 2020-1-7 14:41 | 只看该作者
设置优先级?

使用特权

评论回复
12
木木guainv| | 2020-1-7 15:00 | 只看该作者
没写过这么复杂的程序

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

55

帖子

1

粉丝