Согласен, если время обработки программы критично. Кстати, обработчики прерываний именно так и пишут, как сказал SM. В прочих вещах позволяют себе приятности. Пример витьеватости изложения сути(+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено новичок123 24 ноября 2003 г. 22:06
В ответ на: И программа у меня вид обретает свой окончательный (+) отправлено SМ 24 ноября 2003 г. 22:00


pid_t async_int(int irq) {
pid_t status = 0;
int nothing;
struct dev_entry *dev;
unsigned char iir;
unsigned char lsr;
unsigned char msr;

while(1) {
nothing = 1;
for(dev = dev_list[irq]; dev != 0; dev = dev->link) {
if(dev->iobase == 0)
continue;
iir = inp(dev->iobase+2);
if((iir & 0x01) != 0)
continue;
/*
* Interrupt pending
*/
nothing = 0;
iir &= 7;
if(iir == 4) {
/*
* Input Interrupt
*/
while(1) {
status |= (*tti) (inp(dev->iobase), dev->tty, tti_ds);
++dev->rx_count;
lsr = inp(dev->iobase+5);
status |= process_lsr(dev, lsr);
if((lsr & 0x01) == 0) {
test_tx(dev, lsr);
break;
}
}
}
else if(iir == 2) {
/*
* Output Interrupt
*/
dev->tx_pending = 0;
status |= tto(dev, dev->obuf);
++dev->tx_count;
}
else if(iir == 0) {
/*
* Modem change
*/
msr = inp(dev->iobase+6);
dev->modem_status = (dev->modem_status & 0x0F) | (msr & 0xF0);

if(dev->mode & MODE_PKT) /* Special mode for custom hardware */
status |= (*tti) (RCV_PKT_SPECIAL, dev->tty, tti_ds);

if((msr & 0x08) != 0 && (dev->mode & MODE_NOHUP) == 0) {
if(msr & 0x80) {
status |= (*tti) (RCV_CARRIER, dev->tty, tti_ds);
Trace1( _TRACE_DEV_SER_CARRIER, _TRACE_EXPECTED, dev->iobase );
}
else {
status |= (*tti) (RCV_HNGUP, dev->tty, tti_ds);
Trace1( _TRACE_DEV_SER_HUP, _TRACE_EXPECTED, dev->iobase );
}
}

if(dev->mode & MODE_SPLIT) {
if(msr & 0x01) {
/*
* Require "ONLY" CTS for hardware flow control
*/
if(msr & 0x10)
status |= (*tti) (RCV_HW_ON, dev->tty, tti_ds);
else
status |= (*tti) (RCV_HW_OFF, dev->tty, tti_ds);
}
}
else {
if(msr & 0x03) {
/*
* Require "BOTH" DSR and CTS to be on
* before we will transmit in HFLOW mode
*/
if((msr & 0x30) == 0x30)
status |= (*tti) (RCV_HW_ON, dev->tty, tti_ds);
else
status |= (*tti) (RCV_HW_OFF, dev->tty, tti_ds);
}
}
}
else {
/*
* Line status change
*/
lsr = inp(dev->iobase+5);
status |= process_lsr(dev, lsr);
test_tx(dev, lsr);
}
}
if(nothing)
break;
}
return(status);
}
#pragma on (check_stack);


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru