async_test for test
This is about asynchronous uart output.
When I need to debug my software in a ISR or a task(thread), I worried that printf() might cause some abnormal result.
So, I made my uart output function like printf().
Initialize async_print
title
void timerfunction_async_print() { char c=0; while ( buffer_async_print.available() ) { buffer_async_print.dequeue(&c); pc.putc(c); } timer_async_print.attach(&timerfunction_async_print, 0.1); } void async_print(const char *format, ...) { va_list args; va_start(args, format); vsnprintf(debug_line, sizeof(debug_line), format, args); int length = strlen(debug_line); for (int i=0; i<length; i++) buffer_async_print.queue(debug_line[i]); va_end(args); } int main() { ..................................................... // Initialize AsyncPrint timer_async_print.attach(&timerfunction_async_print, 0.1); p_async_print = &async_print; ..................................................... }
Implementation async_print
void (*p_async_print)(const char *format, ...); void UART0_Handler() { p_async_print("IRQ : UART_IT_FLAG_RXI \r\n"); uart_irq(UART_0, 0); }
main.cpp@0:51977f75213d, 2015-07-13 (annotated)
- Committer:
- SteveKim
- Date:
- Mon Jul 13 04:38:28 2015 +0000
- Revision:
- 0:51977f75213d
async_print for test
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
SteveKim | 0:51977f75213d | 1 | #include "mbed.h" |
SteveKim | 0:51977f75213d | 2 | #include "CBuffer.h" |
SteveKim | 0:51977f75213d | 3 | #include <stdarg.h> |
SteveKim | 0:51977f75213d | 4 | |
SteveKim | 0:51977f75213d | 5 | DigitalOut led1(LED1); |
SteveKim | 0:51977f75213d | 6 | DigitalOut led4(LED4); |
SteveKim | 0:51977f75213d | 7 | |
SteveKim | 0:51977f75213d | 8 | RawSerial pc(USBTX, USBRX); // tx, rx |
SteveKim | 0:51977f75213d | 9 | |
SteveKim | 0:51977f75213d | 10 | //////////////////////////////////////////////////////////////////////////////////////////////// |
SteveKim | 0:51977f75213d | 11 | // mbed Async Debug Print |
SteveKim | 0:51977f75213d | 12 | Timeout timer_async_print; |
SteveKim | 0:51977f75213d | 13 | CircBuffer<char> buffer_async_print(1024); |
SteveKim | 0:51977f75213d | 14 | static char debug_line[64]; |
SteveKim | 0:51977f75213d | 15 | |
SteveKim | 0:51977f75213d | 16 | void timerfunction_async_print() |
SteveKim | 0:51977f75213d | 17 | { |
SteveKim | 0:51977f75213d | 18 | char c=0; |
SteveKim | 0:51977f75213d | 19 | |
SteveKim | 0:51977f75213d | 20 | while ( buffer_async_print.available() ) { |
SteveKim | 0:51977f75213d | 21 | buffer_async_print.dequeue(&c); |
SteveKim | 0:51977f75213d | 22 | pc.putc(c); |
SteveKim | 0:51977f75213d | 23 | } |
SteveKim | 0:51977f75213d | 24 | timer_async_print.attach(&timerfunction_async_print, 0.1); |
SteveKim | 0:51977f75213d | 25 | } |
SteveKim | 0:51977f75213d | 26 | |
SteveKim | 0:51977f75213d | 27 | void async_print(const char *format, ...) |
SteveKim | 0:51977f75213d | 28 | { |
SteveKim | 0:51977f75213d | 29 | va_list args; |
SteveKim | 0:51977f75213d | 30 | |
SteveKim | 0:51977f75213d | 31 | va_start(args, format); |
SteveKim | 0:51977f75213d | 32 | |
SteveKim | 0:51977f75213d | 33 | vsnprintf(debug_line, sizeof(debug_line), format, args); |
SteveKim | 0:51977f75213d | 34 | int length = strlen(debug_line); |
SteveKim | 0:51977f75213d | 35 | |
SteveKim | 0:51977f75213d | 36 | for (int i=0; i<length; i++) |
SteveKim | 0:51977f75213d | 37 | buffer_async_print.queue(debug_line[i]); |
SteveKim | 0:51977f75213d | 38 | |
SteveKim | 0:51977f75213d | 39 | va_end(args); |
SteveKim | 0:51977f75213d | 40 | } |
SteveKim | 0:51977f75213d | 41 | |
SteveKim | 0:51977f75213d | 42 | extern void (*p_async_print)(const char *format, ...); |
SteveKim | 0:51977f75213d | 43 | //////////////////////////////////////////////////////////////////////////////////////////////// |
SteveKim | 0:51977f75213d | 44 | |
SteveKim | 0:51977f75213d | 45 | |
SteveKim | 0:51977f75213d | 46 | extern int rx_irq_counter; |
SteveKim | 0:51977f75213d | 47 | void pc_recv() |
SteveKim | 0:51977f75213d | 48 | { |
SteveKim | 0:51977f75213d | 49 | led4 = !led4; |
SteveKim | 0:51977f75213d | 50 | while(pc.readable()) { |
SteveKim | 0:51977f75213d | 51 | pc.printf("RECV [%c]\r\n", pc.getc()); |
SteveKim | 0:51977f75213d | 52 | } |
SteveKim | 0:51977f75213d | 53 | } |
SteveKim | 0:51977f75213d | 54 | |
SteveKim | 0:51977f75213d | 55 | int main() |
SteveKim | 0:51977f75213d | 56 | { |
SteveKim | 0:51977f75213d | 57 | for (int i=0; i<20; i++) |
SteveKim | 0:51977f75213d | 58 | { |
SteveKim | 0:51977f75213d | 59 | led1 = !led1; |
SteveKim | 0:51977f75213d | 60 | led4 = !led4; |
SteveKim | 0:51977f75213d | 61 | wait(0.05); |
SteveKim | 0:51977f75213d | 62 | } |
SteveKim | 0:51977f75213d | 63 | |
SteveKim | 0:51977f75213d | 64 | // Initialize AsyncPrint |
SteveKim | 0:51977f75213d | 65 | timer_async_print.attach(&timerfunction_async_print, 0.1); |
SteveKim | 0:51977f75213d | 66 | p_async_print = &async_print; |
SteveKim | 0:51977f75213d | 67 | |
SteveKim | 0:51977f75213d | 68 | pc.baud(115200); |
SteveKim | 0:51977f75213d | 69 | pc.printf("AsyncPrint Test. \r\n"); |
SteveKim | 0:51977f75213d | 70 | |
SteveKim | 0:51977f75213d | 71 | pc.attach(&pc_recv, Serial::RxIrq); |
SteveKim | 0:51977f75213d | 72 | |
SteveKim | 0:51977f75213d | 73 | while(1) { |
SteveKim | 0:51977f75213d | 74 | wait(1); |
SteveKim | 0:51977f75213d | 75 | } |
SteveKim | 0:51977f75213d | 76 | } |
SteveKim | 0:51977f75213d | 77 |