PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : interrupt und RAM Positionen



Zapo.
20.08.2007, 00:04
hi,

habe hier bei einem relativen großen Programm ein Problem.

leider äußert sich der Fehler immer anders so das ich ihn nur relativ schlecht beschreiben könnte ohne das ganze Programm zu erklären.

definitiv hat dies aber mit dem Timer1 zu tun den ich bei einem M32 verwende um in eine SUB zu springen

meine Frage lautet: wenn der Sprung erfolgt, muß man dann den Befehl

disable interrupts und am schluß der SUB dann wieder enable interrupts verwenden?
oder kann man diese enabled lassen?
und ist die Position der Variablendeklaration beliebig oder sollte man sich da an eine bestimmt Reihenfolge halten (schreibt man z.B. auch alle Byte, Integer und Bits zusammen oder ist das prinzipell egal?)
----
kurze Fehlerbeschreibung zu der Auswirkung auf meinem Grafikdisplay:
einmal hatte ich ein Byte aus dem ERAM ausgelesen und in eine Variable im RAM geschrieben, funktionierte auch bis nach einer gewissen Zeit, dann stand anstelle einer einzelnen Ziffer eine 4-stellige Zahl auf dem Display.
ich hatte verschiedene Teile im Programm umgeschrieben und auch die Position der deklarieren Variablen (also die Zeilen mit: Dim x as byte.. usw.) verschoben. Nun hatte ich z.B. den Effekt das nachdem einstellen des Datums dieses zwar kurzzeitig korrekt angezeigt wurde, die aber wiederrum auf eine unerklärlich zustandekommende Zahl eingestellt wurde.... Datum lautet dann z.B. 33.32.09 Uhrzeit: 33:32:09)

wäre sehr dankbar für kompetene Antworten!

Zapo.

Vitis
20.08.2007, 01:12
Hi Zapo,
ich kenne das Problem auch, es tritt gern bei großen Programmen mit zig Variablen auf. Meist hilft es schon die Werte für sw-stack framesize und hw-stack zu erhöhen ...

zu den Interrupts, also wenn ich dich recht verstanden habe springst du im Interrupt innerhalb der ISR in eine subprozedur. Die wird, da ja die ISR noch nicht verlassen wurde ergo noch in der Interruptroutine ausgeführt, so als würde der Code in eben der ISR drin stehen. Wenn das so sein soll, dann kannste die enable disable- Geschichte sein lassen.

Zapo.
20.08.2007, 21:05
hi,

also des mit dem Stack hab ich auch schon probiert, steht momentan auf:
hwstack = 80
swstack = 80
framesize = 120

allerdings muß ich zugeben das ich nicht genau weiß in welchen maße man diese Werte erhöhen sollte! kann mir da mal jemand genauer erklären falls es mit diesem Problem zu tun hat?

während eines Interrupt springe ich nicht mehr in eine weitere SUB Routine. ich war nur der meinung, das ich evt. den Timer und oder die Interrupts global disablen sollte sobald der Sprung erfolgt ist und dann wieder eingeschaltet werden muß sobald die Prozedur abgearbeitet ist und die SUB am ende ist.

Christian

linux_80
20.08.2007, 21:45
Hallo,

zu den grössen gibts im Wiki einen Artikel:
https://www.roboternetz.de/wissen/index.php/Bascom_Inside

Wegen dem IRQ sperren/freigeben: Wenn eine ISR aufgerufen wird, sind die sowieso gesperrt, also muss man die nicht extra selber disablen.
Eine ISR sollte nur so knapp wie möglich sein, damit sie schnell abgearbeitet werden kann, das aufrufen einer Sub kommt da nicht so gut.

Zapo.
20.08.2007, 22:09
okay, danke...wußte nicht das die dann sowieso gesperrt sind wenn die ISR aufgerufen wird...

und wie gesagt, während die SUB des IRQs läuft springe ich nicht, wird nur ein zähler hochgezählt und beim erreichen eines bestimmten integer wertes der I2c Bus ausgelesen.

danke schonmal....
ich probiers mal weiter und lese mir nochmal den Artikel durch...