|
STM32vlDiscovery цикл for не работает |
|
|
|
Mar 22 2015, 16:44
|

Профессионал
    
Группа: Участник
Сообщений: 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
--------------------
И на камнях растут деревья!
|
|
|
|
|
Mar 22 2015, 17:05
|

Гуру
     
Группа: Модератор 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};
|
|
|
|
|
Mar 22 2015, 18:10
|

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

|
Цитата(Xenia @ Mar 22 2015, 19:42)  Конструкция, может быть, и законна, но едва ли m соответствует числу элементов - иначе бы цикл не зависал.  Если бы элементов было больше чем m - была бы ошибка компиляции. Если бы элементов было меньше - компилятор заполнил бы остаток массива нулями. При проходе по массиву самое страшное, что могло бы случиться - выход за пределы массива. А это привело бы либо к суммированию дополнительного мусора, либо к исключению, но не к зависанию. А поскольку в отладчике все работает - значит размер массива вычитывается из нулевой ячейки верно. В этом коде я криминала не вижу. Интересно, а если этот цикл переместить в другое место - зависание будет снова в этом цикле? domowoj, а как определили, что зависание именно в цикле? Вообще, можно поподробнее о симптомах? Возможно неправильно настроены такты ожидания флеша и код улетает в исключение от неправильно считанного кода команды?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 22 2015, 18:24
|

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

|
Цитата(Сергей Борщ @ Mar 23 2015, 00:10)  а как определили, что зависание именно в цикле? Вообще, можно поподробнее о симптомах? Просто из цикла программа не выходит. Цитата Возможно неправильно настроены такты ожидания флеша и код улетает в исключение от неправильно считанного кода команды? А вот это как? Я этого делать не умею, подскажите, если можно.
--------------------
И на камнях растут деревья!
|
|
|
|
|
Mar 22 2015, 18:31
|

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

|
Цитата(domowoj @ Mar 22 2015, 21:02)  А почему же в отладчике работает, когда шагаешь. Случаи, когда залезаешь в чужую память, под отладчиком часто работают нормально, потому как зависает оно обычно не тогда, когда в эту память пишется, а гораздо позже, когда выясняется, что попорчены адреса выхода из подпрограмм (стек возвратов). Увеличили бы вы размер стека - глядишь и баг бы пропал.  Цитата(domowoj @ Mar 22 2015, 21:02)  Кстати, размер массива ранее определен(первый пост отредактирую). Все равно осталось неправильно, т.е. у вас m сперва используется как константа, а ее значение определяется позже. Цитата(domowoj @ Mar 22 2015, 21:02)  И еще, та же самая конструкция успешно работает в STM32F3Discovery! У другого контроллера и память может быть распределена иначе.
|
|
|
|
|
Mar 22 2015, 19:04
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
там же, в прожект пропертисях... только надо не стэк увеличивать, а понять где он ломается... вам надо сделать обработчик прерывания Hard fault и поглядеть не в нем ли вы оказываетесь, а дальше есть методы поиска почему туда попали... Код Tsinhro_T = 0; это че за хрень? без типа? описание типа какое?
|
|
|
|
|
Mar 22 2015, 19:18
|
Гуру
     
Группа: Участник
Сообщений: 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 сперва используется как константа, а ее значение определяется позже. И это тоже согласен.
|
|
|
|
|
Mar 22 2015, 19:22
|

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

|
Цитата(domowoj @ Mar 22 2015, 22:44)  Не хочет работать, виснет в теле цикла, причем в отладчике, пошагово, все работает как надо. Вы можете поставть две точки останова: одну до цикла, вторую после цикла? 1. И когда, по вашему представлению, программа зависнет на выполнении цикла, остановть ее (нажать "паузу" или что-то там в Кайле нажимают) и посмотреть на переменную цикла и на сумму. 2. Попрбуйте поиграть с количество итераций цикла. Задайте в цикле просумировать один элент. Два элемента. Пять элементов... Просто попробуйте набрать статистику зависаний. 3. Кроме этого цикла, программа какие еще действия делает? Особенно интересуют какие прерывания Вы используете. Я к чему это говорю -- к тому, что возможно во время работы (конкретно -- во время выполнения этого злополучного цикла) возникает прерывание и оно как-нибудь не правильно обрабатывается. например, тупо не снимается флаг прерывания, который должен сниаться программно. Я не знаю, никто не знает что там у Вас происходит. Но наиболее вероятные версии нужно отработать -- проверить. Всё равно что-то делать надо. 4. Что еще могу предложить -- если есть осциллограф, то предлагаю вписать в тело цикла команду дергания какой-нибудь свободной ножки проца. и осциллографом попробовать уловить сколько итераций совершает цикл. Может быть он лупит бесконечность, а модет слелает пару-тройку и процесс уходит в обработку какого-нибудь прерывания.
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|