jcxz 0 Posted January 25 · Report post 10 минут назад, Ruslan1 сказал: прямо сейчас нет. А вообще да, смогу, когда буду компилить чего-нить- с printf() и без него. Приведите обязательно. И компилятор укажите. И выбранный вариант stdlib-а. А то у меня куча проектов, везде printf() и нигде нет стеков больше пары КБ. И....... ничего Quote Ответить с цитированием Share this post Link to post Share on other sites
Arlleex 0 Posted January 25 · Report post 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. Quote Ответить с цитированием Share this post Link to post Share on other sites
novikovfb 0 Posted January 25 · Report post 36 minutes ago, Димон Безпарольный said: Адреса 189 нет в обоих вариантах - рабочем(когда код printf не компилируется) и не рабочем. По адресу 0x08000188 записано 0x08000188 F000F802 BL.W __scatterload (0x08000190)F1C4)(0x08001522). Но в R0 грузится 189 адрес. Насколько я понимаю, этот процессор может работать только в thumb режиме, а команда BL.W - 32-разрядная, т.е. не реализована в процессоре. Скорее всего, при подключении printf подключается библиотека от другого процессора. Смотрите настройки линкера (должно быть -mthumb). Сравните с кодом по адресу 0x08000188 в программе без printf Quote Ответить с цитированием Share this post Link to post Share on other sites
Димон Безпарольный 0 Posted January 25 · Report post 21 minutes ago, aaarrr said: Так мы в thumb'е, что ему еще грузить? А конкретнее? Левый адрес, HF? Не могу сказать потому что при шаге на BX R0 (F11, one step), дебуггер сам запускается. Quote Ответить с цитированием Share this post Link to post Share on other sites
Arlleex 0 Posted January 25 · Report post 3 минуты назад, novikovfb сказал: Насколько я понимаю... Плохо понимаете Thumb(-2) - это не только 16-битные инструкции. Quote Ответить с цитированием Share this post Link to post Share on other sites
Димон Безпарольный 0 Posted January 25 · Report post 5 minutes ago, novikovfb said: -mthumb Линкер ругается на такой ключ ..\BIN\Vagon.axf: error: L3900U: Unrecognized option '-mthumb'. Quote Ответить с цитированием Share this post Link to post Share on other sites
jcxz 0 Posted January 25 · Report post 7 минут назад, novikovfb сказал: Насколько я понимаю, этот процессор может работать только в thumb режиме, а команда BL.W - 32-разрядная, т.е. не реализована в процессоре. Ну вообще-то не Thumb, а Thumb-2. Почитайте что это такое и почувствуйте разницу: https://ru.wikipedia.org/wiki/ARM_(архитектура)#Набор_команд_Thumb-2 И 32-битных инструкций в Thumb-2 полно. Quote Ответить с цитированием Share this post Link to post Share on other sites
aaarrr 0 Posted January 25 · Report post 5 minutes ago, Димон Безпарольный said: Не могу сказать потому что при шаге на BX R0 (F11, one step), дебуггер сам запускается. И кнопки "Stop" у него нет? В disassembly есть возможность breakpoint поставить? Quote Ответить с цитированием Share this post Link to post Share on other sites
Ruslan1 0 Posted January 25 · Report post 4 minutes ago, jcxz said: Приведите обязательно. И компилятор укажите. И выбранный вариант stdlib-а. А то у меня куча проектов, везде printf() и нигде нет стеков больше пары КБ. И....... ничего Ну, может и пара килобайт. Специально извращаться не буду, проще согласиться что преувеличил чуток :). У меня эти printf-vsnprintf-snprintf разные есть, может и на них попадал, а не на простом printf. Quote Ответить с цитированием Share this post Link to post Share on other sites
jcxz 0 Posted January 25 · Report post 5 минут назад, Ruslan1 сказал: Ну, может и пара килобайт. Специально извращаться не буду, проще согласиться что преувеличил чуток :). У меня эти printf-vsnprintf-snprintf разные есть, может и на них попадал, а не на простом printf. "пара КБ" - это весь стек. Естественно сам по себе printf() использует намного меньше. На IAR-овской библиотеке ни разу даже полкилобайта не видел. Обычно = вроде ~256 байт максимум. PS: Да, если точнее - всегда использую не сами printf()/sprintf() и прочие производные, а корневую extern "C" int _Printf(void *(*)(void *, int), void *, const char *, va_list *); Quote Ответить с цитированием Share this post Link to post Share on other sites
Димон Безпарольный 0 Posted January 25 · Report post 11 minutes ago, aaarrr said: И кнопки "Stop" у него нет? В disassembly есть возможность breakpoint поставить? Наверно не совем понимаю - stop есть, но когда нажимаешь проц уже на каких - то адресах левых. Beak тоже непонятно на какой адрес ставить. Quote Ответить с цитированием Share this post Link to post Share on other sites
aaarrr 0 Posted January 25 · Report post 21 minutes ago, Димон Безпарольный said: Наверно не совем понимаю - stop есть, но когда нажимаешь проц уже на каких - то адресах левых. На каких именно? Что он выполняет? 21 minutes ago, Димон Безпарольный said: Beak тоже непонятно на какой адрес ставить. 0x08000188 Quote Ответить с цитированием Share this post Link to post Share on other sites
Arlleex 0 Posted January 25 · Report post Проект лучше сюда скиньте голый, без других исходников - но достаточный, чтобы воссоздать проблему. Quote Ответить с цитированием Share this post Link to post Share on other sites
Димон Безпарольный 0 Posted January 25 · Report post 14 minutes ago, Arlleex said: Проект лучше сюда скиньте голый, без других исходников - но достаточный, чтобы воссоздать проблему. Проект доступен по ссылке https://cloud.mail.ru/public/6mLD/bh6UcxUQY 9 мБ. Раскоментируйте строку 138 Main и получите описанный глюк. //if(ComSwitch == 15) {printf("Ready\r");} Quote Ответить с цитированием Share this post Link to post Share on other sites
Arlleex 0 Posted January 25 · Report post Расскомментировал, собрал, удалив отсутствующие файлы в проекте, под симулятором управление переходит в main(). Однако, что кидается в глаза - остатки semihoshing-а видны: BKPT в __main() на системных вызовах. Галку Use MicroLIB поставьте. Quote Ответить с цитированием Share this post Link to post Share on other sites