搜索
bottom↓
回复: 5

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

[复制链接]

出0入8汤圆

发表于 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();

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入31汤圆

发表于 2015-1-2 10:24:33 | 显示全部楼层
如果不采用一般的阻塞方式,也就分时间片给它啊,其它的线程delay一下

出0入442汤圆

发表于 2015-1-2 10:41:44 | 显示全部楼层
优先级队列应当有一种防饿死机制,即如果一个低优先级线程在N次循环都没有得到执行的条件下,它的优先级会得到提升。执行完后再降下来。

出0入0汤圆

发表于 2015-1-2 10:51:29 | 显示全部楼层
实时操作系统就是这样,他不允许在高优先级任务时间片不够用的情况下,分一些给低优先级的任务,哪怕一点点
非实时性OS就可以了,比如Windows的任务,低任务优先级只要等的时间足够长,仍可以分配一些时间片,Linux也是如此

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

出0入0汤圆

发表于 2015-1-4 10:38:06 | 显示全部楼层
你那个打印只是某一刻的状态而已,不能说明某个线程有没有机会运行,要让低优先级任务线程有运行时间,所有的高优先级任务必须要有让出系统时间的相关操作,只要有一个高优先级的任务永远不让出时间,那低优先级的任务就永远无法获得系统时间,这就是实时操作系统的特性

出0入8汤圆

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

不是通过finsh打印确定低优先级线程无法获得运行机会的,而是运行一个低优先级的线程“led”,但是led始终无法化。上述代码中的“test”,“led”始终无法得到执行机会。rt_thread_yield();是让出线程的对吗?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-8 23:42

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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