Подниму тему, никак не могу понять одну вещь.
Использую Keil, ARM Compiler V6.6.
Вот есть у меня внешняя периферия, которая начинается с адреса 0x50000000 к примеру.
Объявляю структуру
Код
volatile __attribute__((section(".ARM.__at_0x50000000"))) SystemRegs REGS;
Программа загружается во внешнюю память по адресу 0x10000000 и оттуда работает
в scatter файле пишу
Код
LR_IROM1 0x10000000 0x0000C800 { ; load region size_region
ER_IROM1 0x10000000 0x0000C800 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
*(.init_array) ; Section .init_array must be placed explicitly,
; otherwise it is shared between two regions, and
; the linker is unable to decide where to place it.
}
RW_IRAM1 0x20000000 UNINIT 0x0008000 { ; RW data
.ANY (+RW +ZI)
}
ER_PERIPHERAL 0x50000000 UNINIT 0x1000
{
*(.ARM.__at_0x50000000)
}
}
Теперь после запуска отладчика, программа валится в MemoryMngFault, судя по всему при отработке функции _decompress системной библиотеки.
Если убрать секцию ER_PERIPHERAL из scatter файла, и в определении переменной REGS, все компилится и запускается нормально, но REGS, естественно, располагается во внутренней памяти.
Отсюда я делаю вывод, что при загрузке компилятор пытается проинициализировать переменную REGS во внешней памяти, хотя доступ к ней еще не настроен, поэтому и валится в HardFault.
Но, ведь я указал, что эта область UNINIT, зачем он вообще туда лезет? И как правильно это дело настроить? Через указатели не очень хочется.