Here is my program:
#include <Arduino.h>
typedef struct
{
uint32_t RPM_Pulses_Per_Revolution;
int32_t Load_Cell_Tare;
double Load_Cell_Calibrate;
double Lever_Length_Feet;
double Efficiency_Factor;
uint32_t CRC;
} SETUP_STRUCT_TYPE;
SETUP_STRUCT_TYPE dyno_setup =
{ // RP2040 UNO
4, // uint32_t RPM_Pulses_Per_Revolution; 4 4
-75066, // int32_t Load_Cell_Tare; 4 = 8 4 = 8
-66502.082794, // double Load_Cell_Calibrate; 8 = 16 4 = 12
1.0, // double Lever_Length_Feet; 8 = 24 4 = 16
1.0, // double Efficiency_Factor; 8 = 32 4 = 20
0x2A40D05E // uint32_t CRC; 4 = 36 4 = 24
};
void setup()
{
Serial.begin(115200);
// Wait for serial port to connect. Needed for native Adalogger
// RP2040 USB port only.
while(!Serial)
{
delay(10);
}
Serial.print("PS sizeof(SETUP_STRUCT_TYPE): "); Serial.println(sizeof(SETUP_STRUCT_TYPE));
Serial.print("PS sizeof(dyno_setup): "); Serial.println(sizeof(dyno_setup));
Serial.print("PS sizeof(dyno_setup.RPM_Pulses_Per_Revolution): "); Serial.println(sizeof(dyno_setup.RPM_Pulses_Per_Revolution));
Serial.print("PS sizeof(dyno_setup.Load_Cell_Tare): "); Serial.println(sizeof(dyno_setup.Load_Cell_Tare));
Serial.print("PS sizeof(dyno_setup.Load_Cell_Calibrate): "); Serial.println(sizeof(dyno_setup.Load_Cell_Calibrate));
Serial.print("PS sizeof(dyno_setup.Lever_Length_Feet): "); Serial.println(sizeof(dyno_setup.Lever_Length_Feet));
Serial.print("PS sizeof(dyno_setup.Efficiency_Factor): "); Serial.println(sizeof(dyno_setup.Efficiency_Factor));
Serial.print("PS sizeof(dyno_setup.CRC): "); Serial.println(sizeof(dyno_setup.CRC));
Serial.print("PS addr of &dyno_setup: "); Serial.println((uint32_t)&dyno_setup, HEX);
Serial.print("PS addr of &dyno_setup.RPM_Pulses_Per_Revolution: "); Serial.println((uint32_t)&dyno_setup.RPM_Pulses_Per_Revolution, HEX);
Serial.print("PS addr of &dyno_setup.Load_Cell_Tare: "); Serial.println((uint32_t)&dyno_setup.Load_Cell_Tare, HEX);
Serial.print("PS addr of &dyno_setup.Load_Cell_Calibrate: "); Serial.println((uint32_t)&dyno_setup.Load_Cell_Calibrate, HEX);
Serial.print("PS addr of &dyno_setup.Lever_Length_Feet: "); Serial.println((uint32_t)&dyno_setup.Lever_Length_Feet, HEX);
Serial.print("PS addr of &dyno_setup.Efficiency_Factor: "); Serial.println((uint32_t)&dyno_setup.Efficiency_Factor, HEX);
Serial.print("PS addr of &dyno_setup.CRC: "); Serial.println((uint32_t)&dyno_setup.CRC, HEX);
}
void loop()
{
}
On an UNO, sizeof() returns as I expect:
Run on a UNO:
PS sizeof(SETUP_STRUCT_TYPE): 24
PS sizeof(dyno_setup): 24
PS sizeof(dyno_setup.RPM_Pulses_Per_Revolution): 4
PS sizeof(dyno_setup.Load_Cell_Tare): 4
PS sizeof(dyno_setup.Load_Cell_Calibrate): 4
PS sizeof(dyno_setup.Lever_Length_Feet): 4
PS sizeof(dyno_setup.Efficiency_Factor): 4
PS sizeof(dyno_setup.CRC): 4
PS addr of &dyno_setup: 100
PS addr of &dyno_setup.RPM_Pulses_Per_Revolution: 100
PS addr of &dyno_setup.Load_Cell_Tare: 104
PS addr of &dyno_setup.Load_Cell_Calibrate: 108
PS addr of &dyno_setup.Lever_Length_Feet: 10C
PS addr of &dyno_setup.Efficiency_Factor: 110
PS addr of &dyno_setup.CRC: 114 // 114 - 100 =0x14 = 20 which checks, Add 4 bytes for CRC and we are at 24
On the rp2040 it returns 4 bytes larger than I expect:
PS sizeof(SETUP_STRUCT_TYPE): 40 // !! I THINK THIS SHOULD BE 36 !!
PS sizeof(dyno_setup): 40 // !! I THINK THIS SHOULD BE 36 !!
PS sizeof(dyno_setup.RPM_Pulses_Per_Revolution): 4
PS sizeof(dyno_setup.Load_Cell_Tare): 4
PS sizeof(dyno_setup.Load_Cell_Calibrate): 8
PS sizeof(dyno_setup.Lever_Length_Feet): 8
PS sizeof(dyno_setup.Efficiency_Factor): 8
PS sizeof(dyno_setup.CRC): 4 // THESE ADD TO 36
PS addr of &dyno_setup: 20000B98
PS addr of &dyno_setup.RPM_Pulses_Per_Revolution: 20000B98
PS addr of &dyno_setup.Load_Cell_Tare: 20000B9C
PS addr of &dyno_setup.Load_Cell_Calibrate: 20000BA0
PS addr of &dyno_setup.Lever_Length_Feet: 20000BA8
PS addr of &dyno_setup.Efficiency_Factor: 20000BB0
PS addr of &dyno_setup.CRC: 20000BB8 // 20000BB8 - 20000B98 =0x20 = 32 which checks, Add 4 bytes for CRC and we are at 36
I can code around it, but this is really unexpected.
Is this a known issue? Does the rp2040 align on an 8 byte boundary?
What am I missing?