硬汉嵌入式论坛

 找回密码
 立即注册
查看: 7034|回复: 13
收起左侧

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

[复制链接]

4

主题

17

回帖

4

积分

新手上路

积分
4
发表于 2017-3-7 10:47:18 | 显示全部楼层 |阅读模式
    在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为每个任务的执行设定了一个最大的时间片?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2017-3-7 10:55:25 | 显示全部楼层
楼主的理解稍有偏差,下面这个消息队列设置的50ms,含义是调用此函数时,如果消息队列没有数据,会等到50ms。
此时这个任务会被挂起,让其他低优先级的任务得到执行,50ms内消息队列有数据了会返回,如果超时了也会返回。
  if (xQueueReceive(xQueFd, (void *)&clientFd, 50)  == pdPASS) {
           /* 处理1 */
    } els
        /* 超时 */
   }

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

使用道具 举报

4

主题

17

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2017-3-7 11:21:05 | 显示全部楼层

回 eric2013 的帖子

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

/* 约定: 时间片大小为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一直都得不到执行?
*/
回复

使用道具 举报

4

主题

17

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2017-3-7 11:21:49 | 显示全部楼层

回 eric2013 的帖子

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

管理员,您好:

/* 约定: 时间片大小为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一直都得不到执行?
*/
回复

使用道具 举报

4

主题

17

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2017-3-7 11:22:12 | 显示全部楼层

回 eric2013 的帖子

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

/* 约定: 时间片大小为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一直都得不到执行?
*/
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2017-3-7 14:01:18 | 显示全部楼层
1   不会,只要时间片用完就会切换。
2.  不会,只要时间片用完,也会切换。
回复

使用道具 举报

4

主题

17

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2017-3-7 15:01:04 | 显示全部楼层

回 eric2013 的帖子

eric2013:1   不会,只要时间片用完就会切换。
2.  不会,只要时间片用完,也会切换。
 (2017-03-07 14:01) 
   感谢您的帮助[s:141]
回复

使用道具 举报

1

主题

4

回帖

1

积分

新手上路

积分
1
发表于 2017-11-3 15:33:11 | 显示全部楼层
想問一個問題,如果不想等待,沒有消息直接走,該 怎麼辦呢。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2017-11-3 16:22:01 | 显示全部楼层

回 5005501 的帖子

5005501:想問一個問題,如果不想等待,沒有消息直接走,該 怎麼辦呢。 (2017-11-03 15:33) 
在你的另一个帖子已经回复。
回复

使用道具 举报

1

主题

4

回帖

1

积分

新手上路

积分
1
发表于 2017-11-3 17:19:22 | 显示全部楼层
謝謝
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2019-3-22 10:35:52 | 显示全部楼层
eric2013 发表于 2017-3-7 10:55
楼主的理解稍有偏差,下面这个消息队列设置的50ms,含义是调用此函数时,如果消息队列没有数据,会等到50ms ...

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

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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2019-3-22 12:19:21 | 显示全部楼层
lianfutiana 发表于 2019-3-22 10:35
“ FreeRTOS的时间片仅支持一个时钟周期,比如你的系统时钟节拍是1000Hz,那么时间片的大小就是1ms,时间 ...

FreeRTOS不支持。
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2019-4-2 17:46:18 | 显示全部楼层

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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2019-4-3 00:45:35 | 显示全部楼层
lianfutiana 发表于 2019-4-2 17:46
不支持是啥意思???只能是一个时间周期??

是的。

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

使用道具 举报

73

主题

1193

回帖

1412

积分

至尊会员

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

不错,学习了

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-1 13:00 , Processed in 0.199539 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表