標籤:style blog color io os 使用 ar for 2014
RTOS中很經典的問題。就是在使用共用資源的時候,優先順序低的進程在優先順序高的進程之前執行的問題。這裡類比這種情況。
下面的實驗類比了優先順序反轉的情況:
先定義三個線程:
//優先順序反轉實驗rt_sem_t sem;rt_uint32_t t1_count = 0,t2_count = 0,worker_count = 0;rt_thread_t t1,t2,worker ;void pri1_entry(void *parameter){ rt_err_t result; while(1) { result = rt_sem_take(sem,RT_WAITING_FOREVER); for(t1_count =0;t1_count<10;t1_count++) { rt_kprintf("pri1 take semphone\r\n"); rt_thread_delay(RT_TICK_PER_SECOND); } rt_kprintf("pri1 release semphone\r\n"); rt_sem_release(sem); }}void pri2_entry(void *parameter){ //rt_uint32_t t2_count = 0; rt_err_t result; while(1) { result = rt_sem_take(sem,RT_WAITING_FOREVER); rt_kprintf("pri2 take semphone\r\n"); if(result != RT_EOK) { return; } rt_kprintf("pri2 release semphone\r\n"); rt_sem_release(sem); rt_thread_delay(5); result = rt_sem_take(sem,RT_WAITING_FOREVER); t2_count ++; rt_kprintf("pri2 :got semphone,count:%d\r\n",t2_count); result = rt_sem_release(sem); } }void worker_entry(void *parameter){ rt_thread_delay(5); for(worker_count = 0;worker_count<10;worker_count++) { rt_kprintf("worker: count: %d\n", worker_count); } rt_thread_delay(RT_TICK_PER_SECOND);}
啟動三個線程:
//訊號量/優先順序反轉實驗 t1 = rt_thread_create("pri1", pri1_entry, RT_NULL, 512, 8, 10); if (t1 != RT_NULL) rt_thread_startup(t1); t2 = rt_thread_create("pri2", pri2_entry, RT_NULL, 512, 6, 10); if (t2 != RT_NULL) rt_thread_startup(t2); worker = rt_thread_create("worker", worker_entry, RT_NULL, 512, 7, 10); if (worker != RT_NULL) rt_thread_startup(worker);sem = rt_sem_create("sem_t",1,RT_IPC_FLAG_PRIO);
三個線程的優先順序分別是:pri1:8 pri2:6 worker:7
程式開始運行時,上進程均處於就緒狀態。此時pri2進程優先順序最高開始執行,它先申請訊號量之後釋放。此時進程pri1和worker都處於就緒狀態,worker進程進入後先休眠。進程pri1開始執行。
進程pri1申請訊號量,開始輸出。此後,進程pri2就緒但它申請訊號量的時候發現訊號量被使用了,於是就開始等待訊號量。進程worker就緒後,搶佔pri1的開始執行。
於是就出現了高優先順序進程pri2處於等待狀態,而低優先順序進程worker處於執行狀態這種情況。
Pr1佔用sem時候,pri2處於等待sem狀態,worker就緒了,worker搶佔pri1的CPU執行。造成了worker的優先順序沒有pri2高,卻在pri2之前執行。
通過串口輸出的結果可以看得更清楚些:
\ | /
- RT - Thread Operating System
/ | \ 2.0.0 build Aug 29 2014
2006 - 2013 Copyright by rt-thread team
pri2 take semphone
pri2 release semphone
pri1 take semphone
finsh>>worker: count: 0
worker: count: 1
worker: count: 2
worker: count: 3
worker: count: 4
worker: count: 5
worker: count: 6
worker: count: 7
worker: count: 8
worker: count: 9
pri1 take semphone
pri1 take semphone
pri1 take semphone
pri1 take semphone
pri1 take semphone
pri1 take semphone
pri1 take semphone
pri1 take semphone
pri1 take semphone
pri1 release semphone
pri2 :got semphone,count:1
pri2 take semphone
優先順序反轉實驗,使用訊號量實現【RT-Thread學習筆記 5】