RT-Thread相同优先级线程的调度

Posted 又一个暑假

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RT-Thread相同优先级线程的调度相关的知识,希望对你有一定的参考价值。

/*  静态线程的 线程堆栈*/
static rt_uint8_t thread1_stack[512];
static rt_uint8_t thread2_stack[512];

/* 静态线程的 线程控制块 */
static struct rt_thread thread_test1;
static struct rt_thread thread_test2;


static void test1_thread_entry(void* parameter);
static void test2_thread_entry(void* parameter);

void demo_thread_creat(void)
{
    rt_err_t result;

    /* 创建静态线程 : 优先级 15 ,时间片 2个系统滴答 */
    result = rt_thread_init(&thread_test1,
                            "test1",
                            test1_thread_entry, RT_NULL,
                            (rt_uint8_t*)&thread1_stack[0], sizeof(thread1_stack), 15, 2);

    if (result == RT_EOK)
    {
        rt_thread_startup(&thread_test1);
    }

    /* 创建静态线程 : 优先级 15 ,时间片 1个系统滴答 */
    result = rt_thread_init(&thread_test2,
                            "test2",
                            test2_thread_entry, RT_NULL,
                            (rt_uint8_t*)&thread2_stack[0], sizeof(thread2_stack), 15, 1);

    if (result == RT_EOK)
    {
        rt_thread_startup(&thread_test2);
    }

}

void test1_thread_entry(void* parameter)
{
    rt_uint8_t i;

    for(i = 0; i < 6; i ++)
    {
        rt_kprintf("Thread1:\\r\\n");
        rt_kprintf("This is a demo for same priority !\\r\\n");
        rt_thread_delay(4);
    }
}

void test2_thread_entry(void* parameter)
{
    rt_uint8_t j;

    for(j = 0; j <60; j ++)
    {
        rt_kprintf("Thread2:\\r\\n");
        rt_kprintf("This is a demo for same priority !\\r\\n");
    }
}

线程 test2 的打印信息输出不全,说明 test2 线程的执行被打断了, 因为 test1 线程和 test2线程的优先级都是 15,并不会发生抢占的情况,所以说 test2 线程是等到自己的执行时间片到达时,被系统剥夺了 CPU 使用权,而将使用权交给了 test1 线程,从而 test1 线程重新获得执行.由此可以看出当两个相同线程间,运行是以时间片为基准的,时间片到达,则交出CPU 使用权,交给下一个就绪的同优先级线程执行。
PS:由于上面的两个线程都不是无限循环结构,在其正常退出后,其线程状态变为初始化状态,然后在空闲线程中将其从线程调度列表中删除。学到这里可以再创建个任务,一段时间以后调用rt_thread_startup再变成就绪状态。代码如下:

#include <rtthread.h>
#include <stm32f10x.h>
#include "test.h"



/*  变量分配4字节对齐 */
ALIGN(RT_ALIGN_SIZE)

/*  静态线程的 线程堆栈*/
static rt_uint8_t thread1_stack[512];
static rt_uint8_t thread2_stack[512];
static rt_uint8_t thread3_stack[512];

/* 静态线程的 线程控制块 */
static struct rt_thread thread_test1;
static struct rt_thread thread_test2;
static struct rt_thread thread_test3;

static void test1_thread_entry(void* parameter);
static void test2_thread_entry(void* parameter);
static void test3_thread_entry(void* parameter);

static     rt_uint8_t  test3_thread_flag = 0;

void demo_thread_creat(void)
{
    rt_err_t result;

    /* 创建静态线程 : 优先级 15 ,时间片 2个系统滴答 */
    result = rt_thread_init(&thread_test1,
                            "test1",
                            test1_thread_entry, RT_NULL,
                            (rt_uint8_t*)&thread1_stack[0], sizeof(thread1_stack), 15, 2);

    if (result == RT_EOK)
    {
        rt_thread_startup(&thread_test1);
    }

    /* 创建静态线程 : 优先级 15 ,时间片 1个系统滴答 */
    result = rt_thread_init(&thread_test2,
                            "test2",
                            test2_thread_entry, RT_NULL,
                            (rt_uint8_t*)&thread2_stack[0], sizeof(thread2_stack), 15, 1);

    if (result == RT_EOK)
    {
        rt_thread_startup(&thread_test2);
    }

    /* 创建静态线程 : 优先级 14 ,时间片 1个系统滴答 */
    result = rt_thread_init(&thread_test3,
                            "test3",
                            test3_thread_entry, RT_NULL,
                            (rt_uint8_t*)&thread3_stack[0], sizeof(thread3_stack), 14, 1);

    if (result == RT_EOK)
    {
        rt_thread_startup(&thread_test3);
    }

}

void test1_thread_entry(void* parameter)
{
    rt_uint8_t i;

    for(i = 0; i < 6; i ++)
    {
        rt_kprintf("Thread1:\\r\\n");
        rt_kprintf("This is a demo for same priority !\\r\\n");
        rt_thread_delay(4);
    }
}

void test2_thread_entry(void* parameter)
{
    rt_uint8_t j;

    for(j = 0; j <60; j ++)
    {
        rt_kprintf("Thread2:\\r\\n");
        rt_kprintf("This is a demo for same priority !\\r\\n");
    }
}

void test3_thread_entry(void* parameter)
{
    while(1)
    {
        rt_thread_delay(3000);
        if(0 == test3_thread_flag)
        {
            rt_thread_startup(&thread_test1);
            rt_thread_startup(&thread_test2);
            test3_thread_flag = 1;
        }
    }
}

 


本例程同样需要关闭 finsh 组件。

以上是关于RT-Thread相同优先级线程的调度的主要内容,如果未能解决你的问题,请参考以下文章

RT-Thread RTOS的RT-Thread / uCOS / FreeRTOS 简单比较

RT-Thread--内核基础

RT-thread嵌入式操作系统相关的问题

RT-Thread内核线程调度算法(基于位图的线程调度算法)

RT-Thread 线程的让出

RT-Thread 线程调度