Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
/* 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]);
}
Exemplo n.º 3
0
/*
 *  シリアル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;
}