Does anyone know if the following "naughty" (implementation dependent) construct would work "correctly" on the ARM Cortex M4, compiled with arm-gcc-embedded?
Well, I'd like to be able to increment the uint32_t, and then access the individual bytes through the union such that say if we have 0xAABBCCDD in the uint32_t, I'll have 0xAA in integer_high, 0xBB in integer_low, etc.
I can't even figure out why it would be considered "naughty" at all. The only implementation-dependent aspects I can see are the alignment of the parts (on the ARM, 8-bit, 16-bit and 32-bit types all have "natural" alignments), and the ordering of the bitfields (which is low bits first
- guaranteed by the ARM EABI, and thus consistent across compilers).
I would say "non-portable" rather than "naughty". "Naughty" implies that this might not work in some circumstances, or perhaps depends on undefined behaviour. This is merely non-portable and relies on implementation-dependent behaviour (which happens to be defined by the ARM EABI, and thus should apply to all ARM compilers).
Not necessary true, assuming you are using C11 (rather than C++), or gcc or clang, or any other compiler that supports anonymous structs as an extension. Since this is specifically for the ARM, and not meant to be portable, it is perhaps not unreasonable to use an extension that is available the most common tools for that target. But that's a decision for the OP to make.
No, these functions are not a good substitute. First, they do not do the same thing if "phase_accumulator" is used as a volatile - and such bitfield structures are usually used for hardware registers where volatile is relevant. Using the bitfields, accesses to the separate fields will be done as 8-bit accesses - using the functions, they will be 32-bit accesses.
Second, your functions give read-only access, not read-write access - another set is needed for writing. Those are messy.
sumg ting does not look correct? Assuming I understand what you're after.
struct _phase_acc { union { uint32_t phase_accumulator_full }; union { uint_8 integer_high:8, integer_low:8, frac_high:8, frc_low : 8; }; } phase_accumulator;
You can include a condition to test for the second union to determine the endious of the platform to correctly compile the code for the bit field order. The above struct should overlay to generate a single 32 bit image.
In that case you have the ordering wrong. The Cortex M devices are all strictly little-endian, and the EABI requires little-endian bitfield order too (it is possible for the bitfields to be in a different endian order than multi-byte data - the bitfield endianness is a choice for the ABI and/or compiler).
ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here.
All logos and trade names are the property of their respective owners.