[Milkymist-devel] UART driver
Sébastien Bourdeauducq
sebastien.bourdeauducq at lekernel.net
Sun Nov 29 14:42:27 PST 2009
Hi,
It seems you are always busy-waiting on the UART interrupt in the Linux driver
(with code such as "while(!(lm32_irq_pending() & (1 << IRQ_UARTTX)))")
This is a bad idea since it locks up the CPU every time the UART is
transmitting.
For a more efficient solution, you can use a "CTS" (Clear To Send) state
variable as follows:
* Transmission of a character
If CTS=1: send the character to the HW, set CTS=0
If CTS=0: put the character into a software FIFO (I guess Linux does that by
default)
* TX interrupt handler (IRQ is sent by the HW as soon as transmission is done)
If the software FIFO is empty, set CTS=1
If the software FIFO is not empty, pull a character from it and send it to the
HW
This algorithm of course requires locking (i.e. mask the UART interrupt during
the "character transmission" routine).
For an example implementation, check out:
http://github.com/lekernel/milkymist/blob/master/software/libbase/uart-async.c
Can you implement this method in Linux to improve CPU efficiency?
Thanks,
Sébastien
More information about the Devel
mailing list