Jump to content

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

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

Recommended Posts

10 минут назад, Ruslan1 сказал:

прямо сейчас нет. А вообще да, смогу, когда буду компилить чего-нить- с printf() и без него.

Приведите обязательно. И компилятор укажите. И выбранный вариант stdlib-а.

А то у меня куча проектов, везде printf() и нигде нет стеков больше пары КБ. И....... ничего  :wink:

Share this post


Link to post
Share on other sites
1 час назад, Димон Безпарольный сказал:

Помнится добавлял...

Галка Use MicroLIB - что с ней (установлена, нет?).

Цитата

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

Конечно ругается - те функции нужно определить где-то.

1. Создайте файл (имя любое).c - в него включите содержимое

Скрытый текст

#include <time.h>
#include <rt_sys.h>
#include <rt_misc.h>


__asm(".global __ARM_use_no_argv");
__asm(".global __use_no_semihosting");


const char __stdin_name[]  = ":tt";
const char __stdout_name[] = ":tt";
const char __stderr_name[] = ":tt";


FILEHANDLE _sys_open(const char *name, int mode) {
  return 1;
}

int _sys_close(FILEHANDLE file) {
  return 0;
}

char *_sys_command_string(char *cmd, int len) {
  return NULL;
}

int _sys_write(FILEHANDLE file, const unsigned char *buf, unsigned len, int mode) {
  return 0;
}

int _sys_read(FILEHANDLE file, unsigned char *buf, unsigned len, int mode) {
  return -1;
}

void _ttywrch(int ch) {
}

int _sys_istty(FILEHANDLE file) {
  return 0;
}

int _sys_seek(FILEHANDLE file, long pos) {
  return -1;
}

long _sys_flen(FILEHANDLE file) {
  return -1;
}

void _sys_exit(int retval) {
  while(1);
}

clock_t clock(void) {
  return 0;
}

void _clock_init(void) {
}

time_t time(time_t *tmr) {
  return 0;
}

int system(const char *str) {
  return 0;
}

char *getenv(const char *name) {
  return NULL;
}

void _getenv_init(void) {
}

2. Уберите в настройках проекта галку Use MicroLIB.
3. Стек - на Ваше усмотрение, размер кучи в startup можно установить в 0.

Share this post


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

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

Screenshot_1.thumb.png.9cd641d412de68934ff9ae5ef98b9c4e.png

Насколько я понимаю, этот процессор может работать только в thumb режиме, а команда BL.W - 32-разрядная, т.е. не реализована в процессоре. Скорее всего, при подключении printf подключается библиотека от другого процессора. Смотрите настройки линкера (должно быть -mthumb). Сравните с кодом по адресу 0x08000188 в программе без printf

Share this post


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

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

 

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

Не могу сказать потому что при шаге на BX R0 (F11, one step), дебуггер сам запускается.

Share this post


Link to post
Share on other sites
7 минут назад, novikovfb сказал:

Насколько я понимаю, этот процессор может работать только в thumb режиме, а команда BL.W - 32-разрядная, т.е. не реализована в процессоре.

Ну вообще-то не Thumb, а Thumb-2. Почитайте что это такое и почувствуйте разницу:  https://ru.wikipedia.org/wiki/ARM_(архитектура)#Набор_команд_Thumb-2

И 32-битных инструкций в Thumb-2 полно.

Share this post


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

Не могу сказать потому что при шаге на BX R0 (F11, one step), дебуггер сам запускается.

И кнопки "Stop" у него нет? В disassembly есть возможность breakpoint поставить?

Share this post


Link to post
Share on other sites
4 minutes ago, jcxz said:

Приведите обязательно. И компилятор укажите. И выбранный вариант stdlib-а.

А то у меня куча проектов, везде printf() и нигде нет стеков больше пары КБ. И....... ничего  :wink:

Ну, может и пара килобайт. Специально извращаться не буду, проще согласиться что преувеличил чуток :). У меня эти printf-vsnprintf-snprintf разные есть, может и на них попадал, а не на простом printf.

Share this post


Link to post
Share on other sites
5 минут назад, Ruslan1 сказал:

Ну, может и пара килобайт. Специально извращаться не буду, проще согласиться что преувеличил чуток :). У меня эти printf-vsnprintf-snprintf разные есть, может и на них попадал, а не на простом printf.

"пара КБ" - это весь стек. Естественно сам по себе printf() использует намного меньше. На IAR-овской библиотеке ни разу даже полкилобайта не видел. Обычно = вроде ~256 байт максимум.

PS: Да, если точнее - всегда использую не сами printf()/sprintf() и прочие производные, а корневую extern "C" int _Printf(void *(*)(void *, int), void *, const char *, va_list *);

Share this post


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

И кнопки "Stop" у него нет? В disassembly есть возможность breakpoint поставить?

Наверно не совем понимаю - stop есть, но когда нажимаешь проц уже на каких - то адресах левых. Beak тоже непонятно на какой адрес ставить.

Share this post


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

Наверно не совем понимаю - stop есть, но когда нажимаешь проц уже на каких - то адресах левых.

На каких именно? Что он выполняет?

 

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

Beak тоже непонятно на какой адрес ставить.

0x08000188

Share this post


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

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

Проект доступен по ссылке 

https://cloud.mail.ru/public/6mLD/bh6UcxUQY

9 мБ. 

 

Раскоментируйте строку 138 Main и получите описанный глюк.    //if(ComSwitch == 15) {printf("Ready\r");}

Share this post


Link to post
Share on other sites

Расскомментировал, собрал, удалив отсутствующие файлы в проекте, под симулятором управление переходит в main().

Однако, что кидается в глаза - остатки semihoshing-а видны: BKPT в __main() на системных вызовах. Галку Use MicroLIB поставьте.

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.