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

 
 
> STM32vlDiscovery цикл for не работает
domowoj
сообщение Mar 22 2015, 16:44
Сообщение #1


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

Группа: Участник
Сообщений: 1 548
Регистрация: 20-12-07
Из: г.Новосибирск
Пользователь №: 33 486



STM32vlDiscovery.
Простейшая конструкция - просуммировать элементы массива.
Код
uint16_t GAME[m]={19,64,32,64,64,32,32,64,64,32,64,32,64,32,32,64,64,32,1152};
   const uint8_t m = 255;
uint16_t Tsinhro_T=0;
....
....                      
                    N = GAME[0];
                    Tsinhro_T = 0;
                    for    (i=1; i<N; i++)    
                    {                        
                    Tsinhro_T =Tsinhro_T +GAME[i];
                    }

Не хочет работать, виснет в теле цикла, причем в отладчике, пошагово,
все работает как надо.
В чем дело, мозг сломал.
Подскажите, пожалуйста, куда копать?

Сообщение отредактировал domowoj - Mar 22 2015, 19:31


--------------------
И на камнях растут деревья!
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 20)
Xenia
сообщение Mar 22 2015, 17:05
Сообщение #2


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(domowoj @ Mar 22 2015, 19:44) *
Подскажите, пожалуйста, куда копать?


Так писать нельзя:
uint16_t GAME[m]={19,64,32,64,64,32,32,64,64,32,64,32,64,32,32,64,64,32,1152};
Вместо [m] должна стоять константа или оставьте скобки пустыми:
uint16_t GAME[]={19,64,32,64,64,32,32,64,64,32,64,32,64,32,32,64,64,32,1152};
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 22 2015, 17:18
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Xenia @ Mar 22 2015, 19:05) *
Так писать нельзя:
Не факт. m может быть константой, а компилятор - плюсовым, тогда такая конструкция вполне законна.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Xenia
сообщение Mar 22 2015, 17:42
Сообщение #4


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(Сергей Борщ @ Mar 22 2015, 20:18) *
Не факт. m может быть константой, а компилятор - плюсовым, тогда такая конструкция вполне законна.


Конструкция, может быть, и законна, но едва ли m соответствует числу элементов - иначе бы цикл не зависал. sm.gif
Отсюда и мой совет оставить скобки пустыми, чтобы компилятор сам сосчитал число проинициализированных элементов.
Go to the top of the page
 
+Quote Post
domowoj
сообщение Mar 22 2015, 18:02
Сообщение #5


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

Группа: Участник
Сообщений: 1 548
Регистрация: 20-12-07
Из: г.Новосибирск
Пользователь №: 33 486



А почему же в отладчике работает, когда шагаешь.
Кстати, размер массива ранее определен(первый пост отредактирую) .
И еще, та же самая конструкция успешно работает в STM32F3Discovery!


--------------------
И на камнях растут деревья!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 22 2015, 18:10
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Xenia @ Mar 22 2015, 19:42) *
Конструкция, может быть, и законна, но едва ли m соответствует числу элементов - иначе бы цикл не зависал. sm.gif
Если бы элементов было больше чем m - была бы ошибка компиляции. Если бы элементов было меньше - компилятор заполнил бы остаток массива нулями. При проходе по массиву самое страшное, что могло бы случиться - выход за пределы массива. А это привело бы либо к суммированию дополнительного мусора, либо к исключению, но не к зависанию. А поскольку в отладчике все работает - значит размер массива вычитывается из нулевой ячейки верно. В этом коде я криминала не вижу.
Интересно, а если этот цикл переместить в другое место - зависание будет снова в этом цикле? domowoj, а как определили, что зависание именно в цикле? Вообще, можно поподробнее о симптомах? Возможно неправильно настроены такты ожидания флеша и код улетает в исключение от неправильно считанного кода команды?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
domowoj
сообщение Mar 22 2015, 18:24
Сообщение #7


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

Группа: Участник
Сообщений: 1 548
Регистрация: 20-12-07
Из: г.Новосибирск
Пользователь №: 33 486



Цитата(Сергей Борщ @ Mar 23 2015, 00:10) *
а как определили, что зависание именно в цикле? Вообще, можно поподробнее о симптомах?

Просто из цикла программа не выходит.
Цитата
Возможно неправильно настроены такты ожидания флеша и код улетает в исключение от неправильно считанного кода команды?
А вот это как? Я этого делать не умею, подскажите, если можно.


--------------------
И на камнях растут деревья!
Go to the top of the page
 
+Quote Post
Xenia
сообщение Mar 22 2015, 18:31
Сообщение #8


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(domowoj @ Mar 22 2015, 21:02) *
А почему же в отладчике работает, когда шагаешь.

Случаи, когда залезаешь в чужую память, под отладчиком часто работают нормально, потому как зависает оно обычно не тогда, когда в эту память пишется, а гораздо позже, когда выясняется, что попорчены адреса выхода из подпрограмм (стек возвратов). Увеличили бы вы размер стека - глядишь и баг бы пропал. sm.gif

Цитата(domowoj @ Mar 22 2015, 21:02) *
Кстати, размер массива ранее определен(первый пост отредактирую).

Все равно осталось неправильно, т.е. у вас m сперва используется как константа, а ее значение определяется позже.

Цитата(domowoj @ Mar 22 2015, 21:02) *
И еще, та же самая конструкция успешно работает в STM32F3Discovery!

У другого контроллера и память может быть распределена иначе.
Go to the top of the page
 
+Quote Post
domowoj
сообщение Mar 22 2015, 18:40
Сообщение #9


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

Группа: Участник
Сообщений: 1 548
Регистрация: 20-12-07
Из: г.Новосибирск
Пользователь №: 33 486



Цитата(Xenia @ Mar 23 2015, 00:31) *
Увеличили бы вы размер стека - глядишь и баг бы пропал. sm.gif
А как это сделать?



--------------------
И на камнях растут деревья!
Go to the top of the page
 
+Quote Post
Xenia
сообщение Mar 22 2015, 18:50
Сообщение #10


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(domowoj @ Mar 22 2015, 21:40) *
А как это сделать?


У IAR'а это в Option.
Go to the top of the page
 
+Quote Post
domowoj
сообщение Mar 22 2015, 18:58
Сообщение #11


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

Группа: Участник
Сообщений: 1 548
Регистрация: 20-12-07
Из: г.Новосибирск
Пользователь №: 33 486



А в Keil?


--------------------
И на камнях растут деревья!
Go to the top of the page
 
+Quote Post
Xenia
сообщение Mar 22 2015, 19:00
Сообщение #12


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(domowoj @ Mar 22 2015, 21:58) *
А в Keil?


А Keil я не понимаю. sm.gif
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Mar 22 2015, 19:04
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



там же, в прожект пропертисях...
только надо не стэк увеличивать, а понять где он ломается...

вам надо сделать обработчик прерывания Hard fault и поглядеть не в нем ли вы оказываетесь, а дальше есть методы поиска почему туда попали...

Код
Tsinhro_T = 0;


это че за хрень? без типа? описание типа какое?
Go to the top of the page
 
+Quote Post
mantech
сообщение Mar 22 2015, 19:18
Сообщение #14


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(Golikov A. @ Mar 22 2015, 22:04) *
только надо не стэк увеличивать, а понять где он ломается...


Не знаю, что такого в этой процедуре, что может стек поломать...

Отключите оптимизацию, и воткните в тело цикла что-то вроде printf("I=%d\n",i); И посмотрите, на каком шаге виснет...

Цитата(Xenia @ Mar 22 2015, 21:31) *
Все равно осталось неправильно, т.е. у вас m сперва используется как константа, а ее значение определяется позже.


И это тоже согласен.
Go to the top of the page
 
+Quote Post
zhevak
сообщение Mar 22 2015, 19:22
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Цитата(domowoj @ Mar 22 2015, 22:44) *
Не хочет работать, виснет в теле цикла, причем в отладчике, пошагово,
все работает как надо.


Вы можете поставть две точки останова: одну до цикла, вторую после цикла?

1. И когда, по вашему представлению, программа зависнет на выполнении цикла, остановть ее (нажать "паузу" или что-то там в Кайле нажимают) и посмотреть на переменную цикла и на сумму.

2. Попрбуйте поиграть с количество итераций цикла. Задайте в цикле просумировать один элент. Два элемента. Пять элементов... Просто попробуйте набрать статистику зависаний.

3. Кроме этого цикла, программа какие еще действия делает? Особенно интересуют какие прерывания Вы используете. Я к чему это говорю -- к тому, что возможно во время работы (конкретно -- во время выполнения этого злополучного цикла) возникает прерывание и оно как-нибудь не правильно обрабатывается. например, тупо не снимается флаг прерывания, который должен сниаться программно. Я не знаю, никто не знает что там у Вас происходит. Но наиболее вероятные версии нужно отработать -- проверить. Всё равно что-то делать надо.

4. Что еще могу предложить -- если есть осциллограф, то предлагаю вписать в тело цикла команду дергания какой-нибудь свободной ножки проца. и осциллографом попробовать уловить сколько итераций совершает цикл. Может быть он лупит бесконечность, а модет слелает пару-тройку и процесс уходит в обработку какого-нибудь прерывания.


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Mar 22 2015, 19:41
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
Не знаю, что такого в этой процедуре, что может стек поломать...

да нет там ничего, 3 строчки, все просто...

ТС почему то упорно скрывает от нас реальный код, и дает какие-то выжимки. Тем самым от нас скрыта правда, а видно только то что автор считаем важным, при этом поскольку у автора ошибка, очевидно автор не очень осознает что же на самом деле важно, а что нет)...

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

что с вочь догом, с задержкой чтения флеши, с другими прерываниями?

самое простое запретить все прерывания, и поглядеть если через цикл пройдет, то точно дело в них...

Go to the top of the page
 
+Quote Post
domowoj
сообщение Mar 22 2015, 19:46
Сообщение #17


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

Группа: Участник
Сообщений: 1 548
Регистрация: 20-12-07
Из: г.Новосибирск
Пользователь №: 33 486



Ладно, спасибо за наводки, буду пробовать,
потом отпишусь.


--------------------
И на камнях растут деревья!
Go to the top of the page
 
+Quote Post
domowoj
сообщение Mar 26 2015, 17:53
Сообщение #18


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

Группа: Участник
Сообщений: 1 548
Регистрация: 20-12-07
Из: г.Новосибирск
Пользователь №: 33 486



Добрый вечер уважаемые друзья!
Цитата(Golikov A. @ Mar 23 2015, 01:41) *
ТС почему то упорно скрывает от нас реальный код, и дает какие-то выжимки.
Тем самым от нас скрыта правда,
а видно только то что автор считаем важным, при этом поскольку у автора ошибка,
очевидно автор не очень осознает что же на самом деле важно, а что нет)...

Вы оказались абсолютно правы.
После таймаута, (взгляд все-таки замыливается) и внимательного разбора написанного,
нашел ЛЯП, как AVR_овский отголосок,
при сбросе флага одного из прерываний я его не сбрасывал в 0, а устанавливал в "1".
Вместо
Код
    TIM4->SR &= ~TIM_SR_UIF; //

было
Код
    TIM4->SR |=  TIM_SR_UIF; //


Спасибо всем, тема закрыта.


--------------------
И на камнях растут деревья!
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Mar 26 2015, 18:00
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Стойте стойте... Давайте пока она не совсем закрыта еще кое что скажем...

В АРМах не принято сбрасывать флаги прерываний через &=, это несет в себе потенциальную опасность сбросить прерывание которое наступило пока вы сбрасываете прерывание...

обычно все такие флаговые регистры чувствительны только к записи одного уровня, то есть обычно надо записать в регистр значение через = с помеченным для сброса флагом, а всем остальными стоящими в обратном значении.... это сбросит только помеченные флаги и не изменит остальные.... Обратите на это внимание...

на пальцах
&= - это не атомарная операция, это
взять регистр
изменить регистр
записать регистр
между этими командами может придти еще прерывание, и вы его случайно затрете этими действиями...
Go to the top of the page
 
+Quote Post
etoja
сообщение Apr 3 2015, 09:23
Сообщение #20


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

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



Напишите
volatile int i;

чтобы компилятор не кешировал переменную в регистр процессора.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 3 2015, 11:10
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Если это ответ мне, то это не поможет....
Если не понимаете почему, то надо читать что я написал и думать...
Если не мне, то к чему это?

Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 08:02
Рейтинг@Mail.ru


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