Forum: Mikrocontroller und Digitale Elektronik MSP430 - Hardware Multiplier


von Paul E. (paul_e)


Lesenswert?

Hello,
Ich habe ein Problem mit meinem header files in Verbindung mit ASM. Mein 
1611 ist einer von nicht vielen kleinen MSP430 die einen Hardware 
Multiplizierer haben, der funktioniert auch, muss bis jetzt aber immer 
die Adressen selber zusammen suchen also z.B. asm( " MOV.W 
&0x013Ah,R15\n" ); um das Ergebniss  zu lesen.
Gibt es einen Weg das auchasm( " MOV.W   RESLO,R15\n"); funktionieren 
könnte?

Gruß
eac


Auszug msp430f1611.h
1
/************************************************************
2
* HARDWARE MULTIPLIER
3
************************************************************/
4
#define __MSP430_HAS_MPY__            /* Definition to show that Module is available */
5
6
#define MPY_                  0x0130    /* Multiply Unsigned/Operand 1 */
7
sfrw(MPY, MPY_);
8
#define MPYS_                 0x0132    /* Multiply Signed/Operand 1 */
9
sfrw(MPYS, MPYS_);
10
#define MAC_                  0x0134    /* Multiply Unsigned and Accumulate/Operand 1 */
11
sfrw(MAC, MAC_);
12
#define MACS_                 0x0136    /* Multiply Signed and Accumulate/Operand 1 */
13
sfrw(MACS, MACS_);
14
#define OP2_                  0x0138    /* Operand 2 */
15
sfrw(OP2, OP2_);
16
#define RESLO_                0x013A    /* Result Low Word */
17
sfrw(RESLO, RESLO_);
18
#define RESHI_                0x013C    /* Result High Word */
19
sfrw(RESHI, RESHI_);
20
#define SUMEXT_               0x013E    /* Sum Extend */
21
const_sfrw(SUMEXT, SUMEXT_);

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Der von Dir verwendete C-Compiler nutzt den Hardwaremultiplizierer nicht 
selbst mit einer geeigneten Arithmetiklibrary?

Warum schreibst Du in Inline-Assembler-Syntax, wenn Du --anscheinend-- 
doch in C programmieren willst?

von Christian R. (supachris)


Lesenswert?

Selbst wenn der MUL nicht vom C-Compiler direkt genutzt werden sollte, 
kann man den einfach mit C ansprechen. Dazu braucht man kein Assembler. 
Einfach Operand 1 schreiben, Operand 2 schreiben und Ergebnis auslesen. 
Der Compiler macht dann genau den Assembler Oode draus, den du hier 
versuchst inline aufwendig zu basteln.

von Paul E. (paul_e)


Lesenswert?

Naja leider nicht ganz. Der baut irgendwie einen Subroutinen aufruf 
drauß dieser braucht dann aber wesentlich länger als wenn ich es in ASM 
baue:


Das ist das Ergebnis vom C-Compiler:
;--- MUL
0x031dc:   421C 1140           MOV.W   &a,R12
0x031e0:   421D 1142           MOV.W   &b,R13
0x031e4:   13B0 7064           CALLA   #__mpyi_hw
0x031e8:   4C82 1144           MOV.W   R12,&c

         C$DW$L$main$96$E, __mpyi_hw:
0x07064:   1202                PUSH    ST
0x07066:   C232                DINT
0x07068:   4303                NOP
0x0706a:   4C82 0130           MOV.W   R12,&Multiplier_MPY
0x0706e:   4D82 0138           MOV.W   R13,&Multiplier_OP2
0x07072:   421C 013A           MOV.W   &Multiplier_RESLO,R12
0x07076:   4132                POP.W   ST
0x07078:   0110                RETA

von Christian R. (supachris)


Lesenswert?

OK, der Sprung in die Subroutine kostet zeit, ließe sich aber mit der 
passenden Einstellung des Compilers sicherlich verhindern. Das 
deaktivieren aller Interrupts vor Benutzung des MUL ist obligatorisch 
und steht auch so im User Guide. Das Push/Pop stellt nur den 
vorhergehenden GIE Status wieder her.

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.