An RTOS-friendly Serial interface Its primary benefit is that it never hogs the CPU. An amusing alternative to the traditional ring-bufferd interrupt-serviced systems, it uses short mbed-rtos queues to buffer characters to and from the UART, and a thread to service the transmitter. Short interrupt service routines enqueue received characters and signal the transmit thread when the transmitter is available. WARNING: Do not create RTOS-Serial objects before the RTOS is running! Put them inside your main() block or another function, not in the global initialization.
Dependents: Test_RDM880_rfid_reader
Diff: rtos_serial.cpp
- Revision:
- 14:33d60e4eb215
- Parent:
- 13:2fb32235253c
- Child:
- 15:5f38a747ba08
diff -r 2fb32235253c -r 33d60e4eb215 rtos_serial.cpp --- a/rtos_serial.cpp Thu Oct 24 18:25:14 2013 +0000 +++ b/rtos_serial.cpp Thu Oct 24 20:31:25 2013 +0000 @@ -73,6 +73,8 @@ int RTOS_Serial::get_baud() { return _baud; } +//int RTOS_Serial::writeable() { return true; } //FIXME: implement + int RTOS_Serial::putc(int c) { //return Serial::putc(c); //DEBUG //if (tx_q.put((int *)c, osWaitForever) == osOK) return c; else return EOF; @@ -100,12 +102,16 @@ return RawSerial::putc(c); } -int RTOS_Serial::getc() { +//int RTOS_Serial::readable() { return true; } //FIXME: implement + +int RTOS_Serial::getc(int timeout) { int rv; //return Serial::getc(); //FIXME: stand-in, which fails if we use our RX ISR - osEvent evt = rx_q.get(); + osEvent evt = rx_q.get(timeout); if (evt.status == osEventMessage) { rv = (int) evt.value.v; + } else if (evt.status == osOK) { + rv = EOF; } else { //FIXME: find appropriate error reporting if any std::printf("\r\nRTOS_Serial::getc() evt.status %d\n", evt.status); rv = EOF;