Re: Assembler einbinden Kategorie: Programmierung (von André H. - 7.05.2006 22:04) | ||
Als Antwort auf Assembler einbinden von Erich - 2.05.2006 13:37 | ||
| ||
Hallo Erich, > da es mir ein Rätsel ist, was es mit diesem "Offset" bei den interrupt-Routinen auf sich hat, bitte ich > euch um Rat. "Offset" ist einfach die Einsprungadresse an der die Routine liegt. Der Zulässige Wert ist 0 bis 65534. (nur gerade Werte) Der nächste Parameter ist das Segment, in dem die Interrupt-System-Routine liegt. I.d.R. sind die Segmente 1, 2 und 3 möglich. Allerdings kann man kleine Routinen auch im RAM ablegen und von dort ausführen. Einerseits im MCU-RAM in Segment 0, andererseits auch im SRAM, welches Segment 8 darstellt. > Wie komme ich auf die Adresse einer Variable, damit ich sie in einer Assembler-Routine > inkrementieren kann? Wenn Du nur eine Variable inkrementieren willst, ist es reichlich umständlich, dafür eine extra Interruptroutine zu schreiben. Zumal das OS dies bereits integriert hat. Mit ports.getcount() kannst Du ganz bequem einzeln die vier Counter-Ports auslesen: int counter; counter=counter+ports.getcount(0); // Counter 0 Abfragen (P1H.0) Was die Parameterübergabe angeht, so ist die einfachste Möglichkeit die über den Rechenstack. Dazu gibt es ein kleines Bsp. unter "Assembler". Alternativ kannst Du Dir dazu z.B. den Quellcode von den Systemtreibern sys0001 und sys0002 ansehen. Etwas anders sieht es aber bei interruptroutinen aus. Hier benutzt Du am besten freie Bereiche des Bit-Adressierbaren Bereichs des Controller-internen RAMs. Der Bereich 0xFD01 bis 0xFDFD (Segment 0) kann problemlos genutzt werden. Mit den VM-Codes VM_STORE_ABSOLUE_INT und VM_LOAD_ABSOLUTE_INT kann darauf problemlos aus C2 heraus zugegriffen werden. (genauso sind auch Byte-und und Long-Zugriffe mit den entspr. VM-Codes möglich. Bei allen Zugriffen, au�er Byte, mu� die Speicheradresse geradzahlig sein.) function readFD02() returns int { inline vmcodes.VM_LOAD_ABSOLUTE_INT; inline 0xFD02; } function writeFD02(int value) { inline vmcodes.VM_STORE_ABSOLUTE_INT; inline 0xFD02; } Es gibt noch einen Bereich mit 100 Byte, welcher aber für Flash Schreib-und Leseoperationen genutzt wird. Somit auch vom Modul flash.c2 . Darum gehe ich auf diesen Bereich nicht näher ein. > Wie schaffe ich mehr als nur eine Interrupt-Assembler-Routine? Indem Du einfach mehrere Routinen schreibst und sie mit system.hook() an die verschiedenen Events hängst. > Dass man das > mischen muss ist ja wirklich eine Schwäche am ganzen C-Control-System. Sollte man vielleicht einen > anderen Controller wählen? Ich bin etwas verzweifelt, muss ich sagen. Also genau das ist eher eine Stärke, als eine Schwäche. Da� Du das siehst kann ich beim besten Willen nicht nachvollziehen. Das beste wird wohl sein, da� Du zu aller erst das Handbuch zur Hand nimmst, und die Kapitel 1 bis 4 liest. Das Hauptproblem, was ich immer wieder erlebe, ist einfach das, da� immer wieder die Leute weigern Handbücher zu lesen, oder diese wenigstens zum Nachschlagen zu benutzen. Es geht eben nicht, da� man den Controller einfach anschlie�t und ein bi�chen irgendetwas schreibt und schon funzt alles, ohne vorher die Grundlagen anzueignen. Wenn jemand dazu nicht bereit ist, braucht er sich mit µController erst garnicht zu beschäftigen MfG André H. Antworten bitte nur ins Forum! Fragen per EMail auf Forum-Postings werden nicht beantwortet! Das macht meine Heizung gerade | ||
Antwort schreiben Antworten: |