I just found an insidious and disconcerting characteristic of the uVision3 ARM compiler V3.12a. I have inherited C code to migrate to the ARM processor. This C code uses unsigned char pointers quite liberally to pass the address of data back and forth. The code, of course, casts these generic unsigned char pointers to various data types to access the underlying data. I have found that if the unsigned char point happens to be pointing at a odd address and it is cast to a short type pointer (e.g., "*(SHORT*)p"), the compiler will resolve the address the previous even address. For a simplistic example, if the address of unsigned char *p happens to be 0x5 and the following code is executed:
unsigned char *p; ... *(unsigned short*)p = 0;
general on aligned architectures: 1) even if not aligned, treat as aligned (speed and portability) 2) arrange structures so that first all longs, than all shorts, then all chars. that way you get minimum padding 3) arrange variables (the global block and the block for each function) the same way for the same reason. OR waste all the memory you want and just align where and as needed. Erik