ygcldrz 发表于 2017-3-7 10:47:18

FreeRTOS怎么分配每个任务的时间片?

    在FreeRTOS中,创建多个任务,任务之间的切换

任务1,在50ms内没有接收到消息,则进行任务切换,超过
task1:

    if (xQueueReceive(xQueFd, (void *)&clientFd, 50)== pdPASS) {
         /* 处理1 */
    } else {
      /* 超时 */
   }


task2:

void Task_KeyScan(void *pvParameters)
{
    for( ;; )
    {
      KEY_Scan();
      vTaskDelay(10);
    }
}
正常情况下:
在task2中,按键每间隔10ms进行一次扫描,当程序执行到KEY_SCAN()后,遇到vTaskDelay将进行一次任务切换;
假如:我将task2代码修改如下

void Task_KeyScan(void *pvParameters)
{
    for( ;; )
    {
      KEY_Scan(); /* 没有vTaskDelay */
    }
}
此种情况下,task2一直占据CPU时间,需要多久才能将时间片消耗完,是不是RTOS为每个任务的执行设定了一个最大的时间片?

eric2013 发表于 2017-3-7 10:55:25

楼主的理解稍有偏差,下面这个消息队列设置的50ms,含义是调用此函数时,如果消息队列没有数据,会等到50ms。
此时这个任务会被挂起,让其他低优先级的任务得到执行,50ms内消息队列有数据了会返回,如果超时了也会返回。
if (xQueueReceive(xQueFd, (void *)&clientFd, 50)== pdPASS) {
         /* 处理1 */
    } els
      /* 超时 */
   }

2. FreeRTOS的时间片仅支持一个时钟周期,比如你的系统时钟节拍是1000Hz,那么时间片的大小就是1ms,时间片调度仅存在于同优先级任务。

ygcldrz 发表于 2017-3-7 11:21:05

回 eric2013 的帖子

eric2013:楼主的理解稍有偏差,下面这个消息队列设置的50ms,含义是调用此函数时,如果消息队列没有数据,会等到50ms。
此时这个任务会被挂起,让其他低优先级的任务得到执行,50ms内消息队列有数据了会返回,如果超时了也会返回。
  if (xQueueReceive(xQueFd, (void *)&cli .. (2017-03-07 10:55) images/back.gif

管理员,您好:

/* 约定: 时间片大小为1ms
   task1与task2任务优先级相同 */
void task1(void)
{
    for (;;)
    {
      func_A();// 该函数执行完需要40ms;
      vTaskDelay(5);
    }
}

void task1(void)
{
    for (;;)
    {
      func_B();// 该函数执行完需要40ms;
      //vTaskDelay(5); /* 没有执行阻塞式API vTaskDelay 该任务不会被挂起 */
    }
}

/*
    问题1: 如果程序执行到了func_A,还没有执行vTaskDelay(5),那么是不是func_B()在此期间一直都不会执行?
    问题2: 如果程序执行到了func_B,由于没有vTaskDelay,那么是不是task1一直都得不到执行?
*/

ygcldrz 发表于 2017-3-7 11:21:49

回 eric2013 的帖子

eric2013:楼主的理解稍有偏差,下面这个消息队列设置的50ms,含义是调用此函数时,如果消息队列没有数据,会等到50ms。
此时这个任务会被挂起,让其他低优先级的任务得到执行,50ms内消息队列有数据了会返回,如果超时了也会返回。
  if (xQueueReceive(xQueFd, (void *)&cli .. (2017-03-07 10:55) images/back.gif

管理员,您好:

管理员,您好:

/* 约定: 时间片大小为1ms
   task1与task2任务优先级相同 */
void task1(void)
{
    for (;;)
    {
      func_A();// 该函数执行完需要40ms;
      vTaskDelay(5);
    }
}

void task1(void)
{
    for (;;)
    {
      func_B();// 该函数执行完需要40ms;
      //vTaskDelay(5); /* 没有执行阻塞式API vTaskDelay 该任务不会被挂起 */
    }
}

/*
    问题1: 如果程序执行到了func_A,还没有执行vTaskDelay(5),那么是不是func_B()在此期间一直都不会执行?
    问题2: 如果程序执行到了func_B,由于没有vTaskDelay,那么是不是task1一直都得不到执行?
*/

ygcldrz 发表于 2017-3-7 11:22:12

回 eric2013 的帖子

eric2013:楼主的理解稍有偏差,下面这个消息队列设置的50ms,含义是调用此函数时,如果消息队列没有数据,会等到50ms。
此时这个任务会被挂起,让其他低优先级的任务得到执行,50ms内消息队列有数据了会返回,如果超时了也会返回。
  if (xQueueReceive(xQueFd, (void *)&cli .. (2017-03-07 10:55) images/back.gif

管理员,您好:

/* 约定: 时间片大小为1ms
   task1与task2任务优先级相同 */
void task1(void)
{
    for (;;)
    {
      func_A();// 该函数执行完需要40ms;
      vTaskDelay(5);
    }
}

void task1(void)
{
    for (;;)
    {
      func_B();// 该函数执行完需要40ms;
      //vTaskDelay(5); /* 没有执行阻塞式API vTaskDelay 该任务不会被挂起 */
    }
}

/*
    问题1: 如果程序执行到了func_A,还没有执行vTaskDelay(5),那么是不是func_B()在此期间一直都不会执行?
    问题2: 如果程序执行到了func_B,由于没有vTaskDelay,那么是不是task1一直都得不到执行?
*/

eric2013 发表于 2017-3-7 14:01:18

1   不会,只要时间片用完就会切换。
2.不会,只要时间片用完,也会切换。

ygcldrz 发表于 2017-3-7 15:01:04

回 eric2013 的帖子

eric2013:1   不会,只要时间片用完就会切换。
2.  不会,只要时间片用完,也会切换。
 (2017-03-07 14:01) images/back.gif

   感谢您的帮助

5005501 发表于 2017-11-3 15:33:11

想問一個問題,如果不想等待,沒有消息直接走,該 怎麼辦呢。

eric2013 发表于 2017-11-3 16:22:01

回 5005501 的帖子

5005501:想問一個問題,如果不想等待,沒有消息直接走,該 怎麼辦呢。 (2017-11-03 15:33) images/back.gif

在你的另一个帖子已经回复。

5005501 发表于 2017-11-3 17:19:22

謝謝

lianfutiana 发表于 2019-3-22 10:35:52

eric2013 发表于 2017-3-7 10:55
楼主的理解稍有偏差,下面这个消息队列设置的50ms,含义是调用此函数时,如果消息队列没有数据,会等到50ms ...

“ FreeRTOS的时间片仅支持一个时钟周期,比如你的系统时钟节拍是1000Hz,那么时间片的大小就是1ms,时间片调度仅存在于同优先级任务。”

可否设置一个任务工作的时间片的数量,比如一个函数运行10个时间片,这个怎么处理

eric2013 发表于 2019-3-22 12:19:21

lianfutiana 发表于 2019-3-22 10:35
“ FreeRTOS的时间片仅支持一个时钟周期,比如你的系统时钟节拍是1000Hz,那么时间片的大小就是1ms,时间 ...

FreeRTOS不支持。

lianfutiana 发表于 2019-4-2 17:46:18

eric2013 发表于 2019-3-22 12:19
FreeRTOS不支持。

不支持是啥意思???只能是一个时间周期??

eric2013 发表于 2019-4-3 00:45:35

lianfutiana 发表于 2019-4-2 17:46
不支持是啥意思???只能是一个时间周期??

是的。

FreeRTOS虽然支持时间片调度,但是不支持时间片个数的设置,可以理解为仅支持1个时
http://www.armbbs.cn/forum.php?mod=viewthread&tid=21135&fromuid=58
(出处: 安富莱电子论坛)

wdliming 发表于 2019-12-13 10:06:35

eric2013 发表于 2017-3-7 10:55
楼主的理解稍有偏差,下面这个消息队列设置的50ms,含义是调用此函数时,如果消息队列没有数据,会等到50ms ...

不错,学习了
页: [1]
查看完整版本: FreeRTOS怎么分配每个任务的时间片?