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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> 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
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

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 01:50
Рейтинг@Mail.ru


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