Алексей ВМ1 1 25 сентября, 2021 Опубликовано 25 сентября, 2021 (изменено) · Жалоба Добрый день! Портировал проект с STM32F103V8 на STM32F103ZC. Подключил в проект startup_stm32f10x_hd.s вместо startup_stm32f10x_md.s, определил дефайн STM32F10X_HD. В SystemInit() прога заходит и инциализирует клоки, но в main() уже не заходит. Код занимает 63кБ из 256 доступных, ChipID проверил - чип не подделка. В чем может быть причина? Изменено 25 сентября, 2021 пользователем Алексей ВМ1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Алексей ВМ1 1 25 сентября, 2021 Опубликовано 25 сентября, 2021 (изменено) · Жалоба При переходе на main() возникает HardFault_Handler(), выставляется бит IACCVIOL в MMFSR. Причины 1 = the processor attempted an instruction fetch from a location that does not permit execution. The PC value stacked for the exception return points to the faulting instruction. The processor has not written a fault address to the MMFAR. This fault condition occurs on any attempt of instruction fetches to an XN (eXecute Never) region, even when the MPU is disabled or not present. Potential reasons: a) Branch to regions that are not defined in the MPU or defined as non-executable. b) Invalid return due to corrupted stack content. c) Incorrect entry in the exception vector table. Яснее не стало, отчего вылетает. Изменено 25 сентября, 2021 пользователем Алексей ВМ1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
heavyC1oud 0 25 сентября, 2021 Опубликовано 25 сентября, 2021 · Жалоба побольшн информации, что за программа, что за плата, какие клоки, как определили что заходит в systemInit, почему тем же способом, каким определили заходи в инит не определить куда программа идет дальше. Пальцем в небо предположу, что инит клоков неверный и программа зависает в цикле ожидания какого-нибудь флага готовности Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Алексей ВМ1 1 25 сентября, 2021 Опубликовано 25 сентября, 2021 (изменено) · Жалоба 7 минут назад, heavyC1oud сказал: побольшн информации, что за программа, что за плата, какие клоки, как определили что заходит в systemInit, почему тем же способом, каким определили заходи в инит не определить куда программа идет дальше. Пальцем в небо предположу, что инит клоков неверный и программа зависает в цикле ожидания какого-нибудь флага готовности Среда разработки - Keil, хожу отладчиком, в systemInit() захожу нормально, все флаги готовности клоков выставляются, потом иду дальше по ассемблеру, в месте, помеченном '>' прога зацикливается. IMPORT __main IMPORT SystemInit LDR R0, =SystemInit BLX R0 LDR R0, =__main > BX R0 В предыдущем сообщении HardFault_Handler() возникает, если я определяю Reset_Handler(). Если Reset_Handler убрать, то и HardFault_Handler() не возникает, прога зацикливается без всяких ошибок, в main() не входит Изменено 25 сентября, 2021 пользователем Алексей ВМ1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
heavyC1oud 0 25 сентября, 2021 Опубликовано 25 сентября, 2021 · Жалоба 7 минут назад, Алексей ВМ1 сказал: При переходе на main() возникает HardFault_Handler(), выставляется бит IACCVIOL в MMFSR. скрипт линкера стоит заменить Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Алексей ВМ1 1 25 сентября, 2021 Опубликовано 25 сентября, 2021 · Жалоба 1 минуту назад, heavyC1oud сказал: скрипт линкера стоит заменить HardFault_Handler() возникает, если я определяю Reset_Handler(). Если Reset_Handler убрать, то и HardFault_Handler() не возникает, прога зацикливается без всяких ошибок, в main() не входит Выкинул из main() все, оставил лишь for(;;) - работает. Проблема, выходит, в размере кода или в размере используемой ОЗУ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 25 сентября, 2021 Опубликовано 25 сентября, 2021 · Жалоба В обработчике HF можно узнать значения регистров R0, R1, R2, R3, R12, LR, PC, XPSR. Например, по PC (и LR) в листинге можно найти кусок кода с проблемой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Алексей ВМ1 1 25 сентября, 2021 Опубликовано 25 сентября, 2021 (изменено) · Жалоба 1 час назад, adnega сказал: В обработчике HF можно узнать значения регистров R0, R1, R2, R3, R12, LR, PC, XPSR. Например, по PC (и LR) в листинге можно найти кусок кода с проблемой. Проблема очень странная: Program Size: Code=46260 RO-data=864 RW-data=1556 ZI-data=8844 - работает Program Size: Code=62144 RO-data=876 RW-data=1744 ZI-data=10000 - не переходит на main() У STM32F103ZC 256 kB ROM и 48 kB RAM, то есть памяти достаточно. И в обработчик HF не вылетает. LDR R0, =__main BX R0 __main 0x08000130 Но при выполнении инструкции BX R0 в R0 0x08000131. UPD: Если разрешить использование MicroLib, то все работает. Может из-за того, что размер кода уменьшился: Program Size: Code=56812 RO-data=864 RW-data=1740 ZI-data=10164 UPD: С включенной оптимизацией тоже работает. Program Size: Code=54564 RO-data=864 RW-data=1728 ZI-data=10280 Похоже проблема с программной памятью Итог: Причина глюка - наличие в коде функции printf() без объявления функции int fputc(int ch, FILE *f); Изменено 25 сентября, 2021 пользователем Алексей ВМ1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 25 сентября, 2021 Опубликовано 25 сентября, 2021 · Жалоба 6 часов назад, Алексей ВМ1 сказал: Итог: Причина глюка - наличие в коде функции printf() без объявления функции int fputc(int ch, FILE *f); Я бы еще корректность инициализации кучи проверил. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Алексей ВМ1 1 25 сентября, 2021 Опубликовано 25 сентября, 2021 · Жалоба 17 минут назад, adnega сказал: Я бы еще корректность инициализации кучи проверил. Размер кучи? Инициализация же происходит в startup_stm32f10x_hd.s: IF :DEF:__MICROLIB EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit ELSE IMPORT __use_two_region_memory EXPORT __user_initial_stackheap __user_initial_stackheap LDR R0, = Heap_Mem LDR R1, =(Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 25 сентября, 2021 Опубликовано 25 сентября, 2021 · Жалоба 54 минуты назад, Алексей ВМ1 сказал: Размер кучи? Инициализация же происходит в startup_stm32f10x_hd.s: Да, но размер и положение задается в скрипте линкера (и в настройках проекта?). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться