странное поведени компилятора заключаеться в неверном интерпретировании оператора пост-дикремента. Почему так происходит - непонятно.
Код
//Header file
__near __no_init volatile struct
{
unsigned int Result;
enum {K2 = 2, K4 = 4, K8 = 3, K16 = 4, K32 = 5, K64 = 6, K128 = 7} PS : 3;
unsigned char IE : 1, IF : 1, FR : 1, SC : 1, EN : 1;
enum {ADC0, ADC1, ADC2, ADC3, ADC4, ADC5, ADC6, ADC7, VBG = 0x0E, GND = 0x0F} MUX : 4;
unsigned char : 1, LAR : 1;
enum {AREF = 0, AVCC = 1, Internal = 3} REF : 2;
} ADC @ 0x24;
//Source file
ADC.MUX = 3;
Array[ADC.MUX++] = ADC.MUX; // почему? [3] = 4
ADC.MUX = 4;
Array[ADC.MUX] = ADC.MUX++; // [4] = 4 mux = 5 тут ок
__near __no_init volatile struct
{
unsigned int Result;
enum {K2 = 2, K4 = 4, K8 = 3, K16 = 4, K32 = 5, K64 = 6, K128 = 7} PS : 3;
unsigned char IE : 1, IF : 1, FR : 1, SC : 1, EN : 1;
enum {ADC0, ADC1, ADC2, ADC3, ADC4, ADC5, ADC6, ADC7, VBG = 0x0E, GND = 0x0F} MUX : 4;
unsigned char : 1, LAR : 1;
enum {AREF = 0, AVCC = 1, Internal = 3} REF : 2;
} ADC @ 0x24;
//Source file
ADC.MUX = 3;
Array[ADC.MUX++] = ADC.MUX; // почему? [3] = 4
ADC.MUX = 4;
Array[ADC.MUX] = ADC.MUX++; // [4] = 4 mux = 5 тут ок
Код составлен для тестирования. Смысла в нем искать не надо. Проблема заключаеться в том, что компилятор некоректно выполняет вторую строчку src. файла (Array[ADC.MUX++] = ADC.MUX;), в результате чего в третьем элементе массива записывается значение 4! Я уж потерял веру в Си, пока разбирался с проблемой.
Может подобное свойство - следствие использования облости ввода-вывода? НО! замена переменной ADC.MUX на DDRD(к примеру) приводит к нормальной работе: Array[3] = 3, Array[4] = 4.
при этом компиялтор, как по мне, безосновательно выругался, когда компилировал этот код:
Цитата
Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement E:\Mazilla\Projects\IAR AVR ATMega8\main.c 59
Замечу вуругался на оба варианта, с ADC.MUX и с DDRD (точнее PORT.D.DIR.Value

Кстати, может кому понравится такой подход - организация регистров перефирии в смысловые структуры (ах как не хватает классов си++)? Если кто использует такой подход - поделитись опытом.