Vorneweg: Mein "Problem" ist "neugieriger Natur", da ich in aller Regel
in Verbindung mit Mikrocontrollern ein eigenes printf (mit
Festkommaausgabe) anstelle eines kompletten printf aus der libc
verwende.
Allerdings habe ich dazu dennoch eine Frage, weil es im Bekanntenkreis
darum ging, wie man es bewerkstelligt, dennoch ein printf der libc (oder
evtl. der libc_nano, dann ohne Gleitkomma) in Verbindung mit STM32
verwenden kann.
Bedingungen:
- Compiler: arm-none-eabi-gcc
- Library: libopencm3
- Programm wird gegen libc gelinkt
- eigene Software zur Ausgabe eines einzelnen Zeichens über uart
- Controller: STM32F103 (allerdings logischerweise gleiches Verhalten
bei STM32F0 und STM32F4)
Folgendes (funktionsfähiges) Testprogramm:
1 | #include <libopencm3.h>
|
2 |
|
3 | #include <stdint.h>
|
4 | #include <string.h>
|
5 | #include <math.h>
|
6 |
|
7 | // zwingend fuer Verwendung von "printf" notwendig
|
8 | #include <errno.h>
|
9 | #include <stdio.h>
|
10 | #include <unistd.h>
|
11 |
|
12 | #include "sysf103_init.h"
|
13 | #include "uart.h"
|
14 |
|
15 |
|
16 | #define BAUDRATE 19200
|
17 |
|
18 | int _write(int file, char *ptr, int len)
|
19 | {
|
20 | int i;
|
21 |
|
22 | if (file == STDOUT_FILENO || file == STDERR_FILENO)
|
23 | {
|
24 | for (i = 0; i < len; i++)
|
25 | {
|
26 | uart_putchar(ptr[i]);
|
27 | }
|
28 | return i;
|
29 | }
|
30 | errno = EIO;
|
31 | return -1;
|
32 | }
|
33 |
|
34 | /* --------------------------------------------------------
|
35 | main
|
36 | -------------------------------------------------------- */
|
37 | int main(void)
|
38 | {
|
39 | uint8_t count;
|
40 | double sw, wi;
|
41 |
|
42 | sys_init();
|
43 |
|
44 | uart_init(BAUDRATE);
|
45 |
|
46 | wi= 45.0;
|
47 |
|
48 | sw= sin(wi * M_PI / 180.0);
|
49 |
|
50 | printf("\n\r-------------------------------------\n\n\r");
|
51 | printf("STM32F103C8T6 / %luMHz - %dBd 8N1\n\r", rcc_ahb_frequency/1000000, BAUDRATE);
|
52 | printf(" Februar 2020 R. Seelig \n\n\r");
|
53 | printf(" APB = %lu MHz\n\r", rcc_apb1_frequency/1000000);
|
54 | printf(" AHB = %lu MHz\n\r", rcc_ahb_frequency/1000000);
|
55 | printf("\n\r-------------------------------------\n\n\r");
|
56 |
|
57 | printf("Sinus von %.2f= %.4f\n\r", wi, sw);
|
58 | wi= 341234.123 * 12432.48;
|
59 | printf("Egebnis einer Rechnung: %3.4f\n\n\r", wi);
|
60 |
|
61 | printf("Ein einfacher Integer Zaehler\n\r" );
|
62 | printf("-------------------------------------\n\r");
|
63 | count= 0;
|
64 | while(1)
|
65 | {
|
66 | printf(" count= %d \r",count);
|
67 | fflush(stdout); // wichtig, da printf den Stream erst mit einem \n abschickt
|
68 | count++;
|
69 | delay(1000);
|
70 | }
|
71 | }
|
Meine Frage bezieht sich hier auf Zeile 66 und 67.
printf schreibt seine Ausgaben in einen Puffer und schickt diesen Puffer
erst bei Eintreffen eines newline "\n" Zeichens ab. Möchte ich jetzt
aber ganz bewußt kein newline schicken (damit bspw. eine Ausgabe immer
in derselben Zeile erfolgt) muß ich zwingend den Puffer mit einem
fflush(stdout) leeren.
Das finde ich (für mich) etwas unschön, denn ich hätte es gerne, dass
genau das was printf ausgeben soll sofort ausgegeben wird und nicht erst
dann, wenn ein "\n" Zeichen eintrifft.
Natürlich könnte ich jetzt in einem Timerinterrupt perodisch ein
fflush(stdio) abschicken, aber das empfinde ich noch etwas unschöner.
Gibt es hier eine Lösung um auf das fflush verzichten zu können?