之前说过了tick队列,现在说一下就绪队列。
就绪队列也是一个全局队列,在多核的系统中,系统为每一个核都设置了一个就绪队列:
在usrSmp.c文进中为每个cpu核都定义了自己的readQueue
Q_HEAD _WRS_DATA_ALIGN_BYTES(16) readyQSmpHead [VX_SMP_NUM_CPUS];
BMAP_LIST _WRS_DATA_ALIGN_BYTES(16) readyQSmpBMap [VX_SMP_NUM_CPUS];
相关结构体如下:
typedef struct /* BMAP_LIST */
{
UINT32 metaBMap; /* lookup table for map */
/* lookup table for listArray */
UINT32 bMap [Q_PRI_BMAP_MAX_PRIORITIES / 32];
/* doubly linked list head */
DL_LIST listArray [Q_PRI_BMAP_MAX_PRIORITIES];
} BMAP_LIST;
typedef struct /* Q_PRI_BMAP_HEAD */
{
Q_PRI_NODE *highNode; /* highest priority node */
BMAP_LIST *pBMapList; /* pointer to mapped list */
UINT nPriority; /* priorities in queue (1,288) */
} Q_PRI_BMAP_HEAD;
typedef struct /* Q_PRI_NODE */
{
DL_NODE node; /* 0: priority doubly linked node */
ULONG key; /* 8: insertion key (ie. priority) */
} Q_PRI_NODE;
typedef struct /* Q_HEAD */
{
Q_NODE *pFirstNode; /* first node in queue based on key */
UINT qPriv1; /* use is queue type dependent */
UINT qPriv2; /* use is queue type dependent */
Q_CLASS *pQClass; /* pointer to queue class */
} Q_HEAD;
typedef struct /* Q_NODE */
{
UINT qPriv1; /* use is queue type dependent */
UINT qPriv2; /* use is queue type dependent */
UINT qPriv3; /* use is queue type dependent */
UINT qPriv4; /* use is queue type dependent */
} Q_NODE;
先说一下对于全局的就绪队列的初始化:
对于每个队列呢,都有自己对应的操作函数集,就绪队列有自己的函数集,tick队列也有自己的函数集,pend的队列就根据pend的情况不一样,而使用不同的操作函数集。
就绪队列获取操作函数集的函数调用:
usrInit-->kernelInit-->READY_Q_INIT-->readyQInit
readyQInit就指定了就绪队列的操作函数,
STATUS readyQInit (void)
{
int ix;
/*不同的核对应的就绪队列都要进行初始化*/
for (ix = 0; ix < _WRS_CPU_CONFIGURED (); ix++)