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