XC886 (XC800/8051) multipliziert uint16_t langsam

OP #3902010
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. =)
#3902026
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.
OP #3902075
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.
#3902525
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.
OP #3907412
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!
#3928840
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?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.