关于Google和Stackoverflow上优先级优先级调度的材料很多,但我对优先级优先级调度内核中的无限循环任务的调度仍然感到困惑。让我们考虑以下情况:
RTOS分别以优先级T1
和T2
启动两个任务50
和100
。这两个任务看起来像:
void T1()
{
while(1)
{
perform_some_task1();
usleep(100);
}
}
和
void T2()
{
while(1)
{
perform_some_task2();
usleep(100);
}
}
据我所知,内核将因为优先级较高而调度T2
,而由于优先级较低而将T1
挂起。现在,由于T2
是一个无限循环,因此它将不会放弃CPU到T1
,直到其他一些高优先级任务抢占T2
为止。
但是,似乎我的理解是不正确的,因为我已经在RTOS中测试了上述情况,并且在这两个任务打印的控制台上都得到了输出。
在上述情况下,有人可以评论我对RTOS的问题和实际行为的理解吗?
答案 0 :(得分:4)
在这种情况下,一旦执行perform_some_taskN();
,两个任务都将被挂起(释放要由另一个线程使用的资源)。根据文档:
usleep()函数将导致调用线程被暂停执行,直到经过参数useconds指定的实时微秒数或信号传递到调用线程并且其动作是调用一个信号捕捉功能或终止进程。由于系统安排了其他活动,因此暂停时间可能会比请求的时间长。
顺便说一句,usleep()
已过时(改为使用nanosleep()
):
POSIX.1-2001声明此功能已过时; 使用nanosleep(2)代替。 POSIX.1-2008删除了 usleep()。