線程優先級搶佔實驗【RT-Thread學習筆記 3】

同時處於就緒狀態的線程,優先級高的先執行。 函數

高優先級就緒時,低優先級任務讓出CPU,讓高優先級任務先執行。 ui

建立兩個任務函數: spa

//線程優先級搶佔
void thread1_entry(void *parameter)
{
    rt_uint32_t count = 0;
    while(1)
    {
        for(;;count++)
        {
            rt_thread_delay(3*RT_TICK_PER_SECOND); //等三秒輸出一次
            rt_kprintf("count = %d\n",count);
        }
    }
}
void thread2_entry(void *parameter)
{
    rt_tick_t tick;
    rt_uint32_t i = 0;
    for(i = 0;;i++)
    {
        tick = rt_tick_get();
        rt_thread_delay(RT_TICK_PER_SECOND);  //等疫苗輸出一次
        rt_kprintf("tick = %d\n",tick);
    }
}

啓動他們: 線程

void rt_thread_test(void)
{
    //線程搶佔實驗
    result= rt_thread_init(&thread1,"thread1",thread1_entry,RT_NULL,thread1_stack,512,10,10);
    if(result == RT_EOK)
    {
        rt_thread_startup(&thread1);        
    }
    
    if(RT_EOK == rt_thread_init(&thread2,"thread2",thread2_entry,RT_NULL,thread2_stack,512,10,10))
    {
        rt_thread_startup(&thread2);
    }
}

由於更高的優先級,thread1率先獲得執行,隨後它調用延時,時間爲3個系統tick,因而thread2獲得執行。能夠從打印結果中發現一個規律, 在第一次thread2了打印兩次thread1會打印一次以後,接下來的話thread2每打印三次thread1會打印一次。對兩個線程的入口程序進 行分析能夠發現,在thread1 3個系統tick的延時裏,thread2實際會獲得三次執行機會,但顯然在thread1的第一個延時內thread2第三次執行並無執行結束,在第 三次延時結束之後,thread2本應該執行第三次打印計數的,可是因爲thread1此時的延時也結束了,而其優先級相比thread2要高,因此搶佔 了thread2的執行而開始執行。當thread1再次進入延時時,以前被搶佔的thread2的打印得以繼續,而後在通過兩次1個系統tick延時和 兩次打印計數後,在第三次系統tick結束後又遇到了thread1的延時結束,thread1再次搶佔得到執行,因此在此次thread1打印之 前,thread2執行了三次打印計數。 code

相關文章
相關標籤/搜索