Forum: Compiler & IDEs Ratlosigkeit beim Senden von Array Inhalt


von Pier S. (bigpier)


Angehängte Dateien:

Lesenswert?

Hallo Leute,
ich bin schon wider mit meinem Latein am Ende.
Etwas in meinen Augen Idioten sicheres Programm will einfach nicht 
klappen.
Ich Sende über die Uart mit einer for Schleife einmal denn 
Schleifenzähler und einmal denn Array  Inhalt.
Der Schleifenzähler kommt jedes mal richtig an hingegen der Array 
Inhalt nur bis Position 5, der Rest Zufall Zahlen.
Ich verstehe einfach nicht was ich falsch mache.

Danke für Eure Unterstützung

Peter

von Krapao (Gast)


Lesenswert?

SUART.c:

>static u8 srx_in;
>static u8 srx_out;
>...
>void uputchar( u8 c )        // transmit byte
>{
>  u8 i = stx_in;
>
>  ROLLOVER( i, STX_SIZE );
>  stx_buff[stx_in] = ~c;     // complement for stop bit after data
>  while( i == vu8(stx_out)); // until at least one byte free
>                             // stx_out modified by interrupt !
>  stx_in = i;
>}

Ich würde zuerst den Abschnitt Interruptfeste Programmierung im 
Artikel Interrupt im Code implementieren. Moderne AVR-GCC sind 
optimierfreudiger als ältere Versionen und was früher ging, kann heute 
haken.

Konkret: Die gemeinsam von IRQ-Code und IRQ-Code benutzten Variablen 
srx_in und srx_out volatile kennzeichnen und den nicht 
unterbrechbaren Block (quasi die komplette Funktion) atomar.

Wenn es dann immer noch hakt, dann hilft's nix und man muss sich in die 
Fremdlibrary "Software UART with FIFO, using T1" von Peter Dannegger 
reinfuxen.

von Krapao (Gast)


Lesenswert?

> srx_in und /srx_out/
Es sind natürlich stx_in und stx_out gemeint, sorry.

von Pier S. (bigpier)


Lesenswert?

Danke für deine Antwort was ich aber nicht verstehe warum kommt die 
Variable i immer richtig an und der Array Inhalt nicht ?
1
for ( i=0;i<15;i++)
2
        {
3
          uputchar(i);
4
          uputchar(arraytest[i]);
5
        }

Gruß
Peter

von Pier S. (bigpier)


Lesenswert?

Auch Strings kann ich problemlos 100mal hintereinander senden ohne denn 
kleinsten Fehler.
Ich bin einfach ratlos!

Ich hoffe es kann mir jemand helfen.

Gruß

Peter

von hp-freund (Gast)


Lesenswert?

ATTiny26?
Bist Du sicher das das alles in 128 Byte RAM passt?
Vielleicht sind deine Zufallszahlen schon der Stackinhalt...

von Pier S. (bigpier)


Lesenswert?

Ja eigentlich bin ich sicher nach dem copillieren mein das Avr Studio 
Folgendes

Device: attiny26
    Program:    1684 bytes (82.2% Full)
    (.text + .data + .bootloader)
    Data:        109 bytes (85.2% Full)
    (.data + .bss + .noinit)

Sollte also passen?

Gruß

Peter

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Pier S. schrieb:
> Ja eigentlich bin ich sicher nach dem copillieren mein das Avr Studio
> Folgendes
>
> Device: attiny26
>     Program:    1684 bytes (82.2% Full)
>     (.text + .data + .bootloader)
>     Data:        109 bytes (85.2% Full)
>     (.data + .bss + .noinit)
>
> Sollte also passen?

Nein, passt höchstwahrscheinlich nicht, denn da bleiben nur 19 Bytes für 
den Stack übrig. Allein schon, wenn Du eine Funktion mit mehreren 
Argumenten aufrufst oder eine Funktion mehrere lokale Variablen 
verwendet, wirds sofort krachen.

von Pier S. (bigpier)


Lesenswert?

Wie viel muß frei bleiben um auf Nummer sicher zu gehen?

Gruß

Peter

von Krapao (Gast)


Lesenswert?

Hmm, 128 Bytes...

Der Sendepuffer der Library hat 20, der Empfangspuffer 15, static Vars 
8,... abzüglich .data und .bss sind noch mickrige 19 Bytes RAM frei. Das 
ist ein heisser Tipp von hp-freund!

>Autor: hp-freund
>ATTiny26?
>Bist Du sicher das das alles in 128 Byte RAM passt?
>Vielleicht sind deine Zufallszahlen schon der Stackinhalt...

#if defined(_AVR_ATtiny26_)
//#warning "Attiny26"
#endif

:-)

von Krapao (Gast)


Lesenswert?

> Wie viel muß frei bleiben um auf Nummer sicher zu gehen?

Mindestens so viel, dass alle PUSH register in den ISRs (13-15! Bytes) 
plus die lokalen Variablen plus Rücksprungadressen (2 Bytes pro 
Tiefenschritt) Platz auf dem Stack haben.

von Pier S. (bigpier)


Lesenswert?

Das finde ich jetzt SCHADE um nicht BESCHEIDEN zu sagen!!!

Leider war ich der Meinung das ich die Anzeige des Speichers voll 
ausnutzen kann.
Dummheit schützt vor Strafe nicht!!!!

Da werde ich meinen Plan nochmal überarbeiten müssen!

Danke und Gruß
Peter

von Jackfritt (Gast)


Lesenswert?

Gib's da keine Möglichkeit das einen der Compiler oder sowas drauf 
hinweisst. Mich würde nich wundern wenn ich alles nächstes in diese 
Falle tappe.
 Gruß
Jörg

von Karl H. (kbuchegg)


Lesenswert?

Jackfritt schrieb:
> Gib's da keine Möglichkeit das einen der Compiler oder sowas drauf
> hinweisst.

Tut das System doch im Rahmen seiner Möglichkeiten.
82% bei 128 Bytes Speicher insgesamt ist nun mal schon sehr hoch.

> Mich würde nich wundern wenn ich alles nächstes in diese
> Falle tappe.

Das Mitdenken auf Maschinen abzuwälzen hat noch nie funktioniert.

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.