XC886 (XC800/8051) multipliziert uint16_t langsam

OP #3902010
Lesenswert?

Hallo!


Kurze Frage:
Ich arbeite im Moment an einem Projekt mit dem schon etwas in die Jahre 
gekommenen XC886 (bzw. allgemein der XC800 Serie) von Infineon. 8051 
Architektur.

Laut Infineon Datenblatt hat der Chip eine MDU - Multiplication and 
Division Unit und soll laut Datenblatt für eine Operation uint16_t x 
uint16_t mit Ergebis uint32_t 16 Clockzyklen brauchen.

Da der Chip intern mit 24MHz arbeitet, sind das also rechnerisch etwa 
0,67 Mikrosekunden.

Zeitmessungen für die Rechnung:
1
tmpVal = (uint16_t)(uwADC_UinRect * uwPINCONTROLL_Pdev);

Ergeben aber ziemlich genau 6,04 Mikrosekunden.
(Pin vorher high, Pin nachher low, mit Oszi gemessen)

Frage: woher kommt dieser Unterschied?

Meine Ideen:
-> die MDU wird nicht verwendet.
-> Lade und Rückschreibezeiten von RAM-Register machen die Rechnung 
kaputt, zumal Memory Model "Large - Variables in XDATA" gewählt wurde

 (Kompiliert wird mit uVision Studio, Keil Cx51 Compiler in Version 
v9.03 -> das ist nicht die aktuellste)

Vielen Dank für Fragen, kritische Anmerkungen und Unterstützung. =)
OP #3902075
Lesenswert?

Sorry - mein Fehler.
Der AssemblerCode zeigt einen LCALL für die Multiplikation auf genau die 
Math-ROM Multiplikationsfunktion die laut Keil auch für die Nutzung der 
MDU verwendet werden muss:
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka11515.html

Und der Compiler soll laut Information Center durch die Einbindung der 
ROM-Bibliothek auch in der Lage sein, diese Funktionen/MDU zu verwenden 
-> scheint ja zu klappen:
1
MOV      DPTR,#uwPINCONTROLL_Pdev(0xF33D)
2
MOVX     A,@DPTR
3
MOV      R4,A
4
INC      DPTR
5
MOVX     A,@DPTR
6
MOV      R5,A
7
MOV      R0,#uwADC_UinRect(0xAD)
8
MOV      A,@R0
9
MOV      R6,A
10
INC      R0
11
MOV      A,@R0
12
MOV      R7,A
13
LCALL    C?IMUL(C:030E)
14
MOV      DPTR,#0xF008
15
MOV      A,R7
16
MOVX     @DPTR,A

Weiteres Update: Ich habe die u16x16=u32 Multiplikation in einem 
Beispielprojekt von ca 9us auf 6us reduzieren können -> durch Änderung 
des Memory-Modells von Large auf Small. Das wäre also ein Ansatz auch 
für mein Produktivprojekt. Wenn auch weiterhin von dem theoretischen 
Wert weit entfernt.
OP #3907412
Lesenswert?

Also der XC886/888 nutzt offensichtlich einen 2-clock Zyklus:

"While the standard 8051 processor is designed around a 12-clock machine 
cycle, the XC886/888 CPU uses a 2-clock machine cycle." - aus dem User 
Manual

weiterhin ist die Multiplikationszeit wirklich in Clock-Cyles angegeben 
zu sein:
1
Operation                    Result  No. of Clock Cycles used for calculation
2
Unsigned 16-bit x 16-bit     32-bit      16

Werde mal eine Abschätzung machen, wieviel Zeit/Clockzyklen der Code 
rund um die Multiplikation so braucht und mich nochmal melden. =) Danke 
soweit!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren