同時處於就緒狀態的線程,優先級高的先執行。
高優先級就緒時,低優先級任務讓出CPU,讓高優先級任務先執行。
創建兩個任務函數:
//線程優先級搶占 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執行了三次打印計數。