ELVEES R&D Center 0 31 марта, 2020 Опубликовано 31 марта, 2020 · Жалоба Ну, как минимум навскидку ничего критичного в коде нет. Так что надо смотреть настройки размещения в памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Digi 0 31 марта, 2020 Опубликовано 31 марта, 2020 · Жалоба Очередной косяк найден. Оказалось, что переменные объявлялись несколько раз, из-за этого их адреса перекрывались. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ELVEES R&D Center 0 1 апреля, 2020 Опубликовано 1 апреля, 2020 · Жалоба По итогам совместной проработки обнаружили, что проблема была в пересекающихся адресах секций .bss и .sbss: Вот начало секции .bss: Disassembly of section .bss: 80004028 <testcnt>: 80004028: 00000000 nop А вот – секция sbss: Disassembly of section .sbss: 80004038 <_edata>: 80004038: 00000000 nop Переменные, находящиеся в разных секциях, имели одинаковые адреса. Из-за этого и портились те переменные, которые не ожидались. Само же пересечение секций было вызвано ошибкой в скрипте линковки: .data : { __data_start = . ; /* .eh_frame = .; */ _edata = .; } > sdram_c .bss ADDR (.data) + SIZEOF (.data) (NOLOAD) : { __bss_start = .; . = ALIGN (64 / 8); } > sdram_c Секция же sbss ставится линковщиком сразу после .data, без указания в скрипте линковки. Для решения проблемы оказалось достаточно изменить объявление секции bss: .data : { __data_start = . ; /* .eh_frame = .; */ _edata = .; } > sdram_c .bss (NOLOAD) : { __bss_start = .; . = ALIGN (64 / 8); } > sdram_c Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться