Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: ivan_fd  
Прерывания и протеус
RSM54 Дата: Ср, 21.04.2010, 14:56  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Новенький
Сообщений: 4
Репутация: 0   ±
Замечания:   ±
На сайте с 16.04.2010

Статус: Offline

В программе использую прерывание от TMR0. Внутри прерывания есть вызов GOSUB. При запуске этой программы в Протеусе от выдаёт кучу ошибок типа "Stack overflow executing CALL instruction" и "Stack underflow executing RETURN instruction". Это глюки Протеуса или нельзя делать вызовы процедур из прерывания?
ЯНДЕКС Дата: 21.04.2010
DAlexV Дата: Ср, 21.04.2010, 18:38  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Этим ошибкам верить нужно. Слетает стек. Нужно проверять подпрограмму обработки прерываний. В ней нежелательно использовать много переходов и не забывать сохранять значения сист. регистров в начале и восстанавливать их в конце.
Нужно запустить в пошаговом режиме и смотреть за состоянием стека.


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
Сообщение отредактировал DAlexV - Ср, 21.04.2010, 18:39
retas Дата: Ср, 21.04.2010, 21:38  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 445
Репутация: 11   ±
Замечания:   ±
На сайте с 10.09.2007

Статус: Offline

Ни в коем случае в прерывания не ставьте GOSUB, GOTO - вы сразу (ну почти) обрекаете себя на провал. Да и задержек не применяйте.
RSM54 Дата: Ср, 21.04.2010, 22:07  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Новенький
Сообщений: 4
Репутация: 0   ±
Замечания:   ±
На сайте с 16.04.2010

Статус: Offline

Спасибо за советы. Учту. Но назревает вопрос :-) Почему конкретно нельзя пользоваться GOSUB и GOTO в обработчиках прерываний? Что такого страшного происходит?
slavauk Дата: Чт, 22.04.2010, 00:17  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 64
Репутация: 3   ±
Замечания:   ±
На сайте с 14.03.2009

Статус: Offline

Quote (RSM54)
Почему конкретно нельзя пользоваться GOSUB и GOTO в обработчиках прерываний

Не пугайте человека.
Можно использовать.
С GOTO вообще нет проблем,так-как безусловный переход не использует стек.
Есть нюанс, если используеш прерывания,в обработчике прерывания нельзя командой GOTO "выскакивать" за пределы
обработчика.
С Gosub немного сложнее.Gosub вместе с GOTO легко переполнить стек и без прерывания.
Основное правило "для выхода из процедуры вызванной командой GOSUB нельзя использовать GOTO" выходить можно, или точнее
нужно командой RETURN.
Пример неправильного использования
Code
.
start:
.
.
gosub loop
.
.
goto start
loop:
.
goto start
.
return
end

Вызвав процедуру loop: (gosub loop:)сохраняем стек , из процедуры вышли на метку start:(goto start:),
при этом не востановили стек (обошли return).А дальше тот же цикл с моментальным перполнением стека
о чем Proteus радостно нам сообщает


Quote (RSM54)
Stack underflow executing RETURN instruction

Да-уж...Ну и наваял...Надеюсь хоть что-то понятно.
RSM54 Дата: Чт, 22.04.2010, 14:43  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Новенький
Сообщений: 4
Репутация: 0   ±
Замечания:   ±
На сайте с 16.04.2010

Статус: Offline

Всё понятно разжевал :-) Спасибо.
  • Страница 1 из 1
  • 1
Поиск: