Forum: Compiler & IDEs µChip XC16 hat Probleme bei Inline Assembler Befehlen


von Thomas S. (daimonion)


Lesenswert?

Hallo Leute


Ich habe hier einen codepart den ich vom C30 Compiler auf den XC16 
Compiler portieren will. Das funktioniert auch alles super, bis auf ein 
Stück Code wo der Compiler mit aktivierter Optimierung aus dem Tritt 
gerät. Es handelt sich grob gesagt um folgendes Stück Code:

1
extern sint16 Math_CalcSinTaylor(uint16 phiX_u16)
2
{
3
    register sint16 AkkuA_s16 asm("A");
4
    register sint16 AkkuB_s16 asm("B");
5
    ...
6
    ...
7
    ...
8
    /* x^2 = x*x */
9
    AkkuB_s16 = __builtin_mpy(phiX_s16, phiX_s16, 0, 0, 0, 0, 0, 0);
10
    phiX2_s16 = __builtin_sac(AkkuB_s16, 0); /* store */
11
    ...
12
    ...
13
    ...
14
}

Die Fehlermeldung bei aktivierter Optimierungsstufe (egal welche) 
lautet:
1
../source/Core/HAL/Math.c: In function 'Math_CalcSinTaylor':
2
../source/Core/HAL/Math.c:401:1: error: Argument 0 should be an accumulator register (__builtin_sacr)
3
../source/Core/HAL/Math.c:401:1: error: Expected DSP accumulator result (__builtin_mac)

Daraus schliesse ich, dass der Compiler die Definition der Variablen 
AkkuA_s16 und AkkuB_s16 wegschmeisst.

Wie kann ich das denn verhindern?

Grüße
Daimonion

von Bronco (Gast)


Lesenswert?

Geraten:
Vielleicht mußt Du die DSP-Register beim XC16 jetzt anders definieren 
als beim C30?

Oder vielleicht hilft auch schon ein volatile?
1
extern sint16 Math_CalcSinTaylor(uint16 phiX_u16)
2
{
3
    volatile register sint16 AkkuA_s16 asm("A");
4
    volatile register sint16 AkkuB_s16 asm("B");
5
    ...
6
}

von Thomas S. (daimonion)


Lesenswert?

Danke für deine Antwort.

Leider konnte ich in den Style Guides hinsichtlich der Definition 
keinerlei Unterschied zwischen C30 und XC16 finden. Daher gehe ich erst 
mal davon aus, dass sich da nichts geändert hat.

Unseren Microchipmann habe ich dahingehend auch schon darauf angesetzt 
aber bisher konnte er mir noch nichts sagen.

volatile habe ich probiert. Dann compiliert er zwar, bringt aber ein 
warning dass die Variablen wahrscheinlich wegoptimiert werden könnten. 
Ach ne... ;)

Grüße
Daimonion

von Bronco (Gast)


Lesenswert?

Könnte es daran liegen, dass die Akkus 24Bit breit sind und Deine 
Variablen nur 16Bit? Macht aber auch keinen Sinn...

von jonas biensack (Gast)


Lesenswert?

Laut Fehlermeldung gibt __builtin_sacr einen Fehler nicht __builtin_sac?
Hm?

Gruß Jonas

von Thomas S. (daimonion)


Lesenswert?

Hallo Leute

Ich konnte das Problem momentan damit lösen, dass ich die 
Variablendefinition nicht, wie dargestellt, in die Funktion schreibe, 
sondern quasi global in das C-File.

Ist zwar nicht schön, aber somit kann ich erst mal weiter den Code 
testen.

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.