Hi Leutz,
kann mir hier jemand helfen?
Ich habe auf dem LPC2148 ein kleines retarget-system aufgesetzt, a la'
1 | FILE *fp_uart0=0;
|
2 | FILE *fp_uart1=0;
|
3 |
|
4 | // initialises UART0 and gives a handle back
|
5 | fp_uart0 = th_fopen("uart0", "rw");
|
6 | if(!(fp_uart0)) return(-1); // leave main if NULL-Pointer!
|
7 |
|
8 | // initialises UART1 and gives a handle back
|
9 | fp_uart1 = th_fopen("uart1", "rw");
|
10 | if(!(fp_uart1)) return(-1); // leave main if NULL-Pointer!
|
was auch so weit funktioniert.
Damit kann ich dann
1 | fprintf(fp_uart0, "text");
|
verwenden, da die fputc das eigendliche retargeting übernimmt und die
fprintf den pointer scheinbar nur durchreicht:
1 | int fputc(int c, FILE *f)
|
2 | {
|
3 | f->functionpointer(c);
|
4 | return(c);
|
5 | }
|
Entweder habe ich die Funktionsweise des pointers stdout nicht
verstanden, oder aber hier liegt was anderes im argen:
1 | // Set up stdout
|
2 | stdout = th_fopen("uart0", "rw");
|
3 | if(!(stdout)) return(-1); // leave main if NULL-Pointer!
|
Das funktioniert nicht,
error: #137: expression must be a modifiable lvalue
aber
1 | fprintf(stdout, "text");
|
funktioniert, bzw.
1 | stdout->functionpointer=u0_putchar;
|
funktioniert auch ...
Die stdio im Keil/ARM-Compiler erstellt FILE als Typ von __FILE, was man
dann selbst den eigenen Wünschen nach implementieren kann.
1 | struct __FILE
|
2 | {
|
3 | int handle;
|
4 | // Add whatever you want here
|
5 | int (*functionpointer)(int);
|
6 | };
|
Weiss hier jemand Rat?
Eigendlich wollte ich weiterhin die fopen verwenden, und eine _sys_open
implementieren. Leider schimpft der linker, trotz Implementierung der
_sys_open, dass ich die nicht geschrieben hätte...
Leider findet man diesbezüglich auch nur recht spärlich Informationen im
Netz...
Greetz,
/th.