Forum: Mikrocontroller und Digitale Elektronik Multiplikation 16x16 bit mit MSP430


von Fabian (Gast)


Lesenswert?

Hallo zusammen,

ich benutze einen MSP430F2274, welcher über keinen Hardware-Multiplier 
verfügt. Die Software programmiere ich mit IAR in C.
Nun zu meiner Frage: Die Multiplikation in C ist simpel, auch der 
Assembler-Code erscheint mir logisch. Dort wird nämlich ein eine 
Subroutine zur 16 Bit Multiplikation aufgerufen. Kann mir jemand sagen, 
warum die angesprochene Operation nur ca. 20 Zyklen (mit einem 
Oszilloskop gemessen) dauert? Gemäss Debugging-Vorgang sollten weit mehr 
Zyklen für die Berechnung benötigt werden... Wo liegt mein 
(Überlegungs-) Fehler?

Danke für eure Hilfe!!

Gruss
Fabian

von Katzeklo (Gast)


Lesenswert?

Du solltest etwas mehr zu deinem Debugging-Vorgang sagen.

von jens (Gast)


Lesenswert?

Die 16*16 Bit Software Multiplikation geht abhängig von der Operanden 
verschieden schnell.
0000h * 0000h = 00000000h geht in 11 Takten
FFFFh * FFFFh = FFFE0001h braucht 123 Takte

von Fabian (Gast)


Lesenswert?

An jens:

Danke für deine Information. Kannst du mir noch sagen, wie du die Anzahl 
Takte berechnet bzw. woher du die Angaben hast?

von Lars (Gast)


Lesenswert?

is hier gut erklärt, und nen quellcode gibbet auch noch dazu:
http://focus.ti.com/general/docs/techdocsabstract.tsp?abstractName=slaa329

von jens (Gast)


Lesenswert?

Hallo Fabian,

hier mein Quellcode. Die Taktzyklenanzahl hab ich vom Simulator.

#define     OP1     R4
#define     OP2     R5
#define     OP2H    R6
#define     ACL     R7
#define     ACH     R8

            ASEG    0F000h
RESET       mov.w   #300h,SP                ; Initialize stackpointer

Main        mov     #13,OP1
            mov     #12345,OP2
            call    #MPYU
            jmp     Main
;----------------------------------------------------------------------- 
--
; MSP430 16*16 Bit Multiplikation
; Zyklen abhängig von OP1: (ohne call und ret)
; MPY       17..133
; MAC       15..131
; MPYU      11..123
; MACU       9..121
MPY         clr     ACL           ; ACH,ACL = OP1 * OP2  mit Vorzeichen
            clr     ACH
MAC         tst     OP1           ; ACH,ACL += OP1 * OP2  mit Vorzeichen
            jge     mpy_m1
            sub     OP2,ACH
mpy_m1      tst     OP2
            jge     MACU
            sub     OP1,ACH
            jmp     MACU
MPYU        clr     ACL           ; ACH,ACL = OP1 * OP2  ohne Vorzeichen
            clr     ACH
MACU        clr     OP2H          ; ACH,ACL += OP1 * OP2  ohne 
Vorzeichen
            clrc
            jmp     mpy_m4
mpy_m2      add     OP2,ACL
            addc    OP2H,ACH
mpy_m3      rla     OP2
            rlc     OP2H
mpy_m4      rrc     OP1
            jc      mpy_m2
            jnz     mpy_m3
            ret
;----------------------------------------------------------------------- 
--
            ASEG    0FFFEh
            DW      RESET
            END

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.