Unerklärliches Phänomen mit Sub-Routine

OP #572285
Lesenswert?
• ▲
▼
Hallo an Alle,

Ich hab dein Unterprogramm:
1
Sub Auswertung()
2
  Local Daten_word As Word
3
  Local K As Byte , L As Byte , M As Byte
4

5
  For M = 1 To 8
6
    L = M * 2
7
    K = L - 1
8
    Daten_word = B2m(rfdata(m))
9
    Rfdata_enc(k) = Daten_word
10
    Rotate Daten_word , Right , 8
11
    Rfdata_enc(l) = Daten_word
12
    Print
13
  Next
14
End Sub

Dieses Unterprogramm gibt mir Rätsel auf. Es läuft genau 6x ohne 
Probleme durch und ab dem 7. Mal spinnt es. Und zwar wird ab dem 7. Mal 
die for-Schleife nur 2x ausgeführt. Warum auch immer.

Hat irgendwer schon ähnliches erlebt? Was kann da sein?

Danke, Andy
OP #572308
Lesenswert?
• ▲
▼
Ja, "dein" sollte "da ein" heißen gg

Nein, rfdata() wird byval aufgerufen. Was ich jetzt aber herausgefunden 
haben: Wenn ich anstatt "Print" "Print m" schreibe funktionierts 
einwandfrei! Auch nach dem 7. Mal. Natürlich könnte ich jetzt sagen: 
Problem gelöst, aber ich würde gern wissen, warum das so ist?

Kann es sein, dass Bascom hier pfuscht??


THX Andy
Gast #572404
Lesenswert?
• ▲
▼
locale datenstellen werden auf den stapelspeicher abgelegt wenn du den 
zu klein eingestellt hast kommen manchmal solche effekte zustande.

$hwstack = 32                                               ' default 
use 32 for the hardware stack
$swstack = 10                                               ' default 
use 10 for the SW stack
$framesize = 40                                             ' default 
use 40 for the frame space
#573137
Lesenswert?
• ▲
▼
Rahul Der trollige wrote:
> Irgendwie stelle ich gerade gewisse Ähnlichkeiten zwischen Bascom und
> ASM: Man muß sich um den Stack kümmern.

Nö, muß man bei ASM und auch beim AVR-GCC überhaupt nicht.

Der Stack liegt oben, die globalen Daten legt man unten ab.
Und schon isses total wurscht, wie groß der eine oder andere Bereich 
ist.
Sie müssen nur zusammen in den SRAM passen.


In Bascom ist die Lage aber bedeutend kritischer, da ja mindestens 4 
verschiedene Bereiche angelegt werden.
Es wird also sehr oft passieren, daß in einem Bereich noch massig Luft 
ist und dafür ein anderer überläuft.
Man kriegt also Probleme, weit bevor der SRAM voll ist.

Warum man daher so einen Unsinn macht, kann ich nicht nachvollziehen.


Peter

Gast #574598
Lesenswert?
• ▲
▼
>Nö, muß man bei ASM und auch beim AVR-GCC überhaupt nicht.

>Der Stack liegt oben, die globalen Daten legt man unten ab.
>Und schon isses total wurscht, wie groß der eine oder andere Bereich
>ist.
>Sie müssen nur zusammen in den SRAM passen.

Das ist bei Bascom nicht anders, die Daten liegen unten und der Stack 
oben. Es gibt bei Bascom nur mehrere Stacks und die kann man in der 
Simulation prüfen lassen, ob da irgendeiner überläuft.

@Andreas
Der Stack muß nur groß genug gewählt werden, dann läuft da nichts über. 
Lies mal in der Hilfe über den Stack, da steht alles drin.

Gruß
Klaus
#574608
Lesenswert?
• ▲
▼
Klaus wrote:

> Das ist bei Bascom nicht anders, die Daten liegen unten und der Stack
> oben. Es gibt bei Bascom nur mehrere Stacks und die kann man in der
> Simulation prüfen lassen, ob da irgendeiner überläuft.


Genau das ist ja der entscheidende Unterschied, Bascom hat 3 Stacks, 
Assembler oder AVR-GCC aber nur einen.

Wie man das durch Simulation lösen soll, erklär mir mal.

Wie soll man denn Reaktionen von externen Schaltungen simulieren ?

Auch kannst Du nicht alle möglichen Ablaufvarianten testen (wann schlägt 
welcher Interrupt zu).


Peter
Gast #574633
Lesenswert?
• ▲
▼
Hallo Peter,

da hast du ja Recht. Bei deinem Stack ist es aber nicht anders, wenn der 
zu klein gewählt ist, du kannst ja auch nicht alle Ablaufvarianten 
testen. Externe Schaltungen und Interrupts kann man schon bis zu einem 
gewissen Grad simululieren. Wenn die Software sich ungewöhnlich verhält, 
dann werden die Stacks eben etwas erhöht. Ok, ich verlier ein paar Bytes 
gegenüber Assembler oder C, aber so dramatisch ist das wohl nicht, 
zumindestens nicht im Hobbybereich.

Gruß
Klaus
Gast #575007
Lesenswert?
• ▲
▼
Den Stack zu überwachen ist eigentlich nichts kompliziertes.

1) Einfach bei der µC Initialisierung den RAM mit einem Füllmuster 
beschreiben.
   zb (0xCAFE)
2) zur Laufzeit immer wieder überprüfen ob die letzten Stackbytes noch 
mit dem Füllmuster gefüllt sind. ==> zb Pin XY = Low bei Stack ok; High 
bei Stack voll
3) sind auch die letzten Bytes des zugeteilten Stacks überschrieben dann 
muss der Stack vergrößert werden.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.