打印
[STM32F1]

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

[复制链接]
588|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wyjie|  楼主 | 2021-12-6 23:27 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
freertos如何实现合并阻塞与非阻塞任务

使用特权

评论回复
沙发
heweibig| | 2021-12-6 23:29 | 只看该作者

楼主详细说说怎么回事啊,这么说太笼统了

使用特权

评论回复
板凳
zyf部长| | 2021-12-6 23:34 | 只看该作者
在优先级 osPriorityIdle上创建两个任务。这两个任务只是不停地打印输出字符串,然它什么事情也不做。
第三个任务创建在优先级 osPriorityLow 上,高于另外两个任务的优先级。这个任务虽然也是打印输出字符串,但它是周期性的,所以调用了osDelayUntil(),在每两次打印之间处于阻塞态。
但最后的结果是一直打印任务3的内容,并没有出现两者交替打印的现象。

使用特权

评论回复
地板
juventus9554| | 2021-12-6 23:37 | 只看该作者

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
5
wyjie|  楼主 | 2021-12-6 23:39 | 只看该作者
/* 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);

使用特权

评论回复
6
wyjie|  楼主 | 2021-12-6 23:40 | 只看该作者
/* USER CODE BEGIN Header_StartTask01 */

/**

  * @brief  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 */

}

使用特权

评论回复
7
chenjunt| | 2021-12-6 23:43 | 只看该作者
你把三个任务中OSDelay() 这行代码打开,试一试。

使用特权

评论回复
8
wyjie|  楼主 | 2021-12-6 23:45 | 只看该作者
厉害呀,确实好用啦~能讲解下为啥吗?确实没理解

使用特权

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

使用特权

评论回复
10
chuxh| | 2021-12-6 23:49 | 只看该作者
我也这样觉得的。

使用特权

评论回复
11
wyjie|  楼主 | 2021-12-6 23:51 | 只看该作者
理解啦,非常感谢,我把osDelayUntil函数理解成和OSDelay具有相同的阻塞作用啦,其实不然

使用特权

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

使用特权

评论回复
13
wyjie|  楼主 | 2021-12-6 23:56 | 只看该作者

使用特权

评论回复
14
wuhany| | 2021-12-6 23:58 | 只看该作者
设置优先级?

使用特权

评论回复
15
caoenq| | 2021-12-7 08:51 | 只看该作者
wyjie 发表于 2021-12-6 23:51
理解啦,非常感谢,我把osDelayUntil函数理解成和OSDelay具有相同的阻塞作用啦,其实不然
...

敢问老哥:osDelayUntil()和OSDelay()的阻塞作用应该是一样的吧,他们区别只是前者的延时更为精确。以上是我的理解,请老哥指点二者到底有和区别

使用特权

评论回复
16
caoenq| | 2021-12-7 08:53 | 只看该作者
jlyuan 发表于 2021-12-6 23:47
每个高优先级的任务都需要给低优先级的任务让出CPU的控制,OSDelay只是其中一个方法,其他的你可以去研究
...

可是楼主的高优先级的任务里 调用了osDelayUnti()这个函数,理论上调用了这个函数之后,该任务会让出CPU使用权给低优先级的任务。l

使用特权

评论回复
17
juventus9554| | 2021-12-7 19:14 | 只看该作者
没写过这么复杂的程序

使用特权

评论回复
18
wyjie|  楼主 | 2021-12-7 19:16 | 只看该作者

好的,我明天去单位试一下,多谢各位大侠了哈        

使用特权

评论回复
19
tpgf| | 2022-1-3 18:04 | 只看该作者
什么是合并阻塞啊

使用特权

评论回复
20
xiaoqizi| | 2022-1-3 18:10 | 只看该作者
不太了解这俩名词

使用特权

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

本版积分规则

927

主题

12706

帖子

5

粉丝