Jump to content

    
Димон Безпарольный

printf вешает контроллер STM32L471 намертво

Recommended Posts

Keil5. Копнул дебуггером насколько хватило знаний. И дело не в обращении к функции - дело даже в том, что если в коде присутствует хоть один printf, при старте процессор вообще не переходит в __main. 

Выполняется код:

                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0

И на выполнении BX R0 система улетает куда - то вкачель. Хотя сам R0 содержит тот же адрес 0x08000189. Закипел. Готов уже по всему коду заменить на sprintf. Вот он то работает. Может кто знает в чем грабли?

Share this post


Link to post
Share on other sites
9 minutes ago, Arlleex said:

Semihosting?

Помнится добавлял #pragma import(__use_no_semihosting_swi)

Но здесь ругается

Quote

..\BIN\Vagon.axf: Error: L6915E: Library reports error: __use_no_semihosting_swi was requested, but _sys_exit was referenced
..\BIN\Vagon.axf: Error: L6915E: Library reports error: __use_no_semihosting_swi was requested, but _sys_open was referenced
..\BIN\Vagon.axf: Error: L6915E: Library reports error: __use_no_semihosting_swi was requested, but _ttywrch was referenced

Semihosting is not supported by µVision. Thus, you cannot use semihosting SWI operations. In case you have to write your own retarget code, ensure that no semihosting functions of the C library get linked into your application. This is done by importing the symbol __use_no_semihosting_swi. This can be done in any C or assembler source file in your project. In a C module, use the #pragma directive:

Semihosting is not supported by µVision. Thus, you cannot use semihosting SWI operations. In case you have to write your own retarget code, ensure that no semihosting functions of the C library get linked into your application. This is done by importing the symbol __use_no_semihosting_swi. This can be done in any C or assembler source file in your project. In a C module, use the #pragma directive:

 

Edited by Димон Безпарольный

Share this post


Link to post
Share on other sites
47 minutes ago, Димон Безпарольный said:

И на выполнении BX R0 система улетает куда - то вкачель. Хотя сам R0 содержит тот же адрес 0x08000189.

Сравните код, в который уходит по BX R0 при наличии printf и без него. Возможно, printf тянет за собой какую-то библиотеку с выводом на консоль, а эта библиотека не под Вашу систему. Или просто надо определить какую-то функцию вывода байта в консоль самостоятельно, вот и падает на заглушке.

Share this post


Link to post
Share on other sites
2 minutes ago, aaarrr said:

1. Посмотреть map

2. Пройти __main в пошаговом режиме

В том то и дело что в пошаговом режиме после команды BX R0 как я выше писал дебуггер вылетает вкачель - запускается сам.

Share this post


Link to post
Share on other sites
1 minute ago, Димон Безпарольный said:

В том то и дело что в пошаговом режиме после команды BX R0 как я выше писал дебуггер вылетает вкачель - запускается сам.

а что записано по адресу 0x08000188?

Share this post


Link to post
Share on other sites
7 minutes ago, Димон Безпарольный said:

В том то и дело что в пошаговом режиме после команды BX R0 как я выше писал дебуггер вылетает вкачель - запускается сам.

Окошко с дизассемблером попробуйте открыть вместо исходника.

Share this post


Link to post
Share on other sites
18 minutes ago, novikovfb said:

а что записано по адресу 0x08000188?

Адреса 189 нет в обоих вариантах - рабочем(когда код printf не компилируется) и не рабочем. По адресу 0x08000188 записано 0x08000188 F000F802  BL.W          __scatterload (0x08000190)F1C4)(0x08001522). Но в R0 грузится 189 адрес.

22 minutes ago, aaarrr said:

Окошко с дизассемблером попробуйте открыть вместо исходника.

Screenshot_1.thumb.png.9cd641d412de68934ff9ae5ef98b9c4e.png

Share this post


Link to post
Share on other sites
16 minutes ago, Димон Безпарольный said:

Но в R0 грузится 189 адрес

Так мы в thumb'е, что ему еще грузить?

 

1 hour ago, Димон Безпарольный said:

система улетает куда - то вкачель

А конкретнее? Левый адрес, HF?

Share this post


Link to post
Share on other sites

наверняка с памятью проблемы (не хватает стека), принтф может и десяток кил RAM съесть. Или вообще просто совпадение и printf() не виноват. Я бы так сделал:

1) на место printf() поставить функцию-заглушку и убедится что оно работает

2) добавить минимальный printf(" ");  Если не работает- то проверять опять выделение памяти и настройки компилятора и линкера.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.