2013-04-12 68 views
0

我正在編寫一些C代碼來模擬嵌入式系統的運行。事件發生在一定數量的設備上,優先級爲0-3。我必須服務的事件的優先級主要基於設備編號(設備0>設備3>設備7),然後每個設備提供的事件優先級基於它們提供的優先級。實現函數隊列調度的2D隊列

我得出結論,2D隊列可能是實現這個系統的最佳方式。帶有for循環的數組被認爲是「浪費的」,並且大多數函數隊列調度使用循環while(notEmpty)。

我粗略的計劃是創建兩個「節點」結構,看起來是這樣的:

struct events{ 
    Event curEvent; //the "node" 
    struct events *next; //leads to event of lower priority 
}; 
struct devices { //a linked list of Devices 
    int deviceNumber; //the "node" 
    struct devices *next;//leads to next device in order 0->max 
    struct events *headEevent; //a linked list of events per device 
}; 

我提供服務的設備的數量和每個設備事件的命令行的最大數量。

我想我的問題是雙重的。首先是,我在正確的軌道上?第二個(也許更重要的)是「什麼是初始化這個2D隊列的最佳方式,以及事件發生的最佳方式?」

現在我的初始化代碼是錯誤的,我的感受:

curDevice = (struct device *) malloc (sizeof (struct device)); 
deviceHead = curDevice;//sets head to first that's initialized 
for (i = 0; i< Number_Devices; i++) { 
    curDevice -> deviceNumber = i; 
    curEvent = (struct event *) malloc (sizeof (struct event)); 
    curDevice -> headEvent = curEvent; //sets head event to the empty curEvent 
    for (j = 0; j<Q; j++) { //Q is max queue size 
     newEvent = (struct event*) malloc (sizeof struct event)); 
     curEvent -> next = newEvent; 
     curEvent = newEvent; 
    } 
    new_device = (struct device *) malloc (sizeof (struct device)); 
    curDevice -> next = newDevice; 
    curDevice = newDevice; 
} 

我想我可以瞭解如何對我自己enqueque。我會使用while循環遍歷鏈表,如果當前事件的優先級高於單個設備堆棧上的優先級,那麼我會將它推到頂端。

這是一個漫長而複雜的問題,請隨時索取您可能需要的任何說明。提前致謝!

+0

你有任何操作系統,比如說信號量? –

回答

1

爲什麼不有一個單一的鏈表(隊列),然後插入任務到最後。當您想要選擇下一個任務時,只需查看它並查找具有最高優先級的任務並從列表中刪除即可。

+0

你的建議是建立一個有事件的隊列,存儲他們的設備號和優先級。在中斷處理程序運行之後,我會遍歷整個隊列,然後在該單個隊列中提供最高優先級的事件? – Ryanman

+0

同學的實現是一個固定數組,其元素是鏈接列表,導致存儲事件。也許我對FQS的工作方式很無知。如果我有一個隊列中的優先級較低的事件,並且隊列的空間有限,那麼我是否刪除了最低優先級的事件並排入新隊列? – Ryanman

+0

@Ryanman,是的,你描述了我的意思。當你刪除元素 - 只是刪除它,就是它(和自由內存)。鏈表不是一個固定的空間,所以不要擔心。 – Andrey