Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

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
Ich nutze:
C-Control II Station, OSOPT V3.0
> 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: