We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
There is compiler optimisation (O2) which you may want to be aware of.
A while back (Oct 2010) I found a compiler optimisation bug with optimisation level 2 (O2) in MDK V4.12 (Armcc V4.1.0.481). The problem does not occur in MDK V4.11 (Armcc 4.0.0.728).
It appears that in some situations the compiler locates two local variables at the same address. I sent some demo code to Keil and they acknowledged the problem with the following explanation:
It seems like the compiler treats 8bit writes wrongly when analyzing the lifetime of a local variable. It assumes that a whole 32bit value is written and so assumes the other 3bytes in a word are destroyed/rewritten as well. So it can happen local objects share the same location as in this simplified example:
typedef union { char arr[4]; int val; } union_t; void test(char val1, char val2, int *ptr) { union_t a, b; a.arr[0] = val1; a.arr[1] = val1; a.arr[2] = val1; a.arr[3] = val1; ptr[0] = a.val; b.arr[0] = val2; b.arr[1] = val2; b.arr[2] = val2; b.arr[3] = val2; ptr[1] = b.val; a.arr[0] = val2; ptr[2] = a.val; }
This has not been fixed in MDK 4.14.