Forum: Compiler & IDEs AVR gcc mit 64-Bit-Werte mit int64_t


von Alexander L. (lippi2000)


Lesenswert?

Hallo,

ich verstehe nicht, warum das AVR-Studio folgende Berechnung nicht 
ordnungsgemäß durchführt.
1
#include <avr/io.h>
2
3
const unsigned char a = 20;      //Skalierungsfaktor a = 2^a
4
5
int main(void)
6
{
7
  volatile signed int P_alt, P_neu;
8
  volatile int64_t delta_P = 0;
9
  volatile signed int m, delta_T;
10
  
11
  m = -105;      //m ist um den Faktor 2^a vorskaliert:  -1E-4 * 2^20 = -105;
12
  P_alt = 1000;
13
  P_neu = 0;
14
  delta_T = 100;
15
  
16
    while(1)
17
    {  
18
    
19
    delta_P = m * delta_T*P_alt;      //delta_P = -10,5E6 (Debugger liefert -14240???)
20
    delta_P = (int64_t)(delta_P>>20);    //delta_P = -10 (Debugger liefert -1???)
21
    P_neu = P_alt + delta_P;        //P_neu = P_alt - 10 (Debugger liefert 999???)
22
    PORTC = (unsigned char)(P_neu);
23
            
24
    }
25
}

Beim compilieren kommen weder Fehler noch Warnhinweise. Wo liegt das 
Problem. Habe auch schon die Compiler-Optimierungen durchprobiert.

Gruß Alexander

von Alexander L. (lippi2000)


Lesenswert?

P.S. Benutze AVR Studio 5.0.1163

von Floh (Gast)


Lesenswert?

Setz mal schon in die erste Berechnung einen Cast.

von Jörg G. (joergderxte)


Lesenswert?

>  delta_P = m * delta_T*P_alt;
Versuch mal:
1
 delta_P = (int64_t)m * delta_T * P_alt;
Wie in C üblich, spielt der Typ der zugewiesenen Variablen bei der 
Berechnung keine Rolle.

von Knut (Gast)


Lesenswert?

Weshalb rechnest du in 64Bit? Wenn du mit 32Bit rechnest kommst du 
locker hin?!



Knut

von Alexander L. (lippi2000)


Lesenswert?

Hallo Jörg,

danke, dass hat geholfen. Leider kann ich mit dem Debugger nur noch das 
Ergebnis in der Zeile "PORTC = ..." mit einem Breakpoint ansehen, da 
stimmt allerdings der Korrekturwert von delta_P. Will ich schrittweise 
deguggen, will er immer eine Datei "libgcc2.c" auf meinem Rechner 
suchen.

Warum? Wo kann ich diese eventuell downloaden?

@Knut:

Folgende Wertebereiche:

m = 2^(15*sign)
P_alt = 2^16
delta_T = 2^(15+sign)

Da sich delta_P = m*P_alt*delta_T errechnet, benötige ich für delta_P 
einen Wertebereich von 2^(47+sign).

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Alexander Liebhold schrieb:
> Hallo Jörg,
>
> Will ich schrittweise deguggen, will er immer eine Datei
> "libgcc2.c" auf meinem Rechner suchen.
>
> Warum? Wo kann ich diese eventuell downloaden?

Die Objekte enthalten Debug Information.
Die Debug-Information bezieht sich auf den Quellcode.

Die Debug-Information enthält keinen Quellcode (Hersteller 
proprietärer Software würden sich bedanken), sie referenziert ihn nur.

Du kannst die Objekte/Bibliotheken strippen, zB mit avr-strip -s

Oder die die referenzierten Quellen — die zu deiner 
Toolchain-Distribution passen — besorgen. Die Datei liegt dort in
   ./gcc/libgcc2.c
Für die aktuelle, offizielle Version 4.7:
   http://gcc.gnu.org/viewcvs/trunk/gcc/libgcc2.c?content-type=text%2Fplain&view=co

Zur libgcc gehort jedoch mehr als nur diese eine Datei.

von Rolf Magnus (Gast)


Lesenswert?

Alexander Liebhold schrieb:
> Will ich schrittweise deguggen, will er immer eine Datei "libgcc2.c" auf meinem
> Rechner suchen.
>
> Warum?

Weil du multiplizierst und die Routine dafür in der libgcc2.c definiert 
ist.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Johann L. schrieb:
> Du kannst die Objekte/Bibliotheken strippen, zB mit avr-strip -s

avr-strip -g wäre besser.  Damit entfernt man nur die Debug-
informationen, also die Referenz auf libgcc.c.  Wenn man von einem
verschieblichen Objekt alle Symbole entfernt (strip -s), dann hat
der Linker hinterher ziemliche Schwierigkeiten, das Objekt noch zu
linken. ;-)

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.