優先順序反轉實驗,使用訊號量實現【RT-Thread學習筆記 5】

來源:互聯網
上載者:User

標籤: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】

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.