Я занимаюсь своим первым встроенным проектом C на работе, и я столкнулся с поведением, которое меня озадачивает.
Я использую KEIL uVision 5 IDE и нашел, как сопоставить пространство памяти специальных регистров функций (SFR) по следующей ссылке http://www.keil.com/support/docs/2998.htm
Что я и сделал со следующими двумя фрагментами файла
dataStructures.h
typedef unsigned char byte;
typedef struct DAC {
byte loc[15];
} DAC;
extern DAC DAC_MAP;
DAC_MAP.a51
PUBLIC DAC_MAP
DAC_MAP DATA 0xB9
END
Затем у меня есть код C, который работает только тогда, когда используется буквальное значение 1.
byte i = 1;
DAC_MAP.loc[i] = value; // Does not write to the SFR
DAC_MAP.loc[1] = value; // Writes to the SFR
Я действительно хотел бы иметь возможность писать в местоположение по индексу и не писать большие случаи переключения для решения этой проблемы.
Любые мысли о том, почему это происходит?
DAC_MAP.a51
PUBLIC DAC_MAP
DAC_MAP DATA 0xB9
END
driver.c
#include <DP8051XP.H>
typedef unsigned char byte;
typedef struct DAC {
byte loc[15];
} DAC;
extern DAC DAC_MAP;
int main(void) {
byte i = 1;
DAC_MAP.loc[i] = 0xAA; // Does not write to the SFR
DAC_MAP.loc[1] = 0xAA; // Writes to the SFR
return 0;
}
Когда я запускаю этот код в отладчике KEIL uVision 5, вы можете видеть на карте памяти, что когда индексация выполняется переменной, изменений нет, но когда используется литерал, значение изменяется, как и ожидалось.
DAC_MAP.loc[i]
или дажеDAC_MAP.loc[1]
, не имеет смысла с SFR, и попытка вообще использовать массив, вероятно, плохая идея. - person user2357112 supports Monica   schedule 05.06.2017