Перейти к содержанию
    

Прога не непереходит на main()

Добрый день!

Портировал проект с STM32F103V8 на STM32F103ZC. Подключил в проект startup_stm32f10x_hd.s вместо startup_stm32f10x_md.s, определил дефайн STM32F10X_HD. В SystemInit() прога заходит и инциализирует клоки, но в main() уже не заходит. Код занимает 63кБ из 256 доступных, ChipID проверил - чип не подделка. В чем может быть причина?

 

Изменено пользователем Алексей ВМ1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При переходе на 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.

 

Яснее не стало, отчего вылетает.

Изменено пользователем Алексей ВМ1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

побольшн информации, что за программа, что за плата, какие клоки, как определили что заходит в systemInit, почему тем же способом, каким определили заходи в инит не определить куда программа идет дальше. Пальцем в небо предположу, что инит клоков неверный и программа зависает в цикле ожидания какого-нибудь флага готовности 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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() не входит

Изменено пользователем Алексей ВМ1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 минут назад, Алексей ВМ1 сказал:

При переходе на main() возникает HardFault_Handler(), выставляется бит IACCVIOL в MMFSR.

скрипт линкера стоит заменить

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, heavyC1oud сказал:

скрипт линкера стоит заменить

HardFault_Handler() возникает, если я определяю Reset_Handler(). Если Reset_Handler убрать, то и HardFault_Handler() не возникает, прога зацикливается без всяких ошибок, в main() не входит

 

Выкинул из main() все, оставил лишь for(;;) - работает.  Проблема, выходит, в размере кода или в размере используемой ОЗУ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В обработчике HF можно узнать значения регистров R0, R1, R2, R3, R12, LR, PC, XPSR. Например, по PC (и LR) в листинге можно найти кусок кода с проблемой.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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);

 

 

Изменено пользователем Алексей ВМ1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 часов назад, Алексей ВМ1 сказал:

Итог: Причина  глюка - наличие в коде функции printf() без объявления функции int fputc(int ch, FILE *f);

Я бы еще корректность инициализации кучи проверил.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

54 минуты назад, Алексей ВМ1 сказал:

Размер кучи? Инициализация же происходит в startup_stm32f10x_hd.s:

Да, но размер и положение задается в скрипте линкера (и в настройках проекта?).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...