qqtfh 发表于 2015-1-2 10:00:26

低优先级线程无法获得运行机会应该如何处理?

如题,部分代码如下:
int rt_application_init(void)
{
    rt_thread_t init_thread;
                rt_thread_t appThread;

    init_thread = rt_thread_create("init",
                  rt_init_thread_entry, RT_NULL,
                  2048, 8, 20);
    if (init_thread != RT_NULL)
    rt_thread_startup(init_thread);
               
               
                appThread = rt_thread_create("usbsend",
                usbsend_thread_entry, RT_NULL,
                384,21, 10);
    if (appThread != RT_NULL)
                rt_thread_startup(appThread);
               
                appThread = rt_thread_create("usbread",
                usbread_thread_entry, RT_NULL,
                384,21, 10);
    if (appThread != RT_NULL)
                rt_thread_startup(appThread);
               
                appThread = rt_thread_create("test",
                test_thread_entry, RT_NULL,
                384,22, 50);
    if (appThread != RT_NULL)
                rt_thread_startup(appThread);
               
                appThread = rt_thread_create("led",
                led_thread_entry, RT_NULL,
                256,23, 100);
    if (appThread != RT_NULL)
                rt_thread_startup(appThread);
               
    return 0;
}



线程"test"和线程"led"完全无法获得运行机会。四个线程都是运行完后就马上rt_thread_yield();

zchong 发表于 2015-1-2 10:24:33

如果不采用一般的阻塞方式,也就分时间片给它啊,其它的线程delay一下

wye11083 发表于 2015-1-2 10:41:44

优先级队列应当有一种防饿死机制,即如果一个低优先级线程在N次循环都没有得到执行的条件下,它的优先级会得到提升。执行完后再降下来。

McuPlayer 发表于 2015-1-2 10:51:29

实时操作系统就是这样,他不允许在高优先级任务时间片不够用的情况下,分一些给低优先级的任务,哪怕一点点
非实时性OS就可以了,比如Windows的任务,低任务优先级只要等的时间足够长,仍可以分配一些时间片,Linux也是如此

工业用途和民用的差别,工业用的讲原则,民用的重视客户体验

shenzhen_apeng 发表于 2015-1-4 10:38:06

你那个打印只是某一刻的状态而已,不能说明某个线程有没有机会运行,要让低优先级任务线程有运行时间,所有的高优先级任务必须要有让出系统时间的相关操作,只要有一个高优先级的任务永远不让出时间,那低优先级的任务就永远无法获得系统时间,这就是实时操作系统的特性

qqtfh 发表于 2015-1-4 19:00:26

shenzhen_apeng 发表于 2015-1-4 10:38
你那个打印只是某一刻的状态而已,不能说明某个线程有没有机会运行,要让低优先级任务线程有运行时间,所有 ...

不是通过finsh打印确定低优先级线程无法获得运行机会的,而是运行一个低优先级的线程“led”,但是led始终无法化。上述代码中的“test”,“led”始终无法得到执行机会。rt_thread_yield();是让出线程的对吗?
页: [1]
查看完整版本: 低优先级线程无法获得运行机会应该如何处理?