Forum: Mikrocontroller und Digitale Elektronik #include <stdio.h>


von Florian D. (fdsurfer)


Lesenswert?

Hallo,

ich versuche gerade in Atmel Studio 6.1 einen AVR32 mit FreeRTOS zu 
programmieren.
Bei einer Ausgabe auf das Display möchte ich diesen Code verwenden:
1
#include <stdio.h>
2
3
float gf_value = 0.5;
4
unsigned int gui_value = 10;
5
6
void display_printf_string(const char *format, ...)
7
{
8
  va_list arg;
9
  char string[30];
10
  unsigned char i=0;
11
12
  
13
  va_start(arg, format);
14
  
15
gpio_set_pin_high(SIG_LED4); //Zu Debug zwecken, wird noch erreicht!
16
17
  i = vsprintf(string, format, arg);
18
19
gpio_set_pin_high(SIG_LED2); //Zu Debug zwecken, wird NICHT mehr erreicht!
20
21
  while (i < sizeof(string) - 1) string[i++] = '\0';
22
  va_end(arg);
23
  DISPLAY_RS_DATA;
24
  spi_selectChip(DISPLAY_SPI, DISPLAY_NPCS);
25
  /* for all chars in string */
26
  i = 0;
27
  while(string[i]!='\0')
28
  {
29
    /* Send byte */
30
    spi_write(DISPLAY_SPI, string[i]);
31
    delay_us(40);
32
    /* go to next char */
33
34
    i++;
35
  }
36
  spi_unselectChip(DISPLAY_SPI, DISPLAY_NPCS);
37
38
}
39
40
void other_function1(void)
41
{
42
   display_printf_string("Wert: %6d     ", gui_value);
43
}
44
45
void other_function2(void)
46
{
47
   display_printf_string("Wert: %6.2f     ", gf_value);
48
}

Mein Problem ist, dass dieser Code mit aufruf der ersten other_function1 
bestens funktioniert.
Bei aufruf mit einem float, other_function2 bleibt der uC bei der Zeile 
mit
1
  i = vsprintf(string, format, arg);

stehen.

Ich habe festgestellt, dass wenn ich mit Rechtsklick auf die #include 
<stdio.h> klicke und dort auf "Go implementation" lande ich in der stdio 
aus
C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR32 
GCC\Native\3.4.2.1002\avr32-gnu-toolchain\avr32\include\stdio.h
wenn ich allerdings auf den vsprintf ein "go implementation" ausführe 
lande ich in
C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 
GCC\Native\3.4.2.1002\avr8-gnu-toolchain\avr\include\stdio.h
Damit wird auf einem 32Bitter ein 8Bitter Code ausgeführt, was natürlich 
ehr nicht so gut geht.

Hat wer eine Idee wo man das einstellt welchen Pfad der Compiler 
benutzt?
In meinen Projekteinstellungen habe ich nur unter Toolchain/Commen was 
gefunden. Aber da sind die richtigen Pfade drin!
Beim #include zeigt er ja auch den richtigen File an. Aber woher hat er 
denn dann den vom AVR8?

In Beispielsprogrammen aus ASF geht es ja auch... Ich finde den 
Menüpunkt einfach nicht.

Danke

von Ich (Gast)


Lesenswert?

>   va_start(arg, format);
>   gpio_set_pin_high(SIG_LED2);
>
> gpio_set_pin_high(SIG_LED4); //Zu Debug zwecken, wird noch erreicht!
>
>   i = vsprintf(string, format, arg);
>
> gpio_set_pin_high(SIG_LED2); //Zu Debug zwecken, wird NICHT mehr
> erreicht!
>

Das letze gpio_set_pin_high soll was bewirken wenn 6 Zeilen weiter oben 
das gleiche schon mal steht?

Außerdem:
Code bitte mit den emtsprechenen Tags versehen (siehe Formatierung, über 
dem Namens eingabefeld) dann hat man zumindest eine Chance den Code auch 
zu lesen....
Ist das überhaupt der Code, der Probleme macht oder nur eine Art 
Zusammenfassung der deiner meinung nach wichtigsten Codeteile??

von DirkB (Gast)


Lesenswert?

Dann schau doch mal, ob das erste stdio.h nicht das Zweite einbindet.

von Florian D. (fdsurfer)


Lesenswert?

Hallo,

ich konnte mitlerweile durch ein Update auf die Studio Version 6.2 
(vielleicht auch nur die Neuinstallation der Umgebung?) das include 
Problem lösen. Es werden jetzt nur noch Code von der AVR32 Umgebung 
aufgerufen.
Allerdings sobald ich die Funktion mit float aufrufe, bleibt der 
Controller stehn. Mit aufruf mit integer läufts...

Kann mir jemand helfen?

Danke

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.