搜索
bottom↓
回复: 2

RT-Thread 线程切换猜想,请诸位大侠指点。

[复制链接]

出0入0汤圆

发表于 2010-3-10 00:05:21 | 显示全部楼层 |阅读模式
因为手头上一时没有可以玩RT-Thread的板子,对于RT-Thread,只能靠猜想来揣摩。下面的线程,会怎样执行呢?


static void rt_thread_entry_led1(void* parameter)
{
    /* init led configuration */
    rt_kprintf("led1 init\r\n");

    while (1)
    {
        /* led on */
        rt_kprintf("led1 on\r\n");
        rt_thread_delay(500); /* sleep 5 second and switch to other thread */

        /* led off */
        rt_kprintf("led1 off\r\n");
        rt_thread_delay(500);
    }
}


static void rt_thread_entry_led2(void* parameter)
{
    /* init led configuration */
    rt_kprintf("led2 init\r\n");

    while (1)
    {
        /* led on */
        rt_kprintf("led2 on\r\n");
        rt_thread_delay(500); /* sleep 5 second and switch to other thread */

        /* led off */
        rt_kprintf("led2 off\r\n");
        rt_thread_delay(500);
    }
}

static void rt_thread_entry_led3(void* parameter)
{
    /* init led configuration */
    rt_kprintf("led3 init\r\n");

    while (1)
    {
        /* led on */
        rt_kprintf("led3 on\r\n");
        rt_thread_delay(500); /* sleep 5 second and switch to other thread */

        /* led off */
        rt_kprintf("led3 off\r\n");
        rt_thread_delay(500);
    }
}

int rt_application_init()
{
    rt_thread_t thread;

    /* create led1 thread */
    thread = rt_thread_create("led1",
                              rt_thread_entry_led1, RT_NULL,
                              512,
                              20, 5);
    if (thread != RT_NULL)
        rt_thread_startup(thread);

    thread = rt_thread_create("led2",
                              rt_thread_entry_led2, RT_NULL,
                              512,
                              20, 10);
    if (thread != RT_NULL)
        rt_thread_startup(thread);

    thread = rt_thread_create("led3",
                              rt_thread_entry_led3, RT_NULL,
                              512,
                              21, 5);
    if (thread != RT_NULL)
        rt_thread_startup(thread);

    return 0;
}


建立了三个任务,都是每隔5秒就输出led信息。如图:

(流程图)

那么,输出结果是怎样的呢?

我猜想:

led1 init
led1 on
led2 init
led2 on
led3 init
led3 on
led1 off
led2 off
led3 off
led1 on
led2 on
led3 on

……
led1 off
led2 off
led3 off
led1 on
led2 on
led3 on

是不是这样呢?

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2010-3-10 00:26:17 | 显示全部楼层
另外,调度器的时间片是多长呢?我有一个疑问,关于优先级继承部分

假设有ABC三个线程

优先级 A=B>C

A需要资源S1、B需要资源S2、C需要资源S1、S2

那么当前运行的是C线程,占用了资源S1。根据优先级继承协议,此时A挂起,C提到了A的优先级。

那么当C释放S1时,这个时候如果调度器的时间片还没有轮换过来,是不是C就有可能占用资源S2了呢?假设C在释放了S1以后,马上占用了S2,然后调度器的时间片轮换到了,于是C的优先级回到了原来的,线程A得到了S1,现在运行线程A了。当线程A运行完后,由于C占用了S2,那么C就切换成了B的优先级,B仍然处于挂起。当C使用完S2,如果调度器时间片还没轮换过来,这是C释放了S2,又占用了S1了。

于是线程B就被阻塞了


以上假设有没有可能呢?要如何避免呢?

出0入0汤圆

 楼主| 发表于 2010-3-10 00:33:31 | 显示全部楼层
刚刚想了一下,如果在线程C的开头,就同时申请两个资源,好像就可以避免上述问题了

但好像还是有可能会造成优先级混乱?



哎呀……第一次接触RTOS概念,脑子里面一片浆糊,好难转过弯来呀
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-20 20:52

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

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