AVR gcc mit 64-Bit-Werte mit int64_t

OP #2387311
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
OP #2387346
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).
Persönliche Seite #2387945
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.
Moderator Persönliche Seite #2388969
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. ;-)

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