在编译草图时出现错误。这个草图在以前版本(1.0.6)的arduino IDE中编译得很好,我知道使用1.6.9。我不明白这个信息。消息是这样的:
Arduino: 1.6.9 (Windows 7), TD: 1.29, Board: "Arduino/Genuino Micro"
C:UsersarnoldAppDataLocalArduino15packagesarduinohardware
avr1.6.13coresarduinomain.cpp: In function 'main':
C:UsersarnoldAppDataLocalArduino15packagesarduinohardware
avr1.6.13coresarduinomain.cpp:51:1: error: unable to find a
register to spill in class 'NO_REGS'
}
^
C:UsersarnoldAppDataLocalArduino15packagesarduinohardware
avr1.6.13coresarduinomain.cpp:51:1: error: this is the insn:
(insn 601 598 604 45 (set (mem:QI (post_dec:HI (reg/f:HI 32 __SP_L__)) [0 S1 A8])
(subreg:QI (reg/f:HI 658) 1)) sketchcoordinates.cpp:23 1 {pushqi1}
(expr_list:REG_ARGS_SIZE (const_int 1 [0x1])
(nil)))
C:UsersarnoldAppDataLocalArduino15packagesarduinohardwareavr1.6.13coresarduinomain.cpp:51: confused by earlier errors, bailing out
lto-wrapper: C:UsersarnoldAppDataLocalArduino15packagesarduinotoolsavr-gcc4.9.2-atmel3.5.3-arduino2/bin/avr-gcc returned 1 exit status
c:/users/arnold/appdata/local/arduino15/packages/arduino/tools/avr-gcc/4.9.2-atmel3.5.3-arduino2/bin/../lib/gcc/avr/4.9.2/../../../../avr/bin/ld.exe: lto-wrapper failed
collect2.exe: error: ld returned 1 exit status
exit status 1
Error compiling for board Arduino/Genuino Micro.
似乎指的是类坐标,第23行。我在这行中使用了sscanf函数。
coordinates.cpp
#include "coordinates.h"
// Include common data (shared bps and such)
#include "D:homearnolddevelopmentarduinodroneserial_commdata.h"
// TX_FORMAT_1 found in data.h: #define TX_FORMAT_1 "%ld %ld %ld %d %d"
Coordinates::Coordinates ()
{
ap_latitude = 0;
ap_longitude = 0;
ap_bar_altitude = 0;
ap_groundspeed = 0;
ap_heading = 0;
noGPSLock = 1;
setHome (52.026919, 6.373969); // Defaults to Varsel airport
} /*** Coordinates ***/
// Decodes a data string
void Coordinates::readSettings (char *buffer)
{
int32_t lat, lng;
int32_t alt;
sscanf (buffer, TX_FORMAT_1, &lat, &lng, &alt, &ap_groundspeed, &ap_heading);
ap_latitude = double (lat) / 10000000.0;
ap_longitude = double (lng) / 10000000.0;
ap_bar_altitude = double (alt) / 100.0;
noGPSLock = (lat == 0) && (lng == 0);
} /*** readSettings ***/
int8_t Coordinates::setHome (double lat, double lng)
{
if ((ap_latitude >= -90000000) && (ap_latitude <= +90000000) &&
(ap_longitude >= -180000000) && (ap_longitude <= 180000000))
{
home_latitude = lat;
home_longitude = lng;
Serial.print (F ("New home set at: ("));
Serial.print (home_latitude, 7);
Serial.print (F (", "));
Serial.print (home_longitude, 7);
Serial.println (")");
return 1; // ok
} else
{
Serial.print (F ("Couldn't set home. Lat = "));
Serial.print (ap_latitude, 7);
Serial.print (F ("long = "));
Serial.print (ap_longitude, 7);
Serial.println ("");
return 0; // abnormal values encountered, no home set, return error
} // if
} /*** setHome ***/
// Returns the distance of two coordinates (in decimal degrees) in meters
double Coordinates::haverSine (double lat1, double lon1, double lat2, double lon2)
{
double R, phi_1, phi_2, phi_delta;
double lambda_delta;
double a, c;
phi_1 = radians (lat1);
phi_2 = radians (lat2);
phi_delta = radians (lat2-lat1);
lambda_delta = (radians (lon2) - radians (lon1));
a = sin(phi_delta/2) * sin(phi_delta/2) +
cos(phi_1) * cos(phi_2) *
sin(lambda_delta/2) * sin(lambda_delta/2);
if (a < 0.0) a = 0.0;
c = 2.0 * atan2 (sqrt (a), sqrt (1-a));
return Radius * c;
} /*** haverSine ***/
// Returns the distance between ap_lat/long and home_lat/long in meters
double Coordinates::distanceToHome ()
{
return haverSine (ap_latitude, ap_longitude, home_latitude, home_longitude);
} /*** distanceToHome ***/
// returns the time (s) an object takes to fall to earth (in NL) given a height (in m)
double Coordinates::fallTime (double h)
{
double val = 2.0 * h / g;
if (val > 0.0) // Value should be > 0
return sqrt (val);
else // else return 0, no check on negative results (which is erroneous)
return 0.0;
} /*** fallTime ***/
// return the number of meters travelled given time t (s) and speed v (m/s)
double Coordinates::travelled (double t, double v)
{
return v * t;
} /*** travelled ***/
// return the number of meters travelled given time t (s) and
// current ground speed (m/s)
double Coordinates::distanceToTravel (double t)
{
return travelled (t, ap_groundspeed);
} /*** distanceToTravel ***/
double Coordinates::computeAngle (double x1, double y1, double x2, double y2)
{
double deltaY = y2 - y1;
double deltaX = x2 - x1;
double angleInDegrees = atan2(deltaY, deltaX) * 180 / PI;
return angleInDegrees;
} /*** computeAngle ***/
void Coordinates::printStatus (Stream* stream)
{
double t;
double d;
Serial.print (F(">>> Lat: "));
Serial.print (ap_latitude, 7);
Serial.print (F(", Long: "));
Serial.print (ap_longitude, 7);
Serial.print (F(", Alt: "));
Serial.print (ap_bar_altitude);
Serial.print (F(", Speed: "));
Serial.print (ap_groundspeed);
Serial.print (F(", Heading: "));
Serial.print (ap_heading);
Serial.print (F(", distance: "));
Serial.print (distanceToHome ());
Serial.print (F(", Angle: "));
Serial.print (computeAngle (ap_latitude, ap_longitude, home_latitude, home_longitude), 7);
Serial.println ("");
t = fallTime (double (ap_groundspeed));
d = abs (distanceToHome () - distanceToTravel (t));
Serial.print (F ("Given Alt - drop time: "));
Serial.print (t);
Serial.print (F(", d(travel): "));
Serial.print (travelled (t, ap_bar_altitude), 4);
Serial.print (F(", d (ground speed): "));
Serial.print (distanceToTravel (t));
Serial.print (F(", abs (d (home)-d (travel)): "));
Serial.print (d, 4);
Serial.println ("");
} /*** printStatus ***/
coordinates.h
#ifndef coordinates__h
#define coordinates__h
#include <arduino.h>
#include <HardwareSerial.h>
const double Radius = 6367444.5; // radius of earth in meters
const double g = 9.8124; // m/s2 for Varsel airport
class Coordinates
{
private:
public:
double ap_latitude; // decimal degrees
double ap_longitude; // decimal degrees
double ap_bar_altitude; // 100 = 1m
uint32_t ap_groundspeed; // in m/s
uint32_t ap_heading; // degrees
double home_latitude;
double home_longitude;
int8_t noGPSLock;
Coordinates ();
void readSettings (char *buffer);
int8_t setHome (double lat, double lng);
double haverSine (double lat1, double lon1, double lat2, double lon2);
double distanceToHome ();
double fallTime (double h);
double travelled (double t, double v);
double distanceToTravel (double t);
double computeAngle (double x1, double y1, double x2, double y2);
void printStatus (Stream* stream);
}; /*** class: Pwn ***/
#endif
有谁能告诉我如何避免这个错误吗?
编辑1
实验时,我注意到读取一个变量,如:
sscanf (buffer, TX_FORMAT_1, &lat);
正确编译。然而,添加第二个变量,将再次生成错误。
在网上搜索似乎指向1.6.9版本(和其他1.6版本)中使用的cpp编译器中的一个错误。x版本。通过将arduino IDE从1.6.9"升级"到1.0.6,问题就消失了。这不是最简洁的方法,但它有效。由于我没有使用1.6版本的任何特性,所以升级不成问题。