Forum: Mikrocontroller und Digitale Elektronik [Arduino] int32_t und long


von Beta R. (betaros)


Lesenswert?

Moin,

ich arbeite zzt ein wenig an der MultiWii und bin an ein Problem 
gestoßen, wo ich nicht weiter komme. Es geht um die Typen int32_t und 
long.

Fehler
1
GPS.cpp:1747: undefined reference to `set_new_altitude(long)'

GPS.cpp
1
void set_new_altitude(int32_t _new_alt){
2
...
3
set_new_altitude(GPS_conf.rth_altitude * 100);

GPS.h
1
void set_new_altitude(int32_t _new_alt);

MultiWii.cpp
1
gps_conf_struct GPS_conf;

types.conf
1
typedef struct
2
  {
3
4
  //Don't forget to change the reply size in GUI when change this struct;
5
6
  // on/off flags
7
  // First byte 
8
  uint8_t filtering : 1;
9
  uint8_t lead_filter : 1;
10
  uint8_t dont_reset_home_at_arm : 1;
11
  uint8_t nav_controls_heading : 1;
12
  uint8_t nav_tail_first : 1;
13
  uint8_t nav_rth_takeoff_heading : 1;
14
  uint8_t slow_nav : 1;
15
  uint8_t wait_for_rth_alt : 1;
16
  // Second byte
17
  uint8_t ignore_throttle: 1;            // Disable stick controls during mission and RTH
18
  uint8_t takeover_baro: 1;
19
20
  uint16_t wp_radius;                // in cm
21
  uint16_t safe_wp_distance;            // in meter
22
  uint16_t nav_max_altitude;            // in meter
23
  uint16_t nav_speed_max;              // in cm/s
24
  uint16_t nav_speed_min;              // in cm/s
25
  uint8_t  crosstrack_gain;            // * 100 (0-2.56)
26
  uint16_t nav_bank_max;              // degree * 100; (3000 default)
27
  uint16_t rth_altitude;              // in meter
28
  uint8_t  land_speed;              // between 50 and 255 (100 approx = 50cm/sec)
29
  uint16_t fence;                                 // fence control in meters
30
31
  uint8_t  max_wp_number;
32
33
  uint8_t  checksum;
34
  } gps_conf_struct;

Ich hoffe ich habe nichts vergessen mit anzugeben, falls doch sagt mir 
bescheid und ich füge noch etwas hinzu. Wie kann ich den Fehler beheben?

Grüße
betaros

: Verschoben durch User
von Joachim B. (jar)


Lesenswert?

Beta Ros schrieb:
> Es geht um die Typen int32_t und
> long.

warum mischst du ?

> FehlerGPS.cpp:1747: undefined reference to `set_new_altitude(long)'

hier long

> GPS.cppvoid set_new_altitude(int32_t _new_alt){

hier int32_t

auch wenn beide das selbe sein sollte

wenn der Compiler meckert beuge ich mich

entweder

aus

set_new_altitude(long) set_new_altitude(int32_t) machen oder

set_new_altitude(int32_t) set_new_altitude(long) machen

oder vielleicht wurde einfach nur das #include vergessen ?
oder gibt es diese Funktion nicht ?

Schreibfehler ?


ich habe jetzt 3 Seiten google Suche durch nach gps.cpp & Arduino, in 
keiner fand ich eine Funktion Namens:
set_new_altitude

evtl. wäre es hilfreich mal die LIB zu posten ?

es gibt einige gps.cpp woher sollte man wissen mit welcher du spielst ?

von Beta R. (betaros)


Lesenswert?

Hi,

danke für die schnelle Antwort. Du hast recht, ich habe vergessen 
anzugeben, woher ich den Quelltext nehme. Er stammt von hier: 
http://eosbandi.com/downloads/

Ich habe den Quellcode ja mit angegeben und wie man sieht wird nicht 
einmal eine long-Variable angegeben und verwendet, weshalb mich der 
Fehler wundert. Und wenn int32_t das gleiche ist wie long verwundert 
mich der Fehler umso mehr :(

Grüße
betaros

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

ich sehe 2 mögliche Fehler

1.
der Aufruf

set_new_altitude(alt.EstAlt); könnte mit einem cast entschärft werden

so:
set_new_altitude((long)alt.EstAlt);

oder so, je nachdem was den stört

set_new_altitude((int32_t)alt.EstAlt);


was in alt.EstAlt definiert ist weiss ich grad nicht


2.
die Aufrufe erfolgen eher als die Funktion bekannt ist

set_new_altitude(rth_alt); in Zeile 782

die Funktion ist erst in Zeile 900

manchmal hilft umstellen, die Funktion höher an den Anfang setzen dann 
kennt der Compiler sie vor dem Aufruf

alternativ bindet man ja Header zu gps.cpp sollte mindestens ein gps.h 
existieren der hier fehlt ein wo sie bekannt gemacht wird:

void set_new_altitude(int32_t);
oder
void set_new_altitude(long);


aber Arduino ist zickig, ich kämpfe auch immer mit meinen *.c und *.h 
Files in der Arduino IDE wobei mein c + h im Studio hervoragend laufen 
nur in der Arduino IDE ist mir das Zusammenspiel suspekt weil ich keine 
richtige IDE habe mit Linkeroptionen wie im Studio.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Beta Ros schrieb:
> Moin,
>
> ich arbeite zzt ein wenig an der MultiWii und bin an ein Problem
> gestoßen, wo ich nicht weiter komme.

Was hast du am original Code verändert?

Da ich keine Ardunio IDE habe, weiss ich nicht, ob das Original sauber 
linkt.
Nach Durchsicht der Sourcen sollte das eigentlich der Fall sein.
Soweit ich gesehen habe, ist da auch kein Präprozessor-#if in 
irgendeiner Art und Weise beteiligt. Das File hat auch korrekt die 
Endung cpp, so dass es auch nichts mit Name-mangling zu tun haben wird.

Wenn also das Original problemlos compiliert und linkt, dann muss es was 
mit deinen Änderungen zu tun haben. Da hilft es allerdings dann nichts, 
wenn du aufs Original verweist.

: Bearbeitet durch User
von Beta R. (betaros)


Lesenswert?

Hi,

also ich habe das Casten ausprobiert und auch das Verschieben der 
Funktionen, leider beides ohne Erfolg.

Ich habe meinen Quellcode mal hochgeladen: 
http://betaros.no-ip.org/MultiWii.zip

Grüße
betaros

von Karl H. (kbuchegg)


Lesenswert?

Wenn ich das richtig sehe, dann steht dieser ganze Code abhängig vom
1
#if defined(GPS_SERIAL)

in Zeile 373

Ich hab von da weiter gehend das zugehörige #endif mal gesucht, aber 
noch nicht gefunden. Das sollte man mal in einen Editor laden, der die 
entsprechenden Zusammenhänge darstellen kann.

Du kannst mal folgendes probieren.

Bau mal einen Syntaxfehler in die Funktion ein. Zb.
1
void set_new_altitude(int32_t _new_alt)
2
  {
3
4
  xyzabc
5
6
  //Limit maximum altitude command
7
  if(_new_alt > GPS_conf.nav_max_altitude*100) _new_alt = GPS_conf.nav_max_altitude * 100;
8
...

wenn dieser Syntaxfehler vom Compiler NICHT gemeldet wird, dann wird die 
Funktion überhaupt nicht compiliert, weil sie durch das #ifdef Dickicht 
ausgeschlossen wird.


Warum hast du eigentlich
1
  //#define GPS_SERIAL 2         // should be 2 for flyduino v2. It's the serial port number on arduino MEGA
in config.h auskommentiert?

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Wenn meine Tools nicht lügen, dann sitzt der entsprechende #endif in 
Zeile 1730
1
...
2
#endif //ONBOARD GPS CALC
3
4
//************************************************************************
5
// Common GPS functions - #defines inside handle I2CGPS and SERIAL
6
//
7
void init_RTH()
8
  {
9
  f.GPS_mode = GPS_MODE_RTH;                  // Set GPS_mode to RTH
10
  f.GPS_BARO_MODE = true;
11
#if defined (I2C_GPS)
12
  GPS_I2C_command(I2C_GPS_COMMAND_START_NAV,0);            //waypoint zero
13
#else
14
  GPS_hold[LAT] = GPS_coord[LAT];              //All RTH starts with a poshold 
15
  GPS_hold[LON] = GPS_coord[LON];              //This allows to raise to rth altitude
16
....

damit ist aber klar, dass das nicht funktionieren kann. Die Funktion 
wird gar nicht mitcompiliert.
Da hat jemand geschlampt und nie ausprobiert, ob man GPS_SERIAL 
auskommentieren kann und welche Funktionen bzw. Funktionalität dann 
wegfallen.

von Karl H. (kbuchegg)


Lesenswert?

Ich würde mal sagen, dein eigenticher Fehler steckt hier in config.h
1
....
2
  /* GPS using a SERIAL port
3
  if enabled, define here the Arduino Serial port number and the UART speed
4
  note: only the RX PIN is used in case of NMEA mode, the GPS is not configured by multiwii
5
  in NMEA mode the GPS must be configured to output GGA and RMC NMEA sentences (which is generally the default conf for most GPS devices)
6
  at least 5Hz update rate. uncomment the first line to select the GPS serial port of the arduino */
7
8
  #define GPS
9
10
  //#define GPS_SERIAL 2         // should be 2 for flyduino v2. It's the serial port number on arduino MEGA
11
  #define GPS_PROMINI_SERIAL   // Will Autosense if GPS is connected when ardu boots.
12
13
  // avoid using 115200 baud because with 16MHz arduino the 115200 baudrate have more than 2% speed error (57600 have 0.8% error)
14
  //#define GPS_BAUD   57600
15
16
  /* GPS protocol 
17
  NMEA  - Standard NMEA protocol GGA, GSA and RMC  sentences are needed
18
...

du kannst nicht GPS_SERIAL auskommentieren (und auch nicht einfach die 
Baudrate weglassen).

Autosense bedeutet nicht, dass der Arduino dann den Serial Port 
rausfindet, an dem das GPS hängt, sondern dass er feststellt, ob am 
angegebenen Port ein GPS hängt (auch wenn ich die zu GPS_PROMINI_SERIAL 
im Code noch nicht gefunden habe).

-> Konfigurationsfehler deinerseits, auch wenn der Code in gps.cpp 
furchtbar durch die #if Origien entstellt ist und dringend aufgeräumt 
werden müsste.

von Beta R. (betaros)


Lesenswert?

Hi,

entschuldige, dass ich so spät erst antworte, aber ich bin leider nicht 
früher dazu gekommen.

Vielen Dank auf jedem Fall für die viele Arbeit und Mühe die du dir 
gemacht hast, um mir zu helfen. Anscheinend habe ich dann den Quellcode 
falsch verstanden gehabt. Ich dachte GPS_SERIAL würde nur für den 
Arduino Mega gebraucht. Mein Ziel ist es den Code auf einem Arduino 
Leonardo zum laufen zu bekommen, jedoch ist der Code noch 10 kb zu groß. 
Meine Hoffnung lag deshalb in GPS_PROMINI_SERIAL.

Auch wenn man die I2C Version noch nicht verwenden soll, so möchte ich 
doch mal versuchen dies zu kompilieren, komm jedoch wieder auf den 
ursprünglichen Fehler mit setAltitude(long) in MultiWii.cpp line 1205.

Jedenfalls vielen Dank für die Hilfe :)

Grüße
betaros

: Bearbeitet durch User
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.