Ratlosigkeit beim Senden von Array Inhalt

OP #2656640
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
Angehängte Dateien:
Gast
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.
OP
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
Moderator Persönliche Seite
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.
Gast
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

:-)
Gast
> 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.
OP
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
Gast
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
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.