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

 
 
> Трассировка процесса
juvf
сообщение Dec 10 2010, 11:32
Сообщение #1


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

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



MSP430F2418
есть в мэйне основной цыкл while(1). в теле цыкла вызываются всякие процедуры и функции которые по глобальным флагам делают те или иные действия. Есть обработчик прерываний который прерывает этот вайл и выставляет всякие флажки, которые обрабатываются в главном цыкле. обычно цыкл прохонит за несколько мс с учётом времени потраченное в перываниях. но иногда процесс где-то шляется больше секунды. в обработчике прерывания выставляю флаг. в главном цыкле должен по этому флагу запустить процедуру. так вот между выставлением флага в прерывании и проыеркой этого флага в гл. цыкле может пройти больше секунды. из прерывания выход мгновенный. 100%. а вот где потом процесс шляется целую секунду не могу найти. узнать бы в каком месте была прервана программа прерыванием и куда вернулась? Как бы трассировкку процесса устроить? Как это можно решить с помошью IAR EW IDE? или какими еще способами можно выяснить где мы были целую секунду?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
rezident
сообщение Dec 10 2010, 15:23
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Угу. Как я и предполагал. Потенциальная бага лежит на видном месте.
Код
TBCCR1+=Value32kHz1sCCR;

Value32kHz1sCCR это константа? Если да, то выходит что период прерываний у вас постоянный?
В таком случае следует использовать таймер не в режиме CountUp, а в режиме Continuous, соответственно используя переполнения от TBCCR0 и поменяв вектор прерываний на TIMERB0_VECTOR.

Update. Все многочисленные вычисления следует вынести из прерывания в основной цикл.
По поводу второго вопроса. Как минимум переменная happy должна быть глобальной и объявлена с квалификатором volatile.
Go to the top of the page
 
+Quote Post
juvf
сообщение Dec 10 2010, 18:41
Сообщение #3


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

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(rezident @ Dec 10 2010, 20:23) *
Угу. Как я и предполагал. Потенциальная бага лежит на видном месте.
Код
TBCCR1+=Value32kHz1sCCR;

Value32kHz1sCCR это константа? Если да, то выходит что период прерываний у вас постоянный?
В таком случае следует использовать таймер не в режиме CountUp, а в режиме Continuous, соответственно используя переполнения от TBCCR0 и поменяв вектор прерываний на TIMERB0_VECTOR.

а в чем тут бага? есть дефаин
#define Value32kHz1sCCR 32768 //Константа для 1 с: кварц 32768 Гц / таймер 1 Гц = 32768. прерывание происходит при счетчике 0х0000 и 0х8000.
раз в секунду попадаю в TIMERB1_VECTOR. После выхода из обработчика до..... проверки флага в главном цыкле иногда может пройти времени больше секунды. При чем входит в обработчик строго по расписанию, раз в сек. выполнение тоже достаточно быстро. Толи гдето в какойто другой обработчик ныряем, толи гдето в майне застреваем. Не могу понять где.

А по поводу TIMERB0_VECTOR - это прерывание используется и там есть обработчик, не менее адский чем В1. Програvма большая, если что-то менять, то её всю с нуля нада переписывать. Хотелось бы с этой разобраться. Где шляемся? Как можно трассировку процесса организовать? Что за плагин Profiling? Он мне не поможет.



По поводу второго вопроса: Если happy объявлен глобально так

volatile MyClass happy;

То при использовании её в потоке маин и в обработчике не нужно беспокоится о колизии при совместном доступе к happy? Там же оператор "=" вызывает копирующий конструктор, а это может быть тоже не лёгкая функция? Или компилятор сам запретит прерывания при вызове "="?
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 10 2010, 18:58
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(juvf @ Dec 10 2010, 23:41) *
Толи гдето в какойто другой обработчик ныряем, толи гдето в майне застреваем. Не могу понять где.
Как где? В этом же обработчике, например. У вас там вложенность прерываний допускается. Команда _EINT(); посередь функции имеется.
Цитата(juvf @ Dec 10 2010, 23:41) *
Програvма большая, если что-то менять, то её всю с нуля нада переписывать.
Если вся программа написана так, как этот фрагмент, то лучше переписать ее по-новой, более тщательно продумав алгоритмы. Нельзя задерживаться в прерываниях для столь длительной обработки/расчета. Тем более, когда источников прерываний несколько. Максимальное время обработки любого прерывания не должно превышать периода вызова самого "быстрого" прерывания.
Цитата(juvf @ Dec 10 2010, 23:41) *
По поводу второго вопроса: Если happy объявлен глобально так

volatile MyClass happy;

То при использовании её в потоке маин и в обработчике не нужно беспокоится о колизии при совместном доступе к happy? Там же оператор "=" вызывает копирующий конструктор, а это может быть тоже не лёгкая функция? Или компилятор сам запретит прерывания при вызове "="?
Про С++ не могу ничего прокомментировать, не владею им. laughing.gif Квалификатор volatile ничего не гарантирует в части "параллельности" и не запрещает никаких прерываний. Он лишь указывает компилятору на то, что доступ к данной переменной не подлежит оптимизации, т.к. переменная может изменяться асинхронно по отношению к данной единице компиляции (функции или модулю). Если же вас интересует атомарность доступа к переменной бОльшей разрядности, чем разрядность архитектуры МК или к группе переменных, то она (атомарность) обеспечивается другими ("ручными") способами. В т.ч. "ручным" запретом вызова того прерывания, в обработчике которого данная переменная (или группа переменных) может модифицироваться.
Go to the top of the page
 
+Quote Post



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

 


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


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