В сторону setjmp()/longjmp() не смотрел?
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено ReAl 27 февраля 2004 г. 20:32
В ответ на: Возникла необходимость осуществить такой программный трюк: отправлено Paramedic 27 февраля 2004 г. 16:39

#include

/* Полное сохранение/восстановление контекста ещё и с передачей признака,
что произошло восстановление и какое именно (эдакий канонический чисто сишный способ сделать нечто похожее на try {} catch {})
*/


jmpbuf FuncJmpBuf;

Func() {
switch( setjmp( FuncJmpBuf) ) {
case 0: // это мы только что вошли сюда и вернулись из setjmp
break;
case 1: // это мы "вернулись" из longjmp( FuncJmpBuf, 1);
break;
case 10: // это - из longjmp( FuncJmpBuf, 10);
break;
}
}

теперь в любом месте делаешь
longjmp( FuncJmpBuf, код_возврата);
и попадаешь в точку, в которую возвращал setjmp()
Это всё для того, чтобы глубоко из кода, вызванного
из Func() быстро вернуться наврех не продираясь сквозь
толпу проверок кода возврата.
Думаю, из прерывания оно тоже отработает, только ты должен
быть уверен, что в прерывание ты попал тогда, когда "основное"
исполнение находится в Func() ниже setjmp()

если тебе не надо знать причину - то просто
Func() {
setjmp( FuncJmpBuf);
// пошла твоя функция
}



Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru