I have a configuration structure I would like to save on the internal flash of ARM cortex M3.
According to the specifications, the data save in the internal flash, must be aligned to 32bit.
Because I have lot's of boolean, and chars in my structure,I don't want to use 32bits to store 8 bits... I decided to pack the structure using the __packed
preprocessor pragma, Then When I save it as a whole structure, I just have to make sure that the structure size is divisible by 4 (4 bytes = 32bits), I do it by adding padding bytes if needed.
Currently, during development I alter the structure a lot, and to make it aligned with the 32 bits, I need to change the padding bytes all the time.
Currently, the structure look slike this
typedef __packed struct
{
uint8_t status;
uint16_t delay;
uint32_t blabla;
uint8_t foo[5];
uint8_t padding[...] // this has to be changed every time I alter the structure.
} CONFIG;
Is there a better way to achieve what I'm doing ? I'm quite new in Embedded programming, and I want to make sure that I'm not doing mistakes.
Edit: Please note. The data is persisted in the end of the internal-flash, so omitting the padding will not work...
Solution 1: You could put it inside a union containing your structure and an array of characters:
union
{
CONFIG config;
uint8_t total_size[32];
} my_union;
Perhaps this is an idea:
typedef __packed struct {
uint8_t status;
uint16_t delay;
uint32_t blabla;
uint8_t foo[5];
} CONFIG;
typedef __packed struct {
CONFIG cfg;
uint8_t padding[4 - (sizeof(CONFIG) % 4)]
} CONFIGWRAPPER;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With