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

 
 
> Ограничение на объём обработчика прерывания ?
Andy_F
сообщение Apr 11 2007, 11:02
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 109
Регистрация: 27-07-06
Из: С.-Петербург
Пользователь №: 19 148



ATmega32, IAR 4.12A и 4.21A (картина идентична). Модель памяти - small, RSTACK и CSTACK довольно большие и на ситуацию не влияют.

Обработчик прерывания по таймеру получился достаточно длинным. При дописывании очередного фрагмента к обработчику, в основной программе начинаются глюки. Исследования показали, что возникновение глюков не связано с тем, что именно дописываешь, работа нарушается при превышении некоего "объёма".

Как диагностировать происходящее, и как исправить ситуацию ?
Спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 9)
_Bill
сообщение Apr 11 2007, 12:01
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(Andy_F @ Apr 11 2007, 11:02) *
ATmega32, IAR 4.12A и 4.21A (картина идентична). Модель памяти - small, RSTACK и CSTACK довольно большие и на ситуацию не влияют.

Обработчик прерывания по таймеру получился достаточно длинным. При дописывании очередного фрагмента к обработчику, в основной программе начинаются глюки. Исследования показали, что возникновение глюков не связано с тем, что именно дописываешь, работа нарушается при превышении некоего "объёма".

Как диагностировать происходящее, и как исправить ситуацию ?
Спасибо.

Сделать обработчик как можно короче. Все лишнее в фон.
Go to the top of the page
 
+Quote Post
Andy_F
сообщение Apr 11 2007, 12:21
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 109
Регистрация: 27-07-06
Из: С.-Петербург
Пользователь №: 19 148



Цитата(_Bill @ Apr 11 2007, 13:01) *
Сделать обработчик как можно короче. Все лишнее в фон.


Это способ обойти проблему, не всегда это возможно. Интересует "физика" процесса, что, собственно, не так ?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 11 2007, 12:28
Сообщение #4


Гуру
******

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



Цитата(Andy_F @ Apr 11 2007, 10:02) *
Как диагностировать происходящее,
В начало обработчика вставляем команду "дернуть ногой вверх". В конец - "дернуть ногой вниз". Запускаем программу, смотрим осциллографом, синхронизация по фронту. Пока система успевает - "вверх" будет стоять на одном месте и между "вниз" и следующим "вверх" будет свободное место. Вольтметром можно измерять загрузку системы smile.gif Как только "вверх" начинает дергаться - все, приплыли. А как исправить - _Bill абсолютно прав. Причем делать это надо было сразу, не дожидаясь пока программа глючить начнет.
Цитата(Andy_F @ Apr 11 2007, 11:21) *
Это способ обойти проблему, не всегда это возможно.
Это способ не породить данную проблему. Если не получается - значит надо увеличивать тактовую частоту ядра или брать другой (более скоростной) процессор. Или перекраивать алгоритм.
Цитата(Andy_F @ Apr 11 2007, 11:21) *
Интересует "физика" процесса, что, собственно, не так ?
Да не успевает процессор обработать прерывание до возникновения следующего. Можете еще так проверить - в конце обработчика проверить флаг этого прерывания - не взведен ли он уже. Если взведен - дергайте ногой. Осциллографом увидите дерганье в моменты, когда система не успевает.


--------------------
На любой вопрос даю любой ответ
"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
_artem_
сообщение Apr 11 2007, 12:56
Сообщение #5


учащийся
*****

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



В обшем смысле , какого либо лимита на длину обработчика прерываний нет. Ограничения вытекают из специфики задачи частоты прерываний и т.д.
Глюк так же может быть связан с обрашением к памяти которую использует основная программа . В таких случаях делают атомарный доступ типа запретить прерывания, обратиться к памяти, разрешить прерывания а в случае с РТОС и другие механизмы .

К сказанному Сергеем можно добавить второй индикатор который устанавливается в самой программе и дергает другую ножку . Меняя его место в основной программе и смотря двухканальным осциллографом можно локализовать проблемный код .


--------------------
Зачем лаять на караван , когда на него можно плюнуть?

Go to the top of the page
 
+Quote Post
_Bill
сообщение Apr 11 2007, 13:33
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(Andy_F @ Apr 11 2007, 12:21) *
Это способ обойти проблему, не всегда это возможно. Интересует "физика" процесса, что, собственно, не так ?

Слишко мало информации, чтобы поставить "диагноз". Причин могут быть десятки.
Go to the top of the page
 
+Quote Post
Andy_F
сообщение Apr 11 2007, 21:51
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 109
Регистрация: 27-07-06
Из: С.-Петербург
Пользователь №: 19 148



Обработчик успевает отработать до возникновения следующего прерывания. Задача как раз формировать сигналы на ножках и считывать ответные реакции. Периодичность возникновения прерывания - 5 мс, обработчик занимает 2 мс, что я и вижу на осциллографе (по этим самым формируемым сигналам). Основной программе остаётся 3 мс, вроде бы никакого криминала. В основной программе информация через UART отсылается на PC (и она действительно отсылается). Т.е., почти всё работает. Единственное, что становится не так - printf, выводящий в основной программе несколько сообщений на LCD, начинает печатать ерунду (как будто начинает брать информацию "не оттуда").
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 11 2007, 22:25
Сообщение #8


Гуру
******

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



Цитата(Andy_F @ Apr 11 2007, 20:51) *
Единственное, что становится не так - printf, выводящий в основной программе несколько сообщений на LCD, начинает печатать ерунду (как будто начинает брать информацию "не оттуда").
Добавьте стека и в RSTACK и в CSTACK


--------------------
На любой вопрос даю любой ответ
"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
Vladimir Chekin
сообщение Apr 11 2007, 23:14
Сообщение #9


Участник
*

Группа: Новичок
Сообщений: 29
Регистрация: 16-03-07
Из: МО, г.Балашиха
Пользователь №: 26 210



Цитата(Сергей Борщ @ Apr 11 2007, 13:28) *
А как исправить - _Bill абсолютно прав. Причем делать это надо было сразу, не дожидаясь пока программа глючить начнет.Это способ не породить данную проблему.


Зависит от задачи. Ты прекрасно знаешь товарища, у кого половина проектов работают в прерываниях, а main просто поражает своей мощью smile.gif
Код
void main (void)
{
  Init ();
  ei ();
  while (1);
}
Go to the top of the page
 
+Quote Post
Andy_F
сообщение Apr 13 2007, 10:49
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 109
Регистрация: 27-07-06
Из: С.-Петербург
Пользователь №: 19 148



Спасибо всем откликнувшимся. Проблема, как и следовало ожидать, оказалась вовсе не в обработчике прерывания. В основной программе была пропущена задержка после отправки команды очистки экрана на LCD. В зависимости от объёма обработчика прерывания, прерывание или "попадало" в нужное место (и обеспечивало задержку), или не попадало... smile.gif
Go to the top of the page
 
+Quote Post

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

 


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


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