eprintf mit irq
eprintf.c@3:de07cab9fc01, 2011-07-21 (annotated)
- Committer:
- est2fe
- Date:
- Thu Jul 21 07:26:22 2011 +0000
- Revision:
- 3:de07cab9fc01
- Parent:
- 2:f63032cc0c0a
- Child:
- 4:5138a20c4989
V0.31
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
est2fe | 3:de07cab9fc01 | 1 | #ifndef __EPRINTF_C__ |
est2fe | 3:de07cab9fc01 | 2 | #define __EPRINTF_C__ |
est2fe | 2:f63032cc0c0a | 3 | |
est2fe | 0:4843fcdba3cc | 4 | #include "eprintf.h" |
est2fe | 0:4843fcdba3cc | 5 | |
est2fe | 2:f63032cc0c0a | 6 | static int eprintf_fehlerzaehler = 0; |
est2fe | 2:f63032cc0c0a | 7 | |
est2fe | 2:f63032cc0c0a | 8 | void TX_irq_eprintf (void) { |
est2fe | 2:f63032cc0c0a | 9 | // Wird bei Tx-Empty oder explizit aufgerufen |
est2fe | 2:f63032cc0c0a | 10 | os.SetEvent (EV_EPRINTF, TASK_EPRINTF_ID); |
est2fe | 2:f63032cc0c0a | 11 | return; |
est2fe | 0:4843fcdba3cc | 12 | } |
est2fe | 1:50fdadc001ef | 13 | |
est2fe | 2:f63032cc0c0a | 14 | int eprintf (char *format_str, ...) { |
est2fe | 2:f63032cc0c0a | 15 | // Soll in den Printbuffer drucken, aber nur, wenn er nicht voll ist. |
est2fe | 2:f63032cc0c0a | 16 | // Returnwert: |
est2fe | 2:f63032cc0c0a | 17 | // 0 = ok |
est2fe | 2:f63032cc0c0a | 18 | // !0 = Fehler -> siehe defines |
est2fe | 2:f63032cc0c0a | 19 | int zeit; |
est2fe | 2:f63032cc0c0a | 20 | int letzter_Fehler = 0; |
est2fe | 2:f63032cc0c0a | 21 | Timer tout; |
est2fe | 2:f63032cc0c0a | 22 | tout.reset(); |
est2fe | 2:f63032cc0c0a | 23 | tout.start(); |
est2fe | 2:f63032cc0c0a | 24 | while (os.TestResource (RESOURCE_EPRINTF)) |
est2fe | 2:f63032cc0c0a | 25 | { |
est2fe | 2:f63032cc0c0a | 26 | // warten bis Resource (eprintf selber) wieder frei ist. |
est2fe | 2:f63032cc0c0a | 27 | zeit = tout.read_us(); |
est2fe | 2:f63032cc0c0a | 28 | if (zeit > TO_LockResource) |
est2fe | 2:f63032cc0c0a | 29 | { |
est2fe | 2:f63032cc0c0a | 30 | // Timeout |
est2fe | 2:f63032cc0c0a | 31 | letzter_Fehler = FEHLER_EPRINTF_TEST_RESOURCE; |
est2fe | 2:f63032cc0c0a | 32 | //eprintf ("\n\rletzer_Fehler = %d, in Zeile %d", letzter_Fehler, __LINE__); |
est2fe | 2:f63032cc0c0a | 33 | goto eprintf_end_fehler; |
est2fe | 2:f63032cc0c0a | 34 | } |
est2fe | 2:f63032cc0c0a | 35 | else |
est2fe | 2:f63032cc0c0a | 36 | { |
est2fe | 2:f63032cc0c0a | 37 | // warten |
est2fe | 2:f63032cc0c0a | 38 | } |
est2fe | 2:f63032cc0c0a | 39 | } |
est2fe | 2:f63032cc0c0a | 40 | tout.reset (); |
est2fe | 2:f63032cc0c0a | 41 | tout.start (); |
est2fe | 2:f63032cc0c0a | 42 | while (!os.LockResource (RESOURCE_EPRINTF)) |
est2fe | 2:f63032cc0c0a | 43 | { |
est2fe | 2:f63032cc0c0a | 44 | // warten bis Resource gelockt ist |
est2fe | 2:f63032cc0c0a | 45 | zeit = tout.read_us (); |
est2fe | 2:f63032cc0c0a | 46 | if (zeit > TO_LockResource) |
est2fe | 2:f63032cc0c0a | 47 | { |
est2fe | 2:f63032cc0c0a | 48 | // Timeout |
est2fe | 2:f63032cc0c0a | 49 | letzter_Fehler = FEHLER_EPRINTF_LOCK_RESOURCE; |
est2fe | 2:f63032cc0c0a | 50 | //eprintf ("\n\rletzer_Fehler = %d, in Zeile %d", letzter_Fehler, __LINE__); |
est2fe | 2:f63032cc0c0a | 51 | goto eprintf_end_fehler; |
est2fe | 2:f63032cc0c0a | 52 | } |
est2fe | 2:f63032cc0c0a | 53 | else |
est2fe | 2:f63032cc0c0a | 54 | { |
est2fe | 2:f63032cc0c0a | 55 | // warten |
est2fe | 2:f63032cc0c0a | 56 | } |
est2fe | 2:f63032cc0c0a | 57 | } |
est2fe | 2:f63032cc0c0a | 58 | if ((printbuf->flags & FAST_VOLL)) |
est2fe | 2:f63032cc0c0a | 59 | { |
est2fe | 2:f63032cc0c0a | 60 | // Wenn der Stecker raus ist, laeuft der Buffer voll -> nichts mehr drucken! |
est2fe | 2:f63032cc0c0a | 61 | letzter_Fehler = FEHLER_EPRINTF_FAST_VOLL; |
est2fe | 2:f63032cc0c0a | 62 | goto eprintf_end_fehler; |
est2fe | 2:f63032cc0c0a | 63 | } |
est2fe | 2:f63032cc0c0a | 64 | else |
est2fe | 2:f63032cc0c0a | 65 | { |
est2fe | 2:f63032cc0c0a | 66 | int slen; // Stringlaenge |
est2fe | 2:f63032cc0c0a | 67 | va_list args; |
est2fe | 2:f63032cc0c0a | 68 | va_start (args, format_str); // Zeiger auf die "..." |
est2fe | 2:f63032cc0c0a | 69 | vsnprintf (cb, (SB_GROESSE - 1), format_str, args); |
est2fe | 2:f63032cc0c0a | 70 | va_end (args); |
est2fe | 2:f63032cc0c0a | 71 | // Jetzt den Inhalt vom Spoolbuffer (cb) noch in den printbuffer packen |
est2fe | 2:f63032cc0c0a | 72 | slen = strlen (cb); |
est2fe | 2:f63032cc0c0a | 73 | if (slen > (printbuf->buflen - printbuf->bufcnt - 2)) |
est2fe | 2:f63032cc0c0a | 74 | { |
est2fe | 2:f63032cc0c0a | 75 | // wenn es nicht reinpasst, gleich mit Fehler zurück |
est2fe | 2:f63032cc0c0a | 76 | letzter_Fehler = FEHLER_EPRINTF_STRING_ZU_GROSS; |
est2fe | 2:f63032cc0c0a | 77 | goto eprintf_end_fehler; |
est2fe | 2:f63032cc0c0a | 78 | } |
est2fe | 2:f63032cc0c0a | 79 | else |
est2fe | 2:f63032cc0c0a | 80 | { |
est2fe | 2:f63032cc0c0a | 81 | // es passt rein, also jedes Zeichen von cb in den Printbuffer |
est2fe | 2:f63032cc0c0a | 82 | int i; void *fehler; |
est2fe | 2:f63032cc0c0a | 83 | for (i = 0; i < slen; i++) |
est2fe | 2:f63032cc0c0a | 84 | { |
est2fe | 2:f63032cc0c0a | 85 | // rbuf_put (kbdbuf, &c) |
est2fe | 2:f63032cc0c0a | 86 | fehler = rbuf_put (printbuf, &cb[i]); |
est2fe | 2:f63032cc0c0a | 87 | if (!fehler) |
est2fe | 2:f63032cc0c0a | 88 | { // Fehler aufgetreten, warum auch immer! |
est2fe | 2:f63032cc0c0a | 89 | // Sollte eigentlich nie vorkommen! |
est2fe | 2:f63032cc0c0a | 90 | letzter_Fehler = FEHLER_EPRINTF_RBUF_PUT; |
est2fe | 2:f63032cc0c0a | 91 | goto eprintf_end_fehler; |
est2fe | 2:f63032cc0c0a | 92 | } |
est2fe | 2:f63032cc0c0a | 93 | } |
est2fe | 2:f63032cc0c0a | 94 | // Fertig! Nun noch melden, dass neue druckbare Zeichen |
est2fe | 2:f63032cc0c0a | 95 | // da sind und per Interrupt ausgegeben werden koennen. |
est2fe | 2:f63032cc0c0a | 96 | os.SetEvent (EV_EPRINTF, TASK_EPRINTF_ID); |
est2fe | 2:f63032cc0c0a | 97 | } |
est2fe | 2:f63032cc0c0a | 98 | } |
est2fe | 2:f63032cc0c0a | 99 | os.FreeResource (RESOURCE_EPRINTF); |
est2fe | 2:f63032cc0c0a | 100 | TX_irq_eprintf (); // Und das erste Zeichen, falls möglich, gleich ausgeben |
est2fe | 2:f63032cc0c0a | 101 | return 0; // 0 = kein Fehler |
est2fe | 1:50fdadc001ef | 102 | |
est2fe | 2:f63032cc0c0a | 103 | eprintf_end_fehler: |
est2fe | 2:f63032cc0c0a | 104 | eprintf_fehlerzaehler++; |
est2fe | 2:f63032cc0c0a | 105 | os.FreeResource (RESOURCE_EPRINTF); |
est2fe | 2:f63032cc0c0a | 106 | return letzter_Fehler; // Mit Fehler zurück |
est2fe | 2:f63032cc0c0a | 107 | } |
est2fe | 2:f63032cc0c0a | 108 | void task_eprintf_verarbeitung (void) { |
est2fe | 2:f63032cc0c0a | 109 | // Grundsaetzlich gilt: Immer nur per os warten, wenn es nichts zu tun gibt! |
est2fe | 2:f63032cc0c0a | 110 | while (1) |
est2fe | 0:4843fcdba3cc | 111 | { |
est2fe | 2:f63032cc0c0a | 112 | eprintf_wait_event: // Bruch der Schleife while (printbuf->bufcnt > 0) |
est2fe | 2:f63032cc0c0a | 113 | os.WaitEvent (EV_EPRINTF); |
est2fe | 2:f63032cc0c0a | 114 | while ((printbuf->bufcnt > 0) && (pc.writeable ())) |
est2fe | 2:f63032cc0c0a | 115 | { |
est2fe | 2:f63032cc0c0a | 116 | // So lange was ausgeben bis nicht mehr moeglich |
est2fe | 2:f63032cc0c0a | 117 | int c; |
est2fe | 2:f63032cc0c0a | 118 | void *z; |
est2fe | 2:f63032cc0c0a | 119 | z = rbuf_get (printbuf, &c); |
est2fe | 2:f63032cc0c0a | 120 | if (z == 0) |
est2fe | 2:f63032cc0c0a | 121 | { |
est2fe | 2:f63032cc0c0a | 122 | // wenn Buffer leer, per os warten |
est2fe | 2:f63032cc0c0a | 123 | goto eprintf_wait_event; |
est2fe | 2:f63032cc0c0a | 124 | } |
est2fe | 2:f63032cc0c0a | 125 | else |
est2fe | 2:f63032cc0c0a | 126 | { |
est2fe | 2:f63032cc0c0a | 127 | pc.putc (c); // Das sollte die einzige Stelle im Programm sein, wo was auf den pc ausgegeben wird! |
est2fe | 2:f63032cc0c0a | 128 | } |
est2fe | 2:f63032cc0c0a | 129 | } // von while ((printbuf->bufcnt > 0) && (pc.writeable ())) |
est2fe | 2:f63032cc0c0a | 130 | } // von while (1) |
est2fe | 2:f63032cc0c0a | 131 | } // void task_eprintf_verarbeitung (void) |
est2fe | 0:4843fcdba3cc | 132 | |
est2fe | 2:f63032cc0c0a | 133 | #endif // von #ifdef __EPRINTF_C__ |