STM32_Study 发表于 2010-3-10 00:05:21

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

因为手头上一时没有可以玩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信息。如图:
http://cache.amobbs.com/bbs_upload782111/files_27/ourdev_537506.gif
(流程图)

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

我猜想:

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

是不是这样呢?

STM32_Study 发表于 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就被阻塞了


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

STM32_Study 发表于 2010-3-10 00:33:31

刚刚想了一下,如果在线程C的开头,就同时申请两个资源,好像就可以避免上述问题了

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



哎呀……第一次接触RTOS概念,脑子里面一片浆糊,好难转过弯来呀
页: [1]
查看完整版本: RT-Thread 线程切换猜想,请诸位大侠指点。