在ucosii4skyeye-v1.8.4的at91_usart.c中,
void at91_uart_get_char( char *ch )
{
unsigned long status;
long tmp;
start_rx( usarts[0], ch, 1 );
do
{
// must read 0xfffff100, status register to clear all flags !!!
这两行好象可以不用吧,我在skyeye0.6.8中测试,去掉是可以的,因为这个似乎是轮询方式,而不是中断吧。而且在中断的do_irq中读IVR时候由于是边沿触发中断,因该是自动清理了的。不太明白。在serial.c中好象是按中断方式处理的
_io_read( (long*)0xfffff100, &tmp );
_io_read( (long*)0xfffff108, &tmp );
status = usarts[0]->rcr;
}
while (status > 0);
}