Packet* pqueue_pop(PQueue* queue) { Packet* tmp = pqueue_head(queue); assert (pqueue_length(queue) > 0); queue->head++; queue->length--; queue->head = PMOD(queue->head, queue->maxsize); return tmp; }
/* Applies a function to every packet in the queue */ void pqueue_map(PQueue* queue, void (*fn)(Packet*) ) { int i = queue->head; int last = (queue->head + queue->length - 1) % queue->maxsize; if (pqueue_empty(queue)) return; while( i != last ) { fn(&queue->packets[i]); i = PMOD(i+1, queue->maxsize); } if (pqueue_length(queue) > 1) fn(&queue->packets[last]); }
/* * シリアルI/Oポートのオープン */ SIOPCB * sio_opn_por(ID siopid, VP_INT exinf) { SIOPCB * siopcb = GET_SIOPCB(siopid); siopcb->exinf = exinf; switch(SIO_TYP(siopcb->flags)) { case SIO_TYP_M32RUART: /* UART初期化 */ sil_wrb_mem((void *)(SIOCR(siopcb->port)+3), 0); /* ポートを開く(UART0) */ sil_wrb_mem((void *)PDATA(5), 0); sil_wrb_mem((void *)PDIR(5), 0x80); /* UART, Non-parity, 1 stop-bit */ sil_wrb_mem((void *)(SIOMOD0(siopcb->port)+3), 0); /* 8bit, internal clock */ sil_wrh_mem((void *)(SIOMOD1(siopcb->port)+2), 0x0800); /* M32R(32102) - f(BLK)=16MHzで115200bps */ sil_wrh_mem((void *)(SIOBAUR(siopcb->port)+2), SERIAL_CLKDIV); sil_wrb_mem((void *)(SIORBAUR(siopcb->port)+3), SERIAL_CLKCMP); /* 送受信割込み発生許可 */ sil_wrh_mem((void *)(SIOTRCR(siopcb->port)+2), 0x0006); /* ステータスクリア, 送受信動作開始 */ sil_wrb_mem((void *)(SIOCR(siopcb->port)+2), 0x3); sil_wrb_mem((void *)(SIOCR(siopcb->port)+3), 0x3); /* 受信割込み受付許可 */ sil_wrh_mem((void *)(ICUCR(SIO,siopcb->port)+2), 0x1000); sil_wrh_mem((void *)(ICUCR(SIO,siopcb->port)+6), 0x1000); /* TxD,RxDピン有効(UART0) */ sil_wrh_mem((void *)PMOD(5), 0x5500); break; } return siopcb; }