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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Переход из прерывания
Георгий
сообщение Feb 20 2006, 12:55
Сообщение #1


Местный
***

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



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


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


Участник
*

Группа: Свой
Сообщений: 58
Регистрация: 6-12-05
Из: Санкт-Петербург
Пользователь №: 11 878



это делается просто: в прерывании модифицируется флажок типа volatile, а в основном цикле программы он проверяется


--------------------
cul8r!
* #ru_embedded - эмбеддерский чат
Go to the top of the page
 
+Quote Post
dxp
сообщение Feb 20 2006, 13:14
Сообщение #3


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(Георгий @ Feb 20 2006, 18:55) *
Как сделать переход к определенному месту программы из программы прерывания. Мне нужно из прерывания по таймеру, при достижении определенного значения счетчика Counter переходить в определенное место программы. На ассемблере решалось просто, искусственно восстанавливаю стек и делаю переход к метке. А В ИАР как это сделать?

Точно так же - напишите низкоуровневую функцию манипуляции контекстами на асме, а вызывайте ее из С. Вообще-то, это что-то RTOS'ом попахивает. smile.gif


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
Георгий
сообщение Feb 20 2006, 13:21
Сообщение #4


Местный
***

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



Цитата
это делается просто: в прерывании модифицируется флажок типа volatile, а в основном цикле программы он проверяется

Это не подходит.
Цитата
Точно так же - напишите низкоуровневую функцию манипуляции контекстами на асме, а вызывайте ее из С

То есть без асма не обойтись? Весь проблем, как из асма перейти к метке внутри функции main.? Как сделать метку видимой для других?
Уточню свою задачу. Функция чтения в цикле опрашивает порт. Если через какое то время порт не ответил, функция должна передать управление в начало программы, но не в самое начало, а туда , где начальные условия уже выставлены и необходимо попытаться реанимировать устройство, подключенное к порту, отправив ему сброс.
Пока применяю WDT, но он делает полный сброс, к устройствам, подключенным к порту, проходят броски.

Сообщение отредактировал Георгий - Feb 20 2006, 13:30


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


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Могут помочь стандартные функции setjmp и longjmp.

#include "setjmp.h"
jmp_buf redo_point;

__interrupt void foo1(void)
{
...
longjmp(&redo_point,1); //Тут будет переход на оператор за setjmp

}



main
{

....
setjmp(&redo_point); //Устанавливаем точку длинного перехода


}


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
defunct
сообщение Feb 20 2006, 14:44
Сообщение #6


кекс
******

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



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

офомить в виде функции это место и просто вызвать при необходимости

Если нужно забить гвоздь, то не надо изобретать велосипед, надо просто взять молоток и забить гвоздь.
Go to the top of the page
 
+Quote Post
Георгий
сообщение Feb 21 2006, 11:27
Сообщение #7


Местный
***

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



Дело в том, что после сброса устройства, программа должна начать все практически сначала. Если бы можно ограничиться функцией, так бы и сделал. Нужен именно переход в начало программы, но не в самое.


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


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(Георгий @ Feb 21 2006, 17:27) *
Дело в том, что после сброса устройства, программа должна начать все практически сначала. Если бы можно ограничиться функцией, так бы и сделал. Нужен именно переход в начало программы, но не в самое.

Непонятно, откуда такое суровое требование - обнулять работу программы при отсутствии сигнала в каком-то порте. Да еще и не совсем обнулять, а частично. Неужели нельзя как-то штатно эту ситуацию обрабатывать? Ну нет сигнала - это, да, событие, которое трубует обработки (как и многие другие события в системе). Зачем работу программы-то рушить? Целостность работы нарушать...


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
Aleks17
сообщение Feb 21 2006, 12:16
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 238
Регистрация: 17-01-05
Из: Новосибирск
Пользователь №: 2 003



Не понимаю чем не устраивает вариант с volatile флагом. Самым удобный и разумный на мой взгляд.

Вообще оператор goto (про него идёт речь?) в любой книжке про программистов рекомендуется забыть как страшный сон (там же и приводятся аргументы почему).
Go to the top of the page
 
+Quote Post
Георгий
сообщение Feb 21 2006, 12:24
Сообщение #10


Местный
***

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



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


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


Местный
***

Группа: Свой
Сообщений: 238
Регистрация: 17-01-05
Из: Новосибирск
Пользователь №: 2 003



Иными словами, Вам необходимо перейти к началу какого-то алгоритма при достижении определенного условия. А нельзя это сделать так:

main()

{

Init();

do {MyStart()} while (1);

}



void MyStart()

{

if (Error)

return;

}
Go to the top of the page
 
+Quote Post
Георгий
сообщение Feb 21 2006, 13:12
Сообщение #12


Местный
***

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



Не совсем так, так было бы просто. if Error может возникнуть в любом месте, в том числе и вов вложенных несколько раз функциях.


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


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата(Георгий @ Feb 21 2006, 14:24) *
Вся работа программы зависит от ответа устройства, опрос его может быть из разных мест, если после каждого вызова каждой функции проверять флаг, а потом делать многоуровневый откат к началу программы, это тоже не выход. Устройство может быть выдернуто в любой момент, и обнаружение ведется по прерыванию, это нормально. Но уходить надо в определенную точку из прерывания. Я не совсем еще понимаю логику работы ИАРа, но, наверно, как то можно подменить адрес возврата из прерывания на адрес этой точки. Может longjmp это и делает?


setjmp запоминает в jmpbuf все необходимые регистры (в том числе Y, SP, PC) в точке вызова этой функции.

longjmp все это загружает обратно и возвращается по записанному в jmpbuf PC. Т.е. то, что надо.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
dxp
сообщение Feb 21 2006, 13:19
Сообщение #14


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



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

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

Цитата(Георгий @ Feb 21 2006, 18:24) *
Я не совсем еще понимаю логику работы ИАРа, но, наверно, как то можно подменить адрес возврата из прерывания на адрес этой точки. Может longjmp это и делает?

Логики IAR'а тут никакой нет - он действует в рамках Стандарта языков С/С++. longjmp действительно может реализовать такое, но все-таки, имхо, это не путь. Имхо, чего-то не того в дизайне проги. Вы бы чуть подробнее изложили преметную область, может чего и посоветовать удалось бы.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
defunct
сообщение Feb 21 2006, 13:29
Сообщение #15


кекс
******

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



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

?
ну и что? транслируйте эту ошибку "на верх" там и обрабатывайте.
Go to the top of the page
 
+Quote Post

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

 


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


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