|
Ограничение на объём обработчика прерывания ? |
|
|
|
 |
Ответов
(1 - 9)
|
Apr 11 2007, 12:01
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(Andy_F @ Apr 11 2007, 11:02)  ATmega32, IAR 4.12A и 4.21A (картина идентична). Модель памяти - small, RSTACK и CSTACK довольно большие и на ситуацию не влияют.
Обработчик прерывания по таймеру получился достаточно длинным. При дописывании очередного фрагмента к обработчику, в основной программе начинаются глюки. Исследования показали, что возникновение глюков не связано с тем, что именно дописываешь, работа нарушается при превышении некоего "объёма".
Как диагностировать происходящее, и как исправить ситуацию ? Спасибо. Сделать обработчик как можно короче. Все лишнее в фон.
|
|
|
|
|
Apr 11 2007, 12:21
|
Частый гость
 
Группа: Свой
Сообщений: 109
Регистрация: 27-07-06
Из: С.-Петербург
Пользователь №: 19 148

|
Цитата(_Bill @ Apr 11 2007, 13:01)  Сделать обработчик как можно короче. Все лишнее в фон. Это способ обойти проблему, не всегда это возможно. Интересует "физика" процесса, что, собственно, не так ?
|
|
|
|
|
Apr 11 2007, 12:28
|

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

|
Цитата(Andy_F @ Apr 11 2007, 10:02)  Как диагностировать происходящее, В начало обработчика вставляем команду "дернуть ногой вверх". В конец - "дернуть ногой вниз". Запускаем программу, смотрим осциллографом, синхронизация по фронту. Пока система успевает - "вверх" будет стоять на одном месте и между "вниз" и следующим "вверх" будет свободное место. Вольтметром можно измерять загрузку системы  Как только "вверх" начинает дергаться - все, приплыли. А как исправить - _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)
|
|
|
|
|
Apr 11 2007, 13:33
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(Andy_F @ Apr 11 2007, 12:21)  Это способ обойти проблему, не всегда это возможно. Интересует "физика" процесса, что, собственно, не так ? Слишко мало информации, чтобы поставить "диагноз". Причин могут быть десятки.
|
|
|
|
|
Apr 11 2007, 23:14
|
Участник

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

|
Цитата(Сергей Борщ @ Apr 11 2007, 13:28)  А как исправить - _Bill абсолютно прав. Причем делать это надо было сразу, не дожидаясь пока программа глючить начнет.Это способ не породить данную проблему. Зависит от задачи. Ты прекрасно знаешь товарища, у кого половина проектов работают в прерываниях, а main просто поражает своей мощью  Код void main (void) { Init (); ei (); while (1); }
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|