大家好,小弟最近在写UART发送中断的时候遇到问题。
用的是ADI的芯片,直接用寄存器进行操作。看了它的UART例程,用的是TX buffer empty中断。TX是一个8位寄存器。部分程序如下:
void IRQ_Handler(void) __irq
{
//UART中断内容,当TX空后产生中断,并给Main一个标识
unsigned long ucCOMIID0 = 0;
if ((IRQSTATUS & BIT11) == BIT11) //UART interrupt source
ucCOMIID0 = COMIID0; // read interrupt state
if ((ucCOMIID0 & 0x2) == 0x2) // Transmit buffer empty
{
ucTxBufferEmpty = 1;
}
}
main()
{
// 前面的一些配置内容省略,下面是将一串字节通过UART发送的程序
for ( i = 0 ; i < nLen ; i++ )
{
COMTX = a[i];
while (ucTxBufferEmpty ==0);
ucTxBufferEmpty = 0;
}
}
假设a是一个多字节的数组。
我的理解是每当把a的一个字节内容放到TX后,TX就开始发送到终端。当TX中的8位数据都发出去后,就产生一个中断,并把标识给Main,让它将第二个字节的内容赋给TX。这样就把几个字节的数据发出去了。我试验过,确实可行。
(1)我的理解是否正确?
但是我现在做的项目中,发现问题还是出现在UART发送的速度问题上。
一个同事建议我不要用while (ucTxBufferEmpty ==0);等待数据发完,再发一个字节,说这样耗时多。
说用读写指针的方法,如果读指针与写指针不在同一位置时,就继续发送。
(2)我不知道这个算不算环形缓冲区的作法? 这样真能提高UART的发送速度吗?
(3)我觉得TX就是一个8位的寄存器。发送数据的话,总是一个字节发完,再发一个字节的,我不清楚为什么他说的那个方法能够提高效率。
上述3个问题,还请各位大侠指点一二,小弟不胜感激! |