Re: Interrupt zu einem Thread Kategorie: Progr. Assembler, TaskingTools, OS (von Guido - 24.06.2005 12:05) | ||
Als Antwort auf Re: Interrupt zu einem Thread von André H. - 8.11.2004 13:39 | ||
| ||
> Hallo Denis, > > > Versuche gerade eine Multitasking- Steuerung für meine Motoren zu schreiben. > > Schreibe lieber eine Multithreading-Steuerung. > Multitasking kann die CC2 nicht. (Das ist etwas anderes) > > > Dabei wollte ich, da� bei einem Interrupt z.B. am Port P1H.3 der aktuelle Thread anhält > > und ein anderer startet. Das wollte ich in C als Systemroutine im Segment 3 speichern. > > Problem ist, da� ich nicht wei� wie man im C ein thread startet bzw. anhält. > > So gesehen ist es eigentlich nicht möglich. > Denn in mit C- bzw. ASM-Routinen arbeitest Du au�erhalb des Betriebssystems. > Somit kann man normal auch die Threadsteuerung nicht beeinflussen. > > Jedoch gebe es evtl. einen kleinen Dirty Hack: > Und zwar den VM-Code VM-RUN. > Kurz in die Sprungtabellen des OS geschaut: > Diese Routine bedindet sich an Offset 0x669E und dient zur Anpassung > der Threadprioritäten: Prio=0 : Thread steht, Prio=1 bis 255 : Thread läuft. > Um nun diese Routine in Systemroutien zu "mi�brauchen" benötigt man > ein Paar Infos der ötigen Parameter. > > Im Prinzip sind es nur zwei: Thread-Nr. und Thread-Prio. > > Die Thread-Nr. wird in Register R12 übergeben. > Die Nummer 0 bezeichnet den aktuellen Thread, die Nummern 1 bis 255 direkt > die Threads 1 bis 255 > Die Nummer 0 darf nie aus einer Interrupt-Routine übergeben werden, > da hier dann der gerade laufende Thread angesprochen wird, welcher das auch immer ist. > Das Problem könnte u.U. das Herausfinden der Thread-Nr. sein. > Jedoch sollte der Compiler diese von "oben nach unten" mit "1" beginnend durchnummerieren. > Der Thread main hat demnach immer die letzte nummer. > Also sollte ein bi�chen Zählen per Hand ausreichen. ;-) > > Der Zweite Parameter, die Priorität, mu� vor dem Setzen von R12 und Aufruf der Routine > auf den Stack geschoben werden. > > Das Ganze ist jedoch hoch experimentel und noch nicht getestet. > > MfG André H. > Hi, ich wei� dieser Task ist schon etwas älter. Ich frage mich, ob zwischenzeitlich jemand das starten eines Threads über den Auffruf von VM_RUN über Assembler getestet hat? Ich habe eine kleine Interrupt routine geschrieben, die mir den Thread mit der Nummer 1 starten soll: OSsegment EQU 0 PUSH_R12 EQU 075D6H ;uses: R1, R2, R12, R13,R14,R15 VMRUN EQU 0669EH; uses Thread-Nr. in R12 and Thread-Pri auf Stack regdef R0, R1, R2, R3, R4, R5, R6, R7, R12 userseg SECTION CODE word at 30000h assume dpp3:userseg public intRAM intRAM proc far MOV R1, #0FD02h MOV R2, #POF RTN001 MOV [R1], R2 POP R0 POP R0 RETS RTN001: SCXT CP, #0F600h MOV R12,#32 CALLS OSsegment, PUSH_R12 MOV R12,#1 CALLS OSsegment, VMRUN POP CP RETS intRAM endp userseg ENDS END Durch den Aufruf von 0x3:0000h bekomme ich die Addresse der ISR die ich dann über system.hook für PH1.0 registriere. Leider funktioniert das starten des Threads nicht. Ein auslösen des Interrupts verursacht einen Absturz des Programms und die Station befindet sich in einem undefinierten Zustand. Kann es sein, dass die Einsprungadresse von VM_RUN falsch ist? Wo kann ich mir die Einsprungadressen des OSOPT V3.0 anschauen oder wie kann ich diese ermitteln? Ist die disassemblierte Version des OS im Downloadbereich die Version OSOPT V3.0? Hat jemand schon mal einen Thread aus Assembler heraus gestartet? oder sonstwie eine C2 funktion aufgerufen? Vielen Dank für eure Antworten Guido. | ||
Antwort schreiben Antworten: |