Нужно написать полностью собственную первичную инициализацию вместо __iar_program_start. Попытался сделать это, как делал в GCC - .bss от начала до конца забивается нулями, а .data_init (flash) копируется в .data (sram). Тут обнаружилась первая странность - данные в .data_init начинаются не с начала секции, а с __section_begin(".data_init") + 1 байт. (т.е. по выравненному адресу). Сдвиг начального адреса на этот один байт ситуацию улучшил, но не полностью. Большая часть данных теперь инициализировалась нормально, но в некоторых структурах (связанных с usb) оказался какой-то жуткий мусор, в результате чего прошивка стала падать в из прерывания usb в FaultISR из-за обращения по несуществующему адресу. Пытался дизассемблировать встроенную иаровскую инициализацию, но там в части копирования данных какая-то жесть. Разобраться полностью сходу не удалось. Может кто уже сталкивался ? По какому принципу у IAR уложены данные в память ?
Контроллер LM3S5R31
|