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为每个任务的执行设定了一个最大的时间片? 楼主的理解稍有偏差,下面这个消息队列设置的50ms,含义是调用此函数时,如果消息队列没有数据,会等到50ms。
此时这个任务会被挂起,让其他低优先级的任务得到执行,50ms内消息队列有数据了会返回,如果超时了也会返回。
if (xQueueReceive(xQueFd, (void *)&clientFd, 50)== pdPASS) {
/* 处理1 */
} els
/* 超时 */
}
2. FreeRTOS的时间片仅支持一个时钟周期,比如你的系统时钟节拍是1000Hz,那么时间片的大小就是1ms,时间片调度仅存在于同优先级任务。
回 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 的帖子
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 的帖子
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一直都得不到执行?
*/ 1 不会,只要时间片用完就会切换。
2.不会,只要时间片用完,也会切换。
回 eric2013 的帖子
eric2013:1 不会,只要时间片用完就会切换。2. 不会,只要时间片用完,也会切换。
(2017-03-07 14:01) images/back.gif
感谢您的帮助 想問一個問題,如果不想等待,沒有消息直接走,該 怎麼辦呢。
回 5005501 的帖子
5005501:想問一個問題,如果不想等待,沒有消息直接走,該 怎麼辦呢。 (2017-11-03 15:33) images/back.gif在你的另一个帖子已经回复。 謝謝 eric2013 发表于 2017-3-7 10:55
楼主的理解稍有偏差,下面这个消息队列设置的50ms,含义是调用此函数时,如果消息队列没有数据,会等到50ms ...
“ FreeRTOS的时间片仅支持一个时钟周期,比如你的系统时钟节拍是1000Hz,那么时间片的大小就是1ms,时间片调度仅存在于同优先级任务。”
可否设置一个任务工作的时间片的数量,比如一个函数运行10个时间片,这个怎么处理 lianfutiana 发表于 2019-3-22 10:35
“ FreeRTOS的时间片仅支持一个时钟周期,比如你的系统时钟节拍是1000Hz,那么时间片的大小就是1ms,时间 ...
FreeRTOS不支持。 eric2013 发表于 2019-3-22 12:19
FreeRTOS不支持。
不支持是啥意思???只能是一个时间周期?? lianfutiana 发表于 2019-4-2 17:46
不支持是啥意思???只能是一个时间周期??
是的。
FreeRTOS虽然支持时间片调度,但是不支持时间片个数的设置,可以理解为仅支持1个时
http://www.armbbs.cn/forum.php?mod=viewthread&tid=21135&fromuid=58
(出处: 安富莱电子论坛)
eric2013 发表于 2017-3-7 10:55
楼主的理解稍有偏差,下面这个消息队列设置的50ms,含义是调用此函数时,如果消息队列没有数据,会等到50ms ...
不错,学习了
页:
[1]