www.pudn.com > r&s1.10°æ±¾£«Îĵµ.rar > queue.h


/* 
=============================================================================== 
| Copyright (C) 2004 RuanHaiShen, All rights reserved. 
| SUMMARY:  
|   Internal common queue interfaces. 
| 
| DESCRIPTION: 
|   See http://www.01s.org for documentation, latest information, license  
|   and contact details. 
|   email:ruanhaishen@01s.org 
=============================================================================*/ 
#ifndef __QUEUE_H__ 
#define __QUEUE_H__ 
/*===========================================================================*/ 
 
#define __CLR_QB(prio, q) \ 
    if( (prio) < ARCH_CPU_BITS ) \ 
        { q &= ~( 1 << (prio) ); goto __clr_done; } 
#define __CLR_Q(prio, q, a) \ 
    if( (prio) < ( a + 1) * ARCH_CPU_BITS ) \ 
        { q &= ~( 1 << ( (prio) - a * ARCH_CPU_BITS ) ); goto __clr_done; } 
#define __CLR_QE(prio, q, a) \ 
    q &= ~( 1 << ( (prio) - a * ARCH_CPU_BITS ) ) 
     
#define __SET_QB(prio, q) \ 
    if( (prio) < ARCH_CPU_BITS ) \ 
        { q |= ( 1 << (prio) ); goto __set_done; } 
#define __SET_Q(prio, q, a) \ 
    if( (prio) < ( a + 1) * ARCH_CPU_BITS ) \ 
        { q |= ( 1 << ( (prio) - a * ARCH_CPU_BITS ) ); goto __set_done; } 
#define __SET_QE(prio, q, a) \ 
    q |= ( 1 << ( (prio) - a * ARCH_CPU_BITS ) ) 
 
/*------------------------------------------*/ 
#define __GET_Q_8BIT(next, q) \ 
    next = _task_map[q] 
 
#define __GET_Q_POS0(next, q) \ 
    next = _task_map[q & 0xff] 
 
#define __GET_Q_POS(next, q, offset) \ 
    next = _task_map[(q>>offset) & 0xff] 
 
#define __G_ADJUST(next, a, offset) \ 
    next += a * ARCH_CPU_BITS + offset 
 
#define __G_IFGO0(next) \ 
    if(next != 0xff){ goto __get_done;} 
 
#define __G_IFGO(next, a, offset) \ 
    if(next != 0xff){ __G_ADJUST(next,a,offset); goto __get_done;} 
 
/*------------------------------------------*/ 
#if ARCH_CPU_BITS == 64 
#define __GET_QB(next, q) \ 
    __GET_Q_POS0(next, q);   __G_IFGO0(next) \ 
    __GET_Q_POS(next, q, 8); __G_IFGO(next,0, 8) \ 
    __GET_Q_POS(next, q, 16);__G_IFGO(next,0,16) \ 
    __GET_Q_POS(next, q, 24);__G_IFGO(next,0,24) \ 
    __GET_Q_POS(next, q, 32);__G_IFGO(next,0,32) \ 
    __GET_Q_POS(next, q, 40);__G_IFGO(next,0,40) \ 
    __GET_Q_POS(next, q, 48);__G_IFGO(next,0,48) \ 
    __GET_Q_POS(next, q, 56);__G_IFGO(next,0,56) 
#define __GET_Q(next, q, a) \ 
    __GET_Q_POS0(next, q);   __G_IFGO(next,a, 0) \ 
    __GET_Q_POS(next, q, 8); __G_IFGO(next,a, 8) \ 
    __GET_Q_POS(next, q, 16);__G_IFGO(next,a,16) \ 
    __GET_Q_POS(next, q, 24);__G_IFGO(next,a,24) \ 
    __GET_Q_POS(next, q, 32);__G_IFGO(next,a,32) \ 
    __GET_Q_POS(next, q, 40);__G_IFGO(next,a,40) \ 
    __GET_Q_POS(next, q, 48);__G_IFGO(next,a,48) \ 
    __GET_Q_POS(next, q, 56);__G_IFGO(next,a,56) 
#define __GET_QE(next, q, a) \ 
    __GET_Q_POS0(next, q);   __G_IFGO(next,a, 0) \ 
    __GET_Q_POS(next, q, 8); __G_IFGO(next,a, 8) \ 
    __GET_Q_POS(next, q, 16);__G_IFGO(next,a,16) \ 
    __GET_Q_POS(next, q, 24);__G_IFGO(next,a,24) \ 
    __GET_Q_POS(next, q, 32);__G_IFGO(next,a,32) \ 
    __GET_Q_POS(next, q, 40);__G_IFGO(next,a,40) \ 
    __GET_Q_POS(next, q, 48);__G_IFGO(next,a,48) \ 
    __GET_Q_POS(next, q, 56);__G_ADJUST(next,a,56) 
#define __GET_QBE(next, q) \ 
    __GET_Q_POS0(next, q);   __G_IFGO0(next) \ 
    __GET_Q_POS(next, q, 8); __G_IFGO(next,0, 8) \ 
    __GET_Q_POS(next, q, 16);__G_IFGO(next,0,16) \ 
    __GET_Q_POS(next, q, 24);__G_IFGO(next,0,24) \ 
    __GET_Q_POS(next, q, 32);__G_IFGO(next,0,32) \ 
    __GET_Q_POS(next, q, 40);__G_IFGO(next,0,40) \ 
    __GET_Q_POS(next, q, 48);__G_IFGO(next,0,48) \ 
    __GET_Q_POS(next, q, 56);__G_ADJUST(next,0,56) 
     
#elif ARCH_CPU_BITS == 32 
#define __GET_QB(next, q) \ 
    __GET_Q_POS0(next, q);   __G_IFGO0(next) \ 
    __GET_Q_POS(next, q, 8); __G_IFGO(next,0, 8) \ 
    __GET_Q_POS(next, q, 16);__G_IFGO(next,0,16) \ 
    __GET_Q_POS(next, q, 24);__G_IFGO(next,0,24) 
#define __GET_Q(next, q, a) \ 
    __GET_Q_POS0(next, q);   __G_IFGO(next,a, 0) \ 
    __GET_Q_POS(next, q, 8); __G_IFGO(next,a, 8) \ 
    __GET_Q_POS(next, q, 16);__G_IFGO(next,a,16) \ 
    __GET_Q_POS(next, q, 24);__G_IFGO(next,a,24)  
#define __GET_QE(next, q, a) \ 
    __GET_Q_POS0(next, q);   __G_IFGO(next,a, 0) \ 
    __GET_Q_POS(next, q, 8); __G_IFGO(next,a, 8) \ 
    __GET_Q_POS(next, q, 16);__G_IFGO(next,a,16) \ 
    __GET_Q_POS(next, q, 24);__G_ADJUST(next,a,24) 
#define __GET_QBE(next, q) \ 
    __GET_Q_POS0(next, q);   __G_IFGO0(next) \ 
    __GET_Q_POS(next, q, 8); __G_IFGO(next,0, 8) \ 
    __GET_Q_POS(next, q, 16);__G_IFGO(next,0,16) \ 
    __GET_Q_POS(next, q, 24);__G_ADJUST(next,0,24) 
     
#elif ARCH_CPU_BITS == 16 
#define __GET_QB(next, q) \ 
    __GET_Q_POS0(next, q);  __G_IFGO0(next) \ 
    __GET_Q_POS(next, q, 8);__G_IFGO(next,0, 8) 
#define __GET_Q(next, q, a) \ 
    __GET_Q_POS0(next, q);  __G_IFGO(next,a, 0) \ 
    __GET_Q_POS(next, q, 8);__G_IFGO(next,a, 8) 
#define __GET_QE(next, q, a) \ 
    __GET_Q_POS0(next, q);  __G_IFGO(next,a, 0) \ 
    __GET_Q_POS(next, q, 8);__G_ADJUST(next,a, 8) 
#define __GET_QBE(next, q) \ 
    __GET_Q_POS0(next, q);  __G_IFGO0(next) \ 
    __GET_Q_POS(next, q, 8);__G_ADJUST(next,0, 8) 
     
#elif ARCH_CPU_BITS == 8 
#define __GET_QB(next, q) \ 
    __GET_Q_8BIT(next, q);  __G_IFGO0(next) 
#define __GET_Q(next, q, a) \ 
    __GET_Q_8BIT(next, q);  __G_IFGO(next,a, 0) 
#define __GET_QE(next, q, a) \ 
    __GET_Q_8BIT(next, q);  __G_ADJUST(next,a, 0) 
#define __GET_QBE(next, q) \ 
    __GET_Q_8BIT(next, q) 
#endif 
 
/*------------------------------------------*/ 
 
#if TASK_QUE_SIZE == 1 
#define __CLR_ALL(Q)    Q = 0 
#else 
#define __CLR_ALL(Q) \ 
do { \ 
    register uint iii; \ 
    for(iii = 0; iii < TASK_QUE_SIZE; iii++) \ 
        Q[iii] = 0; \ 
} while (0) 
#endif 
 
/*------------------------------------------*/ 
#define __NQB(a)   (__q[a] != Q[a]) 
 
#if TASK_QUE_SIZE == 1 
#define __IF1(Q)          (Q) 
#define __CLR(prio, Q)    Q &= ~(1<<(prio)) 
#define __SET(prio, Q)    Q |= (1<<(prio)) 
#define __GET(next, Q)    __GET_QBE(next, Q) 
#define __SAVEQ(Q)        uint __q = Q 
#define __NQ(Q)           __q != Q 
 
#elif TASK_QUE_SIZE == 2 
#define __IF1(Q)    (Q[0]|Q[1]) 
#define __CLR(prio, Q) \ 
    __CLR_QB(prio, Q[0]) \ 
    __CLR_QE(prio, Q[1],1)  
     
#define __SET(prio, Q) \ 
    __SET_QB(prio, Q[0]) \ 
    __SET_QE(prio, Q[1],1)  
     
#define __GET(next, Q) \ 
    __GET_QB(next, Q[0]) \ 
    __GET_QE(next, Q[1],1)  
 
#define __SAVEQ(Q) \ 
    uint __q[2]; \ 
    __q[0] = Q[0]; \ 
    __q[1] = Q[1] 
     
#define __NQ(Q) \ 
    __q[0] != Q[0] || \ 
    __q[1] != Q[1] 
 
#elif TASK_QUE_SIZE == 3 
#define __IF1(Q)    (Q[0]|Q[1]|Q[2]) 
#define __CLR(prio, Q) \ 
    __CLR_QB(prio, Q[0]) \ 
    __CLR_Q (prio, Q[1],1) \ 
    __CLR_QE(prio,Q[2],2)  
     
#define __SET(prio, Q) \ 
    __SET_QB(prio, Q[0]) \ 
    __SET_Q (prio, Q[1],1) \ 
    __SET_QE(prio, Q[2],2)  
     
#define __GET(next, Q) \ 
    __GET_QB(next, Q[0]) \ 
    __GET_Q (next, Q[1],1) \ 
    __GET_QE(next, Q[2],2)  
 
#define __SAVEQ(Q) \ 
    uint __q[3]; \ 
    __q[0] = Q[0]; \ 
    __q[1] = Q[1]; \ 
    __q[2] = Q[2] 
     
#define __NQ(Q) \ 
    __q[0] != Q[0] || \ 
    __q[1] != Q[1] || \ 
    __q[2] != Q[2] 
    
#elif TASK_QUE_SIZE == 4 
#define __IF1(Q)    (Q[0]|Q[1]|Q[2]|Q[3]) 
#define __CLR(prio, Q) \ 
    __CLR_QB(prio, Q[0]) \ 
    __CLR_Q (prio, Q[1],1) \ 
    __CLR_Q (prio, Q[2],2) \ 
    __CLR_QE(prio,Q[3],3)  
     
#define __SET(prio, Q) \ 
    __SET_QB(prio, Q[0]) \ 
    __SET_Q (prio, Q[1],1) \ 
    __SET_Q (prio, Q[2],2) \ 
    __SET_QE(prio, Q[3],3)  
     
#define __GET(next, Q) \ 
    __GET_QB(next, Q[0]) \ 
    __GET_Q (next, Q[1],1) \ 
    __GET_Q (next, Q[2],2) \ 
    __GET_QE(next, Q[3],3)  
     
#define __SAVEQ(Q) \ 
    uint __q[4]; \ 
    __q[0] = Q[0]; \ 
    __q[1] = Q[1]; \ 
    __q[2] = Q[2]; \ 
    __q[3] = Q[3] 
     
#define __NQ(Q) \ 
    __q[0] != Q[0] || \ 
    __q[1] != Q[1] || \ 
    __q[2] != Q[2] || \ 
    __q[3] != Q[3] 
  
#elif TASK_QUE_SIZE == 5 
#define __IF1(Q)    (Q[0]|Q[1]|Q[2]|Q[3]|Q[4]) 
#define __CLR(prio, Q) \ 
    __CLR_QB(prio, Q[0]) \ 
    __CLR_Q (prio, Q[1],1) \ 
    __CLR_Q (prio, Q[2],2) \ 
    __CLR_Q (prio, Q[3],3) \ 
    __CLR_QE(prio,Q[4],4)  
     
#define __SET(prio, Q) \ 
    __SET_QB(prio, Q[0]) \ 
    __SET_Q (prio, Q[1],1) \ 
    __SET_Q (prio, Q[2],2) \ 
    __SET_Q (prio, Q[3],3) \ 
    __SET_QE(prio, Q[4],4) 
     
#define __GET(next, Q) \ 
    __GET_QB(next, Q[0]) \ 
    __GET_Q (next, Q[1],1) \ 
    __GET_Q (next, Q[2],2) \ 
    __GET_Q (next, Q[3],3) \ 
    __GET_QE(next, Q[4],4)  
     
#define __SAVEQ(Q) \ 
    uint __q[5]; \ 
    __q[0] = Q[0]; \ 
    __q[1] = Q[1]; \ 
    __q[2] = Q[2]; \ 
    __q[3] = Q[3]; \ 
    __q[4] = Q[4] 
     
#define __NQ(Q) \ 
    __q[0] != Q[0] || \ 
    __q[1] != Q[1] || \ 
    __q[2] != Q[2] || \ 
    __q[3] != Q[3] || \ 
    __q[4] != Q[4] 
     
#elif TASK_QUE_SIZE == 6 
#define __IF1(Q)    (Q[0]|Q[1]|Q[2]|Q[3]|Q[4]|Q[5]) 
#define __CLR(prio, Q) \ 
    __CLR_QB(prio, Q[0]) \ 
    __CLR_Q (prio, Q[1],1) \ 
    __CLR_Q (prio, Q[2],2) \ 
    __CLR_Q (prio, Q[3],3) \ 
    __CLR_Q (prio, Q[4],4) \ 
    __CLR_QE(prio,Q[5],5) 
     
#define __SET(prio, Q) \ 
    __SET_QB(prio, Q[0]) \ 
    __SET_Q (prio, Q[1],1) \ 
    __SET_Q (prio, Q[2],2) \ 
    __SET_Q (prio, Q[3],3) \ 
    __SET_Q (prio, Q[4],4) \ 
    __SET_QE(prio, Q[5],5) 
     
#define __GET(next, Q) \ 
    __GET_QB(next, Q[0]) \ 
    __GET_Q (next, Q[1],1) \ 
    __GET_Q (next, Q[2],2) \ 
    __GET_Q (next, Q[3],3) \ 
    __GET_Q (next, Q[4],4) \ 
    __GET_QE(next, Q[5],5) 
     
#define __SAVEQ(Q) \ 
    uint __q[6]; \ 
    __q[0] = Q[0]; \ 
    __q[1] = Q[1]; \ 
    __q[2] = Q[2]; \ 
    __q[3] = Q[3]; \ 
    __q[4] = Q[4]; \ 
    __q[5] = Q[5] 
     
#define __NQ(Q) \ 
    __q[0] != Q[0] || \ 
    __q[1] != Q[1] || \ 
    __q[2] != Q[2] || \ 
    __q[3] != Q[3] || \ 
    __q[4] != Q[4] || \ 
    __q[5] != Q[5] 
  
#elif TASK_QUE_SIZE == 7 
#define __IF1(Q)    (Q[0]|Q[1]|Q[2]|Q[3]|Q[4]|Q[5]|Q[6]) 
#define __CLR(prio, Q) \ 
    __CLR_QB(prio, Q[0]) \ 
    __CLR_Q (prio, Q[1],1) \ 
    __CLR_Q (prio, Q[2],2) \ 
    __CLR_Q (prio, Q[3],3) \ 
    __CLR_Q (prio, Q[4],4) \ 
    __CLR_Q (prio, Q[5],5) \ 
    __CLR_QE(prio,Q[6],6) 
     
#define __SET(prio, Q) \ 
    __SET_QB(prio, Q[0]) \ 
    __SET_Q (prio, Q[1],1) \ 
    __SET_Q (prio, Q[2],2) \ 
    __SET_Q (prio, Q[3],3) \ 
    __SET_Q (prio, Q[4],4) \ 
    __SET_Q (prio, Q[5],5) \ 
    __SET_QE(prio, Q[6],6) 
     
#define __GET(next, Q) \ 
    __GET_QB(next, Q[0]) \ 
    __GET_Q (next, Q[1],1) \ 
    __GET_Q (next, Q[2],2) \ 
    __GET_Q (next, Q[3],3) \ 
    __GET_Q (next, Q[4],4) \ 
    __GET_Q (next, Q[5],5) \ 
    __GET_QE(next, Q[6],6) 
 
#define __SAVEQ(Q) \ 
    uint __q[7]; \ 
    __q[0] = Q[0]; \ 
    __q[1] = Q[1]; \ 
    __q[2] = Q[2]; \ 
    __q[3] = Q[3]; \ 
    __q[4] = Q[4]; \ 
    __q[5] = Q[5]; \ 
    __q[6] = Q[6] 
     
#define __NQ(Q) \ 
    __q[0] != Q[0] || \ 
    __q[1] != Q[1] || \ 
    __q[2] != Q[2] || \ 
    __q[3] != Q[3] || \ 
    __q[4] != Q[4] || \ 
    __q[5] != Q[5] || \ 
    __q[6] != Q[6] 
  
#elif TASK_QUE_SIZE == 8 
#define __IF1(Q)    (Q[0]|Q[1]|Q[2]|Q[3]|Q[4]|Q[5]|Q[6]|Q[7]) 
#define __CLR(prio, Q) \ 
    __CLR_QB(prio, Q[0]) \ 
    __CLR_Q (prio, Q[1],1) \ 
    __CLR_Q (prio, Q[2],2) \ 
    __CLR_Q (prio, Q[3],3) \ 
    __CLR_Q (prio, Q[4],4) \ 
    __CLR_Q (prio, Q[5],5) \ 
    __CLR_Q (prio, Q[6],6) \ 
    __CLR_QE(prio,Q[7],7) 
     
#define __SET(prio, Q) \ 
    __SET_QB(prio, Q[0]) \ 
    __SET_Q (prio, Q[1],1) \ 
    __SET_Q (prio, Q[2],2) \ 
    __SET_Q (prio, Q[3],3) \ 
    __SET_Q (prio, Q[4],4) \ 
    __SET_Q (prio, Q[5],5) \ 
    __SET_Q (prio, Q[6],6) \ 
    __SET_QE(prio, Q[7],7) 
     
#define __GET(next, Q) \ 
    __GET_QB(next, Q[0]) \ 
    __GET_Q (next, Q[1],1) \ 
    __GET_Q (next, Q[2],2) \ 
    __GET_Q (next, Q[3],3) \ 
    __GET_Q (next, Q[4],4) \ 
    __GET_Q (next, Q[5],5) \ 
    __GET_Q (next, Q[6],6) \ 
    __GET_QE(next, Q[7],7) 
 
#define __SAVEQ(Q) \ 
    uint __q[8]; \ 
    __q[0] = Q[0]; \ 
    __q[1] = Q[1]; \ 
    __q[2] = Q[2]; \ 
    __q[3] = Q[3]; \ 
    __q[4] = Q[4]; \ 
    __q[5] = Q[5]; \ 
    __q[6] = Q[6]; \ 
    __q[7] = Q[7] 
     
#define __NQ(Q) \ 
    __q[0] != Q[0] || \ 
    __q[1] != Q[1] || \ 
    __q[2] != Q[2] || \ 
    __q[3] != Q[3] || \ 
    __q[4] != Q[4] || \ 
    __q[5] != Q[5] || \ 
    __q[6] != Q[6] || \ 
    __q[7] != Q[7] 
  
#endif 
 
/*------------------------------------------*/ 
 
#define __queue_init(q) \ 
do { \ 
    __CLR_ALL(q.que); \ 
} while (0) 
 
#if TASK_QUE_SIZE == 1 
# define __queue_remove(q, prio) \ 
do { \ 
    __CLR(prio, q.que); \ 
} while (0) 
 
# define __queue_add(q, prio) \ 
do { \ 
    __SET(prio, q.que); \ 
} while (0) 
 
#else 
# define __queue_remove(q, prio) \ 
do { \ 
    __CLR(prio, q.que); \ 
__clr_done: \ 
    __MPT; \ 
} while (0) 
 
# define __queue_add(q, prio) \ 
do { \ 
    __SET(prio, q.que); \ 
__set_done: \ 
    __MPT; \ 
} while (0) 
 
#endif 
 
#if TASK_QUE_SIZE == 1 && ARCH_CPU_BITS == 8 
# define __queue_get(q, next) \ 
do { \ 
    __GET(next, q.que); \ 
} while (0) 
 
#else 
# define __queue_get(q, next) \ 
do { \ 
    __GET(next, q.que); \ 
__get_done: \ 
    __MPT; \ 
} while (0) 
 
#endif 
 
#define __queue_move(q, from, to) \ 
do { \ 
    __SAVEQ(q.que); \ 
    __queue_remove(q, from); \ 
    if (__NQ(q.que)) { \ 
        __queue_add(q, to); \ 
    } \ 
} while (0) 
 
#define __queue_susremove(q, prio, state) \ 
do { \ 
    __SAVEQ(q.que); \ 
    __queue_remove(q, prio); \ 
    if (__NQ(q.que)) { \ 
        state |= STATE_PREREADY; \ 
    } \ 
} while (0) 
 
#define queue_if1(q)  __IF1(q.que) 
#define queue_if0(q)  (__IF1(q.que) == 0) 
 
 
/*===========================================================================*/ 
#endif