#include #include typedef struct { const char *data; } UART; #define START_ASYNC static int state = 0; switch (state) { case 0: #define WAIT state = __LINE__; return; case __LINE__: #define END_ASYNC } int data_available(UART *in) { return *in->data != '\0' && rand() % 5 == 0; } char read_byte(UART *in) { return *in->data++; } int ready_for_sending(UART *out) { return rand() % 5 == 0; } void write_byte(UART *out, char ch) { printf("%c", ch); } void echo_infinite(UART *in, UART *out) { while (1) { while (!data_available(in)) { // wait } char ch; ch = read_byte(in); while (!ready_for_sending(out)) { // wait } write_byte(out, ch); } } void echo_state_machine(UART *in, UART *out) { static char ch; static int state = 0; switch (state) { case 0: if (data_available(in)) { ch = read_byte(in); state = 1; } break; case 1: if (ready_for_sending(out)) { write_byte(out, ch); state = 0; } break; } } void echo_async(UART *in, UART *out) { START_ASYNC while (1) { while (!data_available(in)) { WAIT } static char ch; ch = read_byte(in); while (!ready_for_sending(out)) { WAIT } write_byte(out, ch); } END_ASYNC } int main(int argc, char *argv[]) { int seed = 0; if (argc > 1) seed = atoi(argv[1]); if (seed == 0) seed = 1; srand(seed); UART in; UART out; printf("function: echo_state_machine\n----\n"); in.data = "Hello World!\n"; for (int i = 0; i < 100; i++) echo_state_machine(&in, &out); printf("-----\n\n"); printf("function: echo_async\n----\n"); in.data = "Hello World!\n"; for (int i = 0; i < 100; i++) echo_async(&in, &out); printf("-----\n\n"); printf("function: echo_infinite\n----\n"); in.data = "Hello World!\n"; echo_infinite(&in, &out); printf("-----\n\n"); return 0; }