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

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

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

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

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

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

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


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

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.

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


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

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

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


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

21 minutes ago, aaarrr said:

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

 

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

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

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


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

3 минуты назад, novikovfb сказал:

Насколько я понимаю...

Плохо понимаете:wink: Thumb(-2) - это не только 16-битные инструкции.

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


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

5 minutes ago, novikovfb said:

-mthumb

Линкер ругается на такой ключ ..\BIN\Vagon.axf: error: L3900U: Unrecognized option '-mthumb'.

 

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


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

7 минут назад, novikovfb сказал:

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

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

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

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


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

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

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

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

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


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

4 minutes ago, jcxz said:

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

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

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

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


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

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

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

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

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

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


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

11 minutes ago, aaarrr said:

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

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

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


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

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

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

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

 

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

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

0x08000188

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


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

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

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


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

14 minutes ago, Arlleex said:

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

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

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

9 мБ. 

 

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

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


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

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

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

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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