Forum: Mikrocontroller und Digitale Elektronik XC886 (XC800/8051) multipliziert uint16_t langsam


von Patrick T. (patrick_t16)


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. =)

von Georg G. (df2au)


Lesenswert?

Patrick T. schrieb:
> 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

Warum siehst du dir nicht einfach den erzeugten Assembler Code an?

von Jim M. (turboj)


Lesenswert?

Patrick T. schrieb:
> Meine Ideen:
> -> die MDU wird nicht verwendet.

Schau mal in die Doku zum Keil Compiler, aber normalerweise erzeugt der 
nur allgemeine 8051 Instruktionen. Das sieht man im Assembler Listing.

Übrigens könnte der Compiler auch aus anderen Günden auf die MDU 
verzichten, z.B. wenn die Funktion re-entrant sein muss oder in 
Interrupts verwendet wird.

von Patrick T. (patrick_t16)


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.

von Jim M. (turboj)


Lesenswert?

Schau mal ins Datenblatt vom µC, der original 8051 braucht 12 Takte für 
eine Instruktion. Das bedeutet, dass er trotz 24 MHz Takt nur 2 M 
Instruktionen/s verarbeiten kann. Damit kommt man schon viel näher an 
die 9 µs heran.

Details müssten im Handbuch oder Datenblatt stehen.

: Bearbeitet durch User
von Patrick T. (patrick_t16)


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!

von Bernhard S. (b_spitzer)


Lesenswert?

Schau dir mal an, was die ganze indirekte Adressierung zum lesen aus dem 
XRAM an Taktzyklen frisst. Dann wäre noch interessant, wie die 
Multiplikation wirklich umgesetzt ist. Was steht in der Funktion
1
LCALL    C?IMUL(C:030E)
an ASM-Anweisungen drin?

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.