ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
11 июля
357045
VVB (26.09.2012 10:03 - 10:12, просмотров: 7651)
Вопрос по 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);