Я хочу сделать предварительное определение некоторого массива данными из определенного места памяти, но он почему-то не работает.
// Location of first byte in memory
#define MEMORY 0x7800
// Take a data from memory to array which will be containing the data
const uint8_t *MemArray[3] = { (const uint8_t *)MEMORY,
(const uint8_t *)MEMORY+1,
(const uint8_t *)MEMORY+3 };
// Now, I want to define some another array with values upper, but it not working
const uint8_t TargetArray[7] = { 1,2,3,4,
(const uint8_t)(*MemArray[0]),
(const uint8_t)(*MemArray[1]),
(const uint8_t)(*MemArray[2]) };
Кто-нибудь знает, как это сделать?
Компилятор получает предупреждение и ошибку в строках (const uint8_t) (* MemArray [i])
Предупреждение [Pe191]: идентификатор типа не имеет смысла в типе типа D:..\Source\file.c
Ошибка [Pe028]: выражение должно иметь постоянное значение D:..\Source\file.c
Я использую компилятор IAR для ядра 8051
Значения инициализатора должны быть постоянной времени компиляции. Таким образом, они не могут зависеть от значений, считанных из памяти, компилятор должен иметь возможность генерировать инициализированный массив.
Для этого нужно указать фактический код. Просто сделайте это сначала в main()
, перед остальной частью вашей программы.
Адреса связаны с очень медленным устройством? В противном случае вы можете просто указать точку указателя const на это место и зачитать значения по желанию.
Что-то вроде этого:
#define MEMORY 0x7800
const struct __attribute__ ((__packed__)){
uint8_t foo;
uint8_t bar;
uint8_t __reserved;
uint8_t baz;
} *mem = (const void *)MEMORY;
Вы можете прочитать местоположения mem->foo
и т.д.
Примечание. Точный синтаксис для структурированной упаковки меняется, в этом примере используется GCC.