Hello everyone, I'm trying to compile a program for an Arduino Nano board, but I'm running into some memory issues. The strange thing is that, when I compile it on Windows, the result is that the sketch takes up 65% of program storage space, and global variables use 102% of dynamic memory, but when I compile on MacOS, the sketch takes up 23% of program storage space, and global variables use 71% of dynamic memory.
What could cause such a huge difference in compilation sizes? They are both on the same branch of the same repo without any unsaved changes, and the libraries they use are the same version.
Thank you!
Edit: some more VERY INTERESTING INFO
I origninally had the following functions in my code:
uint8_t* createTelemetryPacketStr(float altitude, float temp, float voltage, double gpsLat, double gpsLng, float gpsAltitude, uint8_t gpsSats) {
uint8_t buffer[12];
unsigned char precision = 1, voltagePrecision = 2, latLngPrecision = 5, bufferPadding;
itoa(TEAM_ID, telPacketString, 10);
telPacketString[4] = ',';
memcpy(telPacketString + 5, getMissionTimeString(12, 2, 3), 8);
...
telPacketString[128] = 0;
Serial.write(telPacketString, 128);
return telPacketString;
}
...
void loop() {
float temperature = sensorModule.readTemperature();
float altitude = sensorModule.readAltitude();
int voltageSensorValue = analogRead(A0);
float voltage = voltageSensorValue * (5.0 / 1023.0); // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
double gpsLat = sensorModule.gps.location.lat();
double gpsLng = sensorModule.gps.location.lng();
double gpsAltitude = sensorModule.gps.altitude.meters();
uint32_t gpsSatellites = sensorModule.gps.satellites.value();
communicationModule.telemetryPacketQueue.add(createTelemetryPacketStr(altitude, temperature, voltage, gpsLat, gpsLng, gpsAltitude, gpsSatellites), 128);
And I moved all the variables into the createTelemetryPackageStr() function, removing them from the loop() function and sending a -1 alt value to the function:
uint8_t* createTelemetryPacketStr(float alt) {
float altitude;
if (alt == -1) {
altitude = sensorModule.readAltitude();
} else {
altitude = alt;
}
float temp = sensorModule.readTemperature();
int voltageSensorValue = analogRead(A0);
float voltage = voltageSensorValue * (5.0 / 1023.0); // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
double gpsLat = sensorModule.gps.location.lat();
double gpsLng = sensorModule.gps.location.lng();
double gpsAltitude = sensorModule.gps.altitude.meters();
uint32_t gpsSats = sensorModule.gps.satellites.value();
uint8_t buffer[12];
unsigned char precision = 1, voltagePrecision = 2, latLngPrecision = 5, bufferPadding;
itoa(TEAM_ID, telPacketString, 10);
telPacketString[4] = ',';
memcpy(telPacketString + 5, getMissionTimeString(12, 2, 3), 8);
...
telPacketString[128] = 0;
Serial.write(telPacketString, 128);
return telPacketString;
}
After this, the memory and program space on MacOS stays the same, but on Windows, the program size and the global variable sizes increased by 15% and 6% respectively.