Эх, когда же начнут читать документацию?
Volatile означает, что компилятору и оптимизатору запрещается делать какие-либо предположения относительно значения данной переменной, и обязательно необходимо читать эту переменную перед тем, как делать с ней что-либо (конечно, если эта переменная находится не в регистре, а в памяти). Больше ничего volatile не означает.
Откуда берется предупреждение: в вашем коде присутствует конструкция
Area_Width = Line_Lenght1 + Line_Lenght2;
в которой все переменные - volatile.
Если с присваиванием никаких вопросов у компилятора не возникает, то относительно конструкции Line_Length1 + Line_Length2 компилятор не знает, в каком порядке нужно прочитать значения переменных перед выполнением сложения - сначла первую, потом вторую, или наоборот. Очевидно, что результат может зависить от порядка, если значения переменных меняются, например, в ISR. И именно об этом компилятор вам и выводит предупреждение: он не может дать гарантии, в каком порядке произойдет чтение этих переменных перед сложением.
А теперь внимание, советы, которые здесь давали.
Ни в коем случае не стоит делать такой код!
Цитата
Area_Width = Line_Length1;
Area_Width += Line_Length2;
Он скомпилируется примерно в такое:
Загрузить Line_Length1 в регистр
Загрузить регистр в Area_Width
Загрузить Area_Width в регистр (это компилятор делает, так как Area_Width - тоже volatile и он мог измениться между этими двумя инструкциями)
Загрузить Line_Length2 в регистр
Сложить
Загрузить регистр в Area_Width
Как сделать правильно:
Цитата
register char tmp
tmp = Line_Length1;
Area_Width = tmp + Line_Length2;
Это скомпилируется в:
загрузить Line_Length1 в регистр
загрузить Line_Length2 в регистр
Сложить
Загрузить регистр в Area_Width
А вообще, почитайте документацию от IAR'а, которая идет в PDF'ах. Там много интересного пишут.