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

Все работало вдруг началась проблема.

Принимаю команду с терминала

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) после этого?

Изменено пользователем Jenya7

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


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

[/code]uint32_t len = 0;

len = strlen(str);

char temp_str[len];[/code]

Как он у вас вообще такой бред скомпилил?? :wacko:

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


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

Как он у вас вообще такой бред скомпилил?? :wacko:

 

этот бред давно работает. непонятно почему сейчас перестал.

 

поставте галку VLA в настройках

Изменено пользователем Jenya7

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


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

Как он у вас вообще такой бред скомпилил?? :wacko:

C99 это разрешает. Проверял - реально на стеке выделяет места сколько попросишь.

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


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

этот бред давно работает. непонятно почему сейчас перестал.

Видимо какие-то новые расширения стандарта си...

Причина любого HF не компилятор, а кривые руки программиста.

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


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

strlen вычисляет длину строки - 504588880 - и естественно при алокации - char temp_str[len] - выпадаем в хард фолт.

Есть такая версия: буфер наполняется в фоне (прерывания или как-то ещё), поэтому на момент вычисления длины строки там не совсем то, что было вначале.

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


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

C99 это разрешает. Проверял - реально на стеке выделяет места сколько попросишь.

Товарищу сначала хотя-бы со стандартным си научиться работать. :laughing:

Плюшки новых стандартов даже я не применяю, хоть и никогда не валю вину на IAR.

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


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

ок. ничего не выделяю. никаких массивовю просто

uint32_t len = strlen(str);

выдает какие то не реальные цифры.

 

 

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


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

ок. ничего не выделяю. никаких массивовю просто

uint32_t len = strlen(str);

выдает какие то не реальные цифры.

У Вас нет эмулятора? Пошагать внутрь strlen и посмотреть что происходит - не судьба?

Написать обработчик HF тоже видимо не судьба. Ну тогда да, конечно, в этом только IAR и может быть виноват..... :laughing:

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


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

Есть такая версия: буфер наполняется в фоне (прерывания или как-то ещё), поэтому на момент вычисления длины строки там не совсем то, что было вначале.

 

я поставил точку останова в прием буфера - ничего не приходит.

 

У Вас нет эмулятора? Зайти внутрь strlen и посмотреть что происходит - не судьба?

 

там асемблерные инструкции. я по ним мало что могу сказать.

post-71075-1530866570_thumb.png

Изменено пользователем Jenya7

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


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

ок. ничего не выделяю. никаких массивовю просто

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> добавь.

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


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

там асемблерные инструкции. я по ним мало что могу сказать.

Открыть "Cortex-M3/M4F Instruction Set" и посмотреть описание тех, всего нескольких команд, что там используются - никак?

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


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

С размером стека порядок?

 

Переходите на С++, он вам так в ногу стрелять не даст.

 

я все закрыл. все. strlen все равно возвращает мусор.

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


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

я все закрыл. все. strlen все равно возвращает мусор.

Прямо в этом модуле #include <string.h> добавь. Попробуй, это не долго.

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


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

там асемблерные инструкции. я по ним мало что могу сказать.

Какой занятный код. Тестируют пачками по 4 байта. Должно быть, на ассемблере накодили.

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


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

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

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

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

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

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

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

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

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

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