For embedded, most of the magic happens in the linker, and proprietary binary image optimizer. Thus, indeed one must still declare some things as "volatile" to get repeatable behavior from some compilers.
Notably, some vendors will provide asic optimized standard/DSP libraries for each chip, and this blob is linked into your code. Note, the real fun happens when small firms implement something like math.h sin() incorrectly. =)
Adding layers of abstraction does not often make the problems easier, or safer to handle.
However, we all find our own workflows, and if the product is stable for a year... everyone is happy. =3
Notably, some vendors will provide asic optimized standard/DSP libraries for each chip, and this blob is linked into your code. Note, the real fun happens when small firms implement something like math.h sin() incorrectly. =)
Adding layers of abstraction does not often make the problems easier, or safer to handle.
However, we all find our own workflows, and if the product is stable for a year... everyone is happy. =3