RT-Thread 線程調度


/*  變量分配4字節對齊 */
ALIGN(RT_ALIGN_SIZE)

/*  靜態線程的 線程堆棧*/
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 ,時間片 10個系統滴答 */
    result = rt_thread_init(&thread_test1,
                                  "test1",
                       test1_thread_entry, 
                                  RT_NULL,
           (rt_uint8_t*)&thread1_stack[0], 
                       sizeof(thread1_stack), 
                                       15, 
                                       10);
    if (result == RT_EOK)
    {
        rt_thread_startup(&thread_test1);
    }

    /* 創建靜態線程 : 優先級 16 ,時間片 25個系統滴答 */
    result = rt_thread_init(&thread_test2,
                                  "test2",
                       test2_thread_entry, 
                                  RT_NULL,
           (rt_uint8_t*)&thread2_stack[0], 
                    sizeof(thread2_stack),
                                       16,
                                      25);
    if (result == RT_EOK)
    {
        rt_thread_startup(&thread_test2);
    }

}

void test1_thread_entry(void* parameter)
{

    rt_uint32_t i;
    /* 無限循環*/
    while (1)
    {
        for(i = 0; i<10; i++)
        {
            rt_kprintf(" %d \r\n", i);
            /* 等待1s,讓出cpu權限,切換到其他線程 */
            rt_thread_delay( 100 );

        }
    }
}

void test2_thread_entry(void* parameter)
{
    rt_uint32_t i=0;
    /* 無限循環*/
    while (1)
    {
        rt_kprintf(" test2 thread count:%d \r\n", ++i);
        /* 等待0.5s,讓出cpu權限,切換到其他線程 */
        rt_thread_delay(50);
    }
}

程序運行分析:
1、首先系統調度 test1 線程投入運行,打印第 0 次運行的信息,然后通過延時函數將自己掛起 100 個時間片,系統將 test2 線程調度運行;
2、 test2 線程打印第 0 次運行信息,然后通過延時函數將自己掛起 50 個時間片;
3、系統中無任務運行,系統將空閑線程調入運行;
4、 50 個時間片后 test2 線程被喚醒,打印第 1 次運行的信息,再繼續通過延時函數將自己掛起 50 個時間片;
5、系統中無任務運行,系統將空閑線程調入運行;
6、 50 個時間片時間到, test1 線程被喚醒,打印第 1 次運行信息,繼續掛起 100 個時間片;
7、 test2 線程被喚醒,打印第 2 次運行的信息,再繼續通過延時函數將自己掛起 50 個時間片;
8、系統中無任務運行,系統將空閑線程調入運行;
9、 50 個時間片后 test2 線程被喚醒,打印第 3 次運行的信息,再繼續通過延時函數將自己掛起 50 個時間片;
10、循環執行 5-9 的過程。

 

為了演示 test1 線程、 test2 線程之間的切換,我們需在程序中屏蔽掉 finsh 組件( finsh組件會建立 shell 線程):
/* SECTION: finsh, a C-Express shell */
//#define RT_USING_FINSH

 

RT-Thread的shell系統——finsh,提供了一套供用戶在命令行操作的接口,主要用於調試、查看系統信息。 finsh被設計成一個不同於傳統命令行的C語言表達式解釋器:由於很多嵌入式系統都是采用C語言來編寫, finsh正是采用了這種系統軟件開發人員都會的語法形式,把C語言表達式變成了命令行的風格。它能夠解析執行大部分C語言的表達式,也能夠使用類似於C語言的函數調用方式訪問系統中的函數及全局變量,此外它也能夠通過命令行方式創建變量。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM