Applied __attribute__((packed)) to all data structures to reduce memory footprint

This commit is contained in:
Silvano Seva 2021-03-26 18:11:22 +01:00
parent 9d02ffaea4
commit 86f6d114e2
9 changed files with 38 additions and 28 deletions

View File

@ -56,7 +56,8 @@ typedef struct
rxTone : 7; /**< RX CTC/DCS tone index, squelch opens on match */ rxTone : 7; /**< RX CTC/DCS tone index, squelch opens on match */
uint8_t txToneEn : 1, /**< TX CTC/DCS tone enable */ uint8_t txToneEn : 1, /**< TX CTC/DCS tone enable */
txTone : 7; /**< TX CTC/DCS tone index, sent alongside voice */ txTone : 7; /**< TX CTC/DCS tone index, sent alongside voice */
} fmInfo_t; }
__attribute__((packed)) fmInfo_t;
/** /**
* Data structure containing all and only the information for DMR channels. * Data structure containing all and only the information for DMR channels.
@ -68,7 +69,8 @@ typedef struct
uint8_t dmr_timeslot; /**< DMR timeslot, either 1 or 2 */ uint8_t dmr_timeslot; /**< DMR timeslot, either 1 or 2 */
uint16_t contactName_index; /**< Index to retrieve data from contact list */ uint16_t contactName_index; /**< Index to retrieve data from contact list */
} dmrInfo_t; }
__attribute__((packed)) dmrInfo_t;
/** /**
* Data structure containing all the information of a channel, either FM or DMR. * Data structure containing all the information of a channel, either FM or DMR.
@ -101,7 +103,8 @@ typedef struct
fmInfo_t fm; /**< Information block for FM channels */ fmInfo_t fm; /**< Information block for FM channels */
dmrInfo_t dmr; /**< Information block for DMR channels */ dmrInfo_t dmr; /**< Information block for DMR channels */
}; };
} channel_t; }
__attribute__((packed)) channel_t;
/** /**
* Data structure containing all the information of a zone. * Data structure containing all the information of a zone.
@ -110,7 +113,8 @@ typedef struct
{ {
char name[16]; /**< Zone name */ char name[16]; /**< Zone name */
uint16_t member[64]; /**< Channel indexes */ uint16_t member[64]; /**< Channel indexes */
} zone_t; }
__attribute__((packed)) zone_t;
/** /**
* Data structure containing all the information of a contact. * Data structure containing all the information of a contact.
@ -121,6 +125,7 @@ typedef struct
uint32_t id; /**< DMR ID: 24bit number, 1...16777215 */ uint32_t id; /**< DMR ID: 24bit number, 1...16777215 */
uint8_t type; /**< Call Type: Group Call, Private Call or All Call */ uint8_t type; /**< Call Type: Group Call, Private Call or All Call */
bool receive_tone; /**< Call Receive Tone: No or yes */ bool receive_tone; /**< Call Receive Tone: No or yes */
} contact_t; }
__attribute__((packed)) contact_t;
#endif #endif

View File

@ -38,7 +38,8 @@ typedef struct queue_t
uint8_t write_pos; uint8_t write_pos;
uint8_t msg_num; uint8_t msg_num;
uint32_t buffer[MSG_QTY]; uint32_t buffer[MSG_QTY];
} queue_t; }
queue_t;
/** /**
* *

View File

@ -46,7 +46,7 @@ typedef struct
uint16_t txToneEn : 1, /**< TX CTC/DCS tone enable */ uint16_t txToneEn : 1, /**< TX CTC/DCS tone enable */
txTone : 15; /**< TX CTC/DCS tone */ txTone : 15; /**< TX CTC/DCS tone */
} }
rtxStatus_t; __attribute__((packed)) rtxStatus_t;
/** /**
* \enum bandwidth Enumeration type defining the current rtx bandwidth. * \enum bandwidth Enumeration type defining the current rtx bandwidth.

View File

@ -37,7 +37,7 @@ typedef struct
uint16_t azimuth; // Azimuth in degrees uint16_t azimuth; // Azimuth in degrees
uint8_t snr; // Quality of the signal in range 0-99 uint8_t snr; // Quality of the signal in range 0-99
} }
sat_t; __attribute__((packed)) sat_t;
/** /**
* Data structure representing the last state received from the GPS module. * Data structure representing the last state received from the GPS module.
@ -58,7 +58,7 @@ typedef struct
float tmg_mag; // Course over ground, degrees, magnetic float tmg_mag; // Course over ground, degrees, magnetic
float tmg_true; // Course over ground, degrees, true float tmg_true; // Course over ground, degrees, true
} }
gps_t; __attribute__((packed)) gps_t;
/** /**
* Part of this structure has been commented because the corresponding * Part of this structure has been commented because the corresponding
@ -96,7 +96,7 @@ typedef struct
settings_t settings; settings_t settings;
gps_t gps_data; gps_t gps_data;
} }
state_t; __attribute__((packed)) state_t;
enum TunerMode enum TunerMode
{ {

View File

@ -136,9 +136,10 @@ typedef struct layout_t
fontSize_t bottom_font; fontSize_t bottom_font;
fontSize_t input_font; fontSize_t input_font;
fontSize_t menu_font; fontSize_t menu_font;
} layout_t; }
__attribute__((packed)) layout_t;
/** /**
* This structs contains state variables internal to the * This structs contains state variables internal to the
* UI that need to be kept between executions of the UI * UI that need to be kept between executions of the UI
* This state does not need to be saved on device poweroff * This state does not need to be saved on device poweroff
@ -165,7 +166,8 @@ typedef struct ui_state_t
#endif #endif
// Which state to return to when we exit menu // Which state to return to when we exit menu
uint8_t last_main_state; uint8_t last_main_state;
} ui_state_t; }
__attribute__((packed)) ui_state_t;
extern layout_t layout; extern layout_t layout;
// Copy of the radio state // Copy of the radio state
@ -188,7 +190,7 @@ extern const color_t color_white;
extern const color_t yellow_fab413; extern const color_t yellow_fab413;
/** /**
* This function initialises the User Interface, starting the * This function initialises the User Interface, starting the
* Finite State Machine describing the user interaction. * Finite State Machine describing the user interaction.
*/ */
void ui_init(); void ui_init();
@ -208,7 +210,7 @@ void ui_drawSplashScreen(bool centered);
void ui_saveState(); void ui_saveState();
/** /**
* This function advances the User Interface FSM, basing on the * This function advances the User Interface FSM, basing on the
* current radio state and the keys pressed. * current radio state and the keys pressed.
* @param last_state: A local copy of the previous radio state * @param last_state: A local copy of the previous radio state
* @param event: An event from other threads * @param event: An event from other threads

View File

@ -108,13 +108,13 @@ typedef struct {
// Bytes 52-55 // Bytes 52-55
uint8_t _unused52[4]; // 0 uint8_t _unused52[4]; // 0
} }
gdxChannel_t; __attribute__((packed)) gdxChannel_t;
typedef struct { typedef struct {
uint8_t bitmap[16]; // bit set when channel valid uint8_t bitmap[16]; // bit set when channel valid
gdxChannel_t chan[128]; gdxChannel_t chan[128];
} }
gdxChannelBank_t; __attribute__((packed)) gdxChannelBank_t;
// This corresponds to OpenGD77 extended zones // This corresponds to OpenGD77 extended zones
// TODO: Find a way to distinguish between a stock and OpenGD77 CPS // TODO: Find a way to distinguish between a stock and OpenGD77 CPS
@ -122,13 +122,13 @@ typedef struct {
uint8_t name[16]; // Zone Name uint8_t name[16]; // Zone Name
uint16_t member[80]; // Member: channels 1...80 uint16_t member[80]; // Member: channels 1...80
} }
gdxZone_t; __attribute__((packed)) gdxZone_t;
typedef struct { typedef struct {
uint8_t bitmap[32]; // bit set when zone valid uint8_t bitmap[32]; // bit set when zone valid
gdxZone_t zone[250]; gdxZone_t zone[250];
} }
gdxZoneBank_t; __attribute__((packed)) gdxZoneBank_t;
typedef struct { typedef struct {
// Bytes 0-15 // Bytes 0-15
@ -145,6 +145,6 @@ typedef struct {
uint8_t ring_style; // Ring style: 0-10 uint8_t ring_style; // Ring style: 0-10
uint8_t _unused23; // 0xff for used contact, 0 for blank entry uint8_t _unused23; // 0xff for used contact, 0 for blank entry
} }
gdxContact_t; __attribute__((packed)) gdxContact_t;
#endif /* NVMDATA_GDx_H */ #endif /* NVMDATA_GDx_H */

View File

@ -110,7 +110,7 @@ typedef struct
// Bytes 32-63 // Bytes 32-63
uint16_t name[16]; uint16_t name[16];
} }
md3x0Channel_t; __attribute__((packed)) md3x0Channel_t;
typedef struct typedef struct
{ {
@ -120,7 +120,7 @@ typedef struct
// Bytes 32-63 // Bytes 32-63
uint16_t member[16]; // Member: channels 1...16 uint16_t member[16]; // Member: channels 1...16
} }
md3x0Zone_t; __attribute__((packed)) md3x0Zone_t;
typedef struct typedef struct
{ {
@ -135,6 +135,6 @@ typedef struct
// Bytes 4-35 // Bytes 4-35
uint16_t name[16]; // Contact Name (Unicode) uint16_t name[16]; // Contact Name (Unicode)
} }
md3x0Contact_t; __attribute__((packed)) md3x0Contact_t;
#endif /* NVMDATA_MD3x0_H */ #endif /* NVMDATA_MD3x0_H */

View File

@ -114,7 +114,7 @@ typedef struct
// Bytes 32-63 // Bytes 32-63
uint16_t name[16]; uint16_t name[16];
} }
mduv3x0Channel_t; __attribute__((packed)) mduv3x0Channel_t;
typedef struct typedef struct
{ {
@ -124,7 +124,7 @@ typedef struct
// Bytes 32-63 // Bytes 32-63
uint16_t member_a[16]; // Member A: channels 1...16 uint16_t member_a[16]; // Member A: channels 1...16
} }
mduv3x0Zone_t; __attribute__((packed)) mduv3x0Zone_t;
typedef struct typedef struct
{ {
@ -134,7 +134,7 @@ typedef struct
// Bytes 96-223 // Bytes 96-223
uint16_t member_b[64]; // Member B: channels 1...64 uint16_t member_b[64]; // Member B: channels 1...64
} }
mduv3x0ZoneExt_t; __attribute__((packed)) mduv3x0ZoneExt_t;
typedef struct typedef struct
{ {
@ -149,6 +149,6 @@ typedef struct
// Bytes 4-35 // Bytes 4-35
uint16_t name[16]; // Contact Name (Unicode) uint16_t name[16]; // Contact Name (Unicode)
} }
mduv3x0Contact_t; __attribute__((packed)) mduv3x0Contact_t;
#endif /* NVMDATA_MDUV3x0_H */ #endif /* NVMDATA_MDUV3x0_H */

View File

@ -66,6 +66,7 @@ int _nvm_readChannelAtAddress(channel_t *channel, uint32_t addr)
W25Qx_sleep(); W25Qx_sleep();
// Check if the channel is empty // Check if the channel is empty
#pragma GCC diagnostic ignored "-Waddress-of-packed-member"
if(wcslen((wchar_t *) chData.name) == 0) return -1; if(wcslen((wchar_t *) chData.name) == 0) return -1;
channel->mode = chData.channel_mode - 1; channel->mode = chData.channel_mode - 1;
@ -298,6 +299,7 @@ int nvm_readZoneData(zone_t *zone, uint16_t pos)
W25Qx_sleep(); W25Qx_sleep();
// Check if zone is empty // Check if zone is empty
#pragma GCC diagnostic ignored "-Waddress-of-packed-member"
if(wcslen((wchar_t *) zoneData.name) == 0) return -1; if(wcslen((wchar_t *) zoneData.name) == 0) return -1;
/* /*
* Brutally convert channel name from unicode to char by truncating the most * Brutally convert channel name from unicode to char by truncating the most