реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> IAR сошел с ума.
Jenya7
сообщение Jul 6 2018, 08:17
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Все работало вдруг началась проблема.
Принимаю команду с терминала
Код
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 - Jul 6 2018, 08:18
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 6 2018, 08:25
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Jenya7 @ Jul 6 2018, 11:17) *
[/code]uint32_t len = 0;
len = strlen(str);
char temp_str[len];[/code]

Как он у вас вообще такой бред скомпилил?? wacko.gif
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 6 2018, 08:29
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(jcxz @ Jul 6 2018, 13:25) *
Как он у вас вообще такой бред скомпилил?? wacko.gif


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

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

Сообщение отредактировал Jenya7 - Jul 6 2018, 08:34
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 6 2018, 08:32
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(jcxz @ Jul 6 2018, 11:25) *
Как он у вас вообще такой бред скомпилил?? wacko.gif

C99 это разрешает. Проверял - реально на стеке выделяет места сколько попросишь.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 6 2018, 08:33
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Jenya7 @ Jul 6 2018, 11:29) *
этот бред давно работает. непонятно почему сейчас перестал.

Видимо какие-то новые расширения стандарта си...
Причина любого HF не компилятор, а кривые руки программиста.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 6 2018, 08:33
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Jenya7 @ Jul 6 2018, 11:17) *
strlen вычисляет длину строки - 504588880 - и естественно при алокации - char temp_str[len] - выпадаем в хард фолт.

Есть такая версия: буфер наполняется в фоне (прерывания или как-то ещё), поэтому на момент вычисления длины строки там не совсем то, что было вначале.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 6 2018, 08:35
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(scifi @ Jul 6 2018, 11:32) *
C99 это разрешает. Проверял - реально на стеке выделяет места сколько попросишь.

Товарищу сначала хотя-бы со стандартным си научиться работать. laughing.gif
Плюшки новых стандартов даже я не применяю, хоть и никогда не валю вину на IAR.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 6 2018, 08:36
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



ок. ничего не выделяю. никаких массивовю просто
Код
uint32_t len = strlen(str);
выдает какие то не реальные цифры.

Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 6 2018, 08:38
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Jenya7 @ Jul 6 2018, 11:36) *
ок. ничего не выделяю. никаких массивовю просто
Код
uint32_t len = strlen(str);
выдает какие то не реальные цифры.

У Вас нет эмулятора? Пошагать внутрь strlen и посмотреть что происходит - не судьба?
Написать обработчик HF тоже видимо не судьба. Ну тогда да, конечно, в этом только IAR и может быть виноват..... laughing.gif
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 6 2018, 08:39
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(scifi @ Jul 6 2018, 13:33) *
Есть такая версия: буфер наполняется в фоне (прерывания или как-то ещё), поэтому на момент вычисления длины строки там не совсем то, что было вначале.


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

Цитата(jcxz @ Jul 6 2018, 13:38) *
У Вас нет эмулятора? Зайти внутрь strlen и посмотреть что происходит - не судьба?


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

Сообщение отредактировал Jenya7 - Jul 6 2018, 08:42
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Jul 6 2018, 08:41
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Цитата(Jenya7 @ Jul 6 2018, 11:36) *
ок. ничего не выделяю. никаких массивовю просто
Код
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> добавь.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 6 2018, 08:42
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Jenya7 @ Jul 6 2018, 11:39) *
там асемблерные инструкции. я по ним мало что могу сказать.

Открыть "Cortex-M3/M4F Instruction Set" и посмотреть описание тех, всего нескольких команд, что там используются - никак?
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 6 2018, 08:45
Сообщение #13


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(VladislavS @ Jul 6 2018, 13:41) *
С размером стека порядок?

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


я все закрыл. все. strlen все равно возвращает мусор.
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Jul 6 2018, 08:56
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Цитата(Jenya7 @ Jul 6 2018, 11:45) *
я все закрыл. все. strlen все равно возвращает мусор.

Прямо в этом модуле #include <string.h> добавь. Попробуй, это не долго.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 6 2018, 08:59
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Jenya7 @ Jul 6 2018, 11:39) *
там асемблерные инструкции. я по ним мало что могу сказать.

Какой занятный код. Тестируют пачками по 4 байта. Должно быть, на ассемблере накодили.
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th April 2024 - 06:23
Рейтинг@Mail.ru


Страница сгенерированна за 0.01506 секунд с 7
ELECTRONIX ©2004-2016