jenya7 0 6 июля, 2018 Опубликовано 6 июля, 2018 (изменено) · Жалоба Все работало вдруг началась проблема. Принимаю команду с терминала if (usart1_rx_ready) { usart1_rx_ready = 0; PARSER_ParseCommand(usart1_rx_buf); } ставлю точку останова на PARSER_ParseCommand(usart1_rx_buf); - вижу пришла красивая команда с '\0' в конце. захожу внутрь функции uint32_t PARSER_ParseCommand(char *str) { uint32_t com_found = 0; uint32_t len = 0; len = strlen(str); char temp_str[len]; strlen вычисляет длину строки - 504588880 - и естественно при алокации - char temp_str[len] - выпадаем в хард фолт. Ну и кто он (IAR) после этого? Изменено 6 июля, 2018 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 6 июля, 2018 Опубликовано 6 июля, 2018 · Жалоба [/code]uint32_t len = 0; len = strlen(str); char temp_str[len];[/code] Как он у вас вообще такой бред скомпилил?? :wacko: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 6 июля, 2018 Опубликовано 6 июля, 2018 (изменено) · Жалоба Как он у вас вообще такой бред скомпилил?? :wacko: этот бред давно работает. непонятно почему сейчас перестал. поставте галку VLA в настройках Изменено 6 июля, 2018 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 6 июля, 2018 Опубликовано 6 июля, 2018 · Жалоба Как он у вас вообще такой бред скомпилил?? :wacko: C99 это разрешает. Проверял - реально на стеке выделяет места сколько попросишь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 6 июля, 2018 Опубликовано 6 июля, 2018 · Жалоба этот бред давно работает. непонятно почему сейчас перестал. Видимо какие-то новые расширения стандарта си... Причина любого HF не компилятор, а кривые руки программиста. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 6 июля, 2018 Опубликовано 6 июля, 2018 · Жалоба strlen вычисляет длину строки - 504588880 - и естественно при алокации - char temp_str[len] - выпадаем в хард фолт. Есть такая версия: буфер наполняется в фоне (прерывания или как-то ещё), поэтому на момент вычисления длины строки там не совсем то, что было вначале. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 6 июля, 2018 Опубликовано 6 июля, 2018 · Жалоба C99 это разрешает. Проверял - реально на стеке выделяет места сколько попросишь. Товарищу сначала хотя-бы со стандартным си научиться работать. :laughing: Плюшки новых стандартов даже я не применяю, хоть и никогда не валю вину на IAR. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 6 июля, 2018 Опубликовано 6 июля, 2018 · Жалоба ок. ничего не выделяю. никаких массивовю просто uint32_t len = strlen(str); выдает какие то не реальные цифры. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 6 июля, 2018 Опубликовано 6 июля, 2018 · Жалоба ок. ничего не выделяю. никаких массивовю просто uint32_t len = strlen(str); выдает какие то не реальные цифры. У Вас нет эмулятора? Пошагать внутрь strlen и посмотреть что происходит - не судьба? Написать обработчик HF тоже видимо не судьба. Ну тогда да, конечно, в этом только IAR и может быть виноват..... :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 6 июля, 2018 Опубликовано 6 июля, 2018 (изменено) · Жалоба Есть такая версия: буфер наполняется в фоне (прерывания или как-то ещё), поэтому на момент вычисления длины строки там не совсем то, что было вначале. я поставил точку останова в прием буфера - ничего не приходит. У Вас нет эмулятора? Зайти внутрь strlen и посмотреть что происходит - не судьба? там асемблерные инструкции. я по ним мало что могу сказать. Изменено 6 июля, 2018 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 6 июля, 2018 Опубликовано 6 июля, 2018 · Жалоба ок. ничего не выделяю. никаких массивовю просто uint32_t len = strlen(str); выдает какие то не реальные цифры. С размером стека порядок? Переходите на С++, он вам так в ногу стрелять не даст. Error[Pe028]: expression must have a constant [note]: the value of variable "len" (declared at line XX) cannot be used as a constant ЗЫ: Постой, постой! Что-то похожее припоминаю... Если не подключен string.h, он какую-то лажу вместо функций работы со строками подставлял. Прямо в этом модуле #include <string.h> добавь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 6 июля, 2018 Опубликовано 6 июля, 2018 · Жалоба там асемблерные инструкции. я по ним мало что могу сказать. Открыть "Cortex-M3/M4F Instruction Set" и посмотреть описание тех, всего нескольких команд, что там используются - никак? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 6 июля, 2018 Опубликовано 6 июля, 2018 · Жалоба С размером стека порядок? Переходите на С++, он вам так в ногу стрелять не даст. я все закрыл. все. strlen все равно возвращает мусор. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 6 июля, 2018 Опубликовано 6 июля, 2018 · Жалоба я все закрыл. все. strlen все равно возвращает мусор. Прямо в этом модуле #include <string.h> добавь. Попробуй, это не долго. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 6 июля, 2018 Опубликовано 6 июля, 2018 · Жалоба там асемблерные инструкции. я по ним мало что могу сказать. Какой занятный код. Тестируют пачками по 4 байта. Должно быть, на ассемблере накодили. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться