Forum: Mikrocontroller und Digitale Elektronik Probleme mit mit sprintf unter WinAVR


von Philipp F. (philipp5054)


Lesenswert?

Hallo Leute,
mein anderes Projekt (Nebelmaschine Wiederbelebung) befindet sich noch 
in der Informationsphase.
Bei einem laufenden Projekt habe ich unter WinAVR das Problem das 
"nichts raus kommt".
Included habe ich auch alles bekomme zumindest keine Fehlermeldungen 
beim Compilieren.

Source: (funktioniert nicht)
char test_buffer[50];
int n, a=5, b=3;
n = sprintf(test_buffer, "%d plus %d is %d", a, b, a+b);
usart_write_str(test_buffer);


Source: (funktioniert)
test_buffer[0]='T';
test_buffer[1]='e';
test_buffer[2]='s';
test_buffer[3]='t';
test_buffer[4]=0x00;
usart_write_str(test_buffer);

Der zweite Source Abschnitt ist nur zum Auschlus das es an meiner 
"usart_write_str" Routine scheitert.

Was mache ich falsch? n bleibt 0 und in test_buffer steht nichts drin.

Dank und Gruß

Philipp

von Zerf (Gast)


Lesenswert?

Ich würde Tippen, dass Du gegen eine Library gelinkt hast, in der 
sprintf nur eine Rumpfimplementierung beinhaltet. Der Code sieht richtig 
aus.

Steht in test_buffer[0] nach sprintf ein Nullbyte?

von Philipp F. (philipp5054)


Lesenswert?

>Steht in test_buffer[0] nach sprintf ein Nullbyte?

Ja!

Im Kopf der C Datei: #include <stdio.h>

Wenn ich das ausklammer bekomme ich, wie zu erwarten, auch eine 
Fehlermeldung das die Funktion sprintf nicht bekannt ist.

Was kann ich da tun?

von cyblord (Gast)


Lesenswert?

Unter der aktuellen WinAVR Version funktioniert sprintf zumindest 
rudimentär. benutze es für LCD Ausgabe um z.B. führende Nullen 
darzustellen.
In der WinAVR doku steht einiges zu den Features und das auch nicht die 
komplette funktionalität implementiert ist. Aber dass es zu KEINER 
Ausgabe kommt ist garantiert nicht normal!

gruß cyblord

von Stefan E. (sternst)


Lesenswert?

Philipp F. schrieb:
> habe ich unter WinAVR

Was heißt das genau? Benutzt du irgendeine IDE, die selber ein Makefile 
generiert, oder benutzt du ein eigenes Makefile? Wenn Letzteres, dann 
bitte mal posten.

von Philipp F. (philipp5054)


Lesenswert?

Hallo Zusammen,
ich habe den Fehler nun gefunden.
Das Problem war das ich in einer anderen .c Datei welche ich mit 
Kompillierte mit Globalen Variablen ein wenig übertrieben habe:

unsigned long int uiConv_A_Results[100];
unsigned long int uiConv_B_Results[100];
unsigned long int uiConv_C_Results[100];

Auf nem Atmega88 nachdem ich das auf 10 reduziert habe lief es.
Aber WAAAAAAAARUM zum Teufel warnt der Compiller einen nicht davor?

Dank an alle die Helfen wollten.

Gruß Philipp

von Karl H. (kbuchegg)


Lesenswert?

Philipp F. schrieb:

> Auf nem Atmega88 nachdem ich das auf 10 reduziert habe lief es.
> Aber WAAAAAAAARUM zum Teufel warnt der Compiller einen nicht davor?

Weil der Compiler das gar nicht wissen kann. Er sieht ja immer nur 
Bruchstücke des kompletten Programms

Aber WAAAAAAAARUM zum Teufel schaust du dir die Ausgabe im Build-Fenster 
nicht an? Da steht eine Aufschlüsselung der feststellbaren 
Mindestbelegung der einzelenen Speicherarten. Und bei dir wird dann eben 
drinn stehen, dass du den SRAM zu 458% belegt hast.

von Philipp F. (philipp5054)


Lesenswert?

Folgende Ausgabe kommt beim Kompilieren.
Wo erkenne ich wie wieviel RAM benötigt wird?
1
Creating load file for Flash: main.hex
2
avr-objcopy -O ihex -R .eeprom main.elf main.hex
3
4
Creating load file for EEPROM: main.eep
5
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \
6
  --change-section-lma .eeprom=0 -O ihex main.elf main.eep
7
c:\WinAVR\bin\avr-objcopy.exe: --change-section-lma .eeprom=0x00000000 never used
8
9
Creating Extended Listing: main.lss
10
avr-objdump -h -S main.elf > main.lss
11
12
Creating Symbol Table: main.sym
13
avr-nm -n main.elf > main.sym
14
15
Size after:
16
main.elf  :
17
section            size      addr
18
.data                 8   8388864
19
.text              5926         0
20
.bss                205   8388872
21
.debug_aranges       96         0
22
.debug_pubnames     810         0
23
.debug_info        2351         0
24
.debug_abbrev       980         0
25
.debug_line        1762         0
26
.debug_frame        240         0
27
.debug_str          898         0
28
.debug_loc         1606         0
29
.debug_ranges        48         0
30
Total             14930
31
32
33
34
Errors: none
35
-------- end --------
36
37
38
> Process Exit Code: 0
39
> Time Taken: 00:02

von Krapao (Gast)


Lesenswert?

>> Wo erkenne ich wie wieviel RAM benötigt wird?

Im RAM landet früher oder später:

> section            size
> .data                 8
> .bss                205

Nicht erkennen kannst du hier den Stackbedarf. Den kannst du aber mit 
anderen Methoden ungefähr heraus finden: 
Beitrag "StackViewer (RAM Rechner) für WinAVR"

von Krapao (Gast)


Lesenswert?


von Philipp F. (philipp5054)


Lesenswert?

Vielen Dank. Das empfohlene Tool hat mich begeistert. Vielen Dank

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.