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

 
 
> Переход из прерывания
Георгий
сообщение Feb 20 2006, 12:55
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 269
Регистрация: 17-11-05
Из: Киров-Москва
Пользователь №: 10 957



Как сделать переход к определенному месту программы из программы прерывания. Мне нужно из прерывания по таймеру, при достижении определенного значения счетчика Counter переходить в определенное место программы. На ассемблере решалось просто, искусственно восстанавливаю стек и делаю переход к метке. А В ИАР как это сделать?


--------------------
Обычно последним смеется тот, кто хуже соображает!
Go to the top of the page
 
+Quote Post
2 страниц V  < 1 2  
Start new topic
Ответов (15 - 22)
Георгий
сообщение Feb 21 2006, 13:43
Сообщение #16


Местный
***

Группа: Свой
Сообщений: 269
Регистрация: 17-11-05
Из: Киров-Москва
Пользователь №: 10 957



Что то инет у меня глючит, начинаю отвечать , отрубается.
Транслировать наверх получется сложнее, чем сделать один переход из одной функции прерывания. Функций чтения много, и они могут быть и на втором и на третьем уровне. Это сколько проверо по дороге надо делать.

Цитата
Ну и зачем делать откат в начало? Пусть себе программа работает, если выдернули устройство, то программа переходит в один режим, если вставили, то в другой. Зачем что-то обнулять? Заведите переменную, обозначающую режим и проверяйте ее. Вот прикинье - вставили/вынули USB дивайс, винда перегрузилась - хорошо это?

Тут больше аналогия с другим просится - если выдернуть системный винт, то чем винде еще заниматься, как не перезагружаться в цикле и определять подключен винт или нет.


--------------------
Обычно последним смеется тот, кто хуже соображает!
Go to the top of the page
 
+Quote Post
defunct
сообщение Feb 21 2006, 13:47
Сообщение #17


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Георгий @ Feb 21 2006, 15:43) *
Функций чтения много, и они могут быть и на втором и на третьем уровне. Это сколько проверо по дороге надо делать.

Вот и плохо что много. Должна быть одна функция чтения, в которой обрабатываются ошибки связи с устройством. т.е. разделите программу на уровни не по вложенности, а по характеру действий хотя бы на канальный, транспортный(в вашем случае сразу сеансовый) и прикладной. см. модель http://www.citforum.ru/nets/switche/osi.shtml.

Сообщение отредактировал defunct - Feb 21 2006, 13:55
Go to the top of the page
 
+Quote Post
Георгий
сообщение Feb 21 2006, 13:52
Сообщение #18


Местный
***

Группа: Свой
Сообщений: 269
Регистрация: 17-11-05
Из: Киров-Москва
Пользователь №: 10 957



Поправляюсь - функция чтения естественно одна. Но вызываеться она может с разных уровней. Но отсутствие устройства все рано определяется возникновением прерывания, и логично из него уйти в начало. Этим сейчас WDT занимается, но он делает полный сброс.


--------------------
Обычно последним смеется тот, кто хуже соображает!
Go to the top of the page
 
+Quote Post
defunct
сообщение Feb 21 2006, 14:05
Сообщение #19


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Георгий @ Feb 21 2006, 15:52) *
Поправляюсь - функция чтения естественно одна. Но вызываеться она может с разных уровней.

мало ли откуда она вызывается? главное чтобы функция чтения производила разбор протокола работы с устройством, и обрабатывала ошибки связи, а на верхний уровень передавала только правильно распознанные данные.

Цитата
Но отсутствие устройства все рано определяется возникновением прерывания, и логично из него уйти в начало. Этим сейчас WDT занимается, но он делает полный сброс.

В прерывании установить флаг ошибки устройства, который заблокирует например функцию чтения. Разблокировать этот флаг может например, функция "реанимации" устройства, которая будет вызываться пока флаг ошибки устройства установлен.
Go to the top of the page
 
+Quote Post
Георгий
сообщение Feb 21 2006, 14:11
Сообщение #20


Местный
***

Группа: Свой
Сообщений: 269
Регистрация: 17-11-05
Из: Киров-Москва
Пользователь №: 10 957



Нет, уж я лучше оставлю все как есть. Иначе из-за одного перехода придется переписывать всю программу, менять все функции на булевые, чтобы корректно откатываться наверх. У меня эта прога была сначала написана на ассемблере, и там переход из прерывания в начало программы решал все проблемы. А перевел на Си и столкнулся с этой бякой.


--------------------
Обычно последним смеется тот, кто хуже соображает!
Go to the top of the page
 
+Quote Post
defunct
сообщение Feb 21 2006, 14:19
Сообщение #21


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Георгий @ Feb 21 2006, 16:11) *
Нет, уж я лучше оставлю все как есть.

вероятно, это правильное решение. WDT всяко надежнее манипуляций со стеком и неправильного использования прерываний.

Цитата
Иначе из-за одного перехода придется переписывать всю программу, менять все функции на булевые, чтобы корректно откатываться наверх. У меня эта прога была сначала написана на ассемблере, и там переход из прерывания в начало программы решал все проблемы. А перевел на Си и столкнулся с этой бякой.

Менять пришлось бы только функцию чтения...
Go to the top of the page
 
+Quote Post
_artem_
сообщение Feb 21 2006, 14:26
Сообщение #22


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

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



Внутри одной функции переход с одной позиции в другую может только через явные операторы goto, break continue или посредством других конструкций языка программирования если таковые есть или же перезагрузкой самого контроллера. Мне ваша логика непонятна - хотите ли вы совершать какие то действия после того как команда отправлена или не желаете ждать ответа от команды и проверять результат на правильность или на что то другое?

Для вашего случая (не знаю слово рецидив подходит или нет )) ) можно вот что предложить :
- выделить одну переменную для значения результата
- в самом начале main сохранить контекст setjmp()
- все инициализации переменных и констант выделить в отдельную функцию и вызвать ее до сохранения сохранения контекста в main(), причем переменная результата тоже инитиализируется там .
- в прерывании где обнаруживается ошибка - вызывается программа инициализации переменных
- затем в том же прерывании присваивается значение результата
- и в том же прерывании переходится на контекст сохраненый при загрузке .
- в main() сразу после сохранения контекста ввести условие в соответствии с переменной результата

То есть вы програмным путем делаете контролируемую загрузку с контролем инициализации переменных, что позволяет вам определить был ли это reset или переход по ошибке. Конечно можно было просто перейти на вектор прерывания reset но будет неоднозначность значения переменной результата - на случай если состояние оперативной памяти на время загрузки неопределенно.

Но поверьте мне - овчинка не стоит выделки ...


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

Go to the top of the page
 
+Quote Post
Георгий
сообщение Feb 22 2006, 05:08
Сообщение #23


Местный
***

Группа: Свой
Сообщений: 269
Регистрация: 17-11-05
Из: Киров-Москва
Пользователь №: 10 957



Цитата
Менять пришлось бы только функцию чтения...
И все вызывающие ее функции. Они тоже должны вернуть наверх ошибку.
Вечером дома посидел, подумал. Наверно, так оно и следует делать в о общем случае. (По крайней мере, когда пишу драйвера, там сплошь проверки условий и возврат булева результата). Но когда пишешь супер компактный код, приходится жертвовать некоторыми принципами.

"Правильная" проверка флагов и откат по ошибке наверх увеличили программу почти на 200 байт. И глубина стека возросла.

Вариант с longjmp тоже оказался не походящим - jmp_buf отъедает 21 байт от ОЗУ (из 128). На стек уже не остается.

Сообщение отредактировал Георгий - Feb 22 2006, 09:06


--------------------
Обычно последним смеется тот, кто хуже соображает!
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 19:54
Рейтинг@Mail.ru


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