为功能队列调度实现2D队列

时间:2013-04-12 18:46:30

标签: c embedded queue

我正在编写一些C代码来模拟嵌入式系统的运行。事件发生在一定数量的设备上,优先级为0-3。我必须服务的事件的优先级主要基于设备号(设备0>设备3>设备7),然后每个设备提供的事件的优先级基于其提供的优先级。

我得出结论,2D队列可能是实现该系统的最佳方式。具有for循环的数组被认为是“浪费”,并且大多数Function Queue调度使用类似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;
}

我想我可以发现如何自己加入。我使用while循环遍历链表,如果当前事件的优先级高于单个设备堆栈的优先级,我会将其推到顶部。

这是一个冗长而复杂的问题,请随时询问您可能需要的任何澄清。提前谢谢!

1 个答案:

答案 0 :(得分:1)

为什么不拥有单个链表(队列),然后将任务插入到最后。当您想要选择下一个任务时,只需查看它并查找具有最高优先级的任务并从列表中删除。