VVB (26.09.2012 10:03 - 10:12, просмотров: 7803)
Вопрос по Keil (scatterload файлы) Задача: разместить MAC адрес платы в последней странице flash, чтобы производство могло прошивать программу отдельно, MAC адрес отдельно.
Моя реализация.
в исходнике есть такой код
#pragma arm section zidata = "mac_address"
static u8_t mac_addr[6];
#pragma arm section zidata
.....
/* Populates the MAC address for the board */
void board_get_macaddr(u8_t *macaddr)
{
memcpy(macaddr, mac_addr, sizeof(mac_addr));
}
Далее имеется scatter-файл со следующим содержимым:
ER1 0x38000 UNINIT 0x8000 {
* (mac_address)
}
однако, кейл считает, что массив mac_addr[] относится не к zidata а к rwdata, и не помещает его в секцию mac_address.
Ладно, хрен с этим уродом, давай я объявлю массив по-другому
#pragma arm section rwdata = "mac_address"
static u8_t mac_addr[6];
#pragma arm section rwdata
Вроде всё ОК, массив размещается в секции в нужном мне адресе.
Но, блядь, он пытается инициализироваться при запуске программы несмотря на атрибут UNINIT. Он пытается записать flash в функции __scatterload_copy и возникает исключение. У меня такое подозрение, что он это делает из-за того что считает массив rwdata.
Странно что в других модулях есть подобным же образом объявленные переменные и keil их относит к zidata.
Сделать массив глобальным -- не помогает.
Может быть, кто-то ходил по этим граблям?
Пока что сделал так как мне сильно не хочется, т.к. в дополнение к MAC адресу там будет храниться более сложная структура.
memcpy(macaddr, (void *)0x38000, 6);