Alex ma
Oct 22 2006, 05:07
Функция А:
Начало
Оператор,
Оператор,
Оператор,
Вызов функции Б,
1Оператор,
Оператор,
Выход из функции.
Конец
Проблема . необходимо выйти из функции А по оператору из вызванной функции Б. Функция Б в глобальной переменной сохраняет адрес возврата на оператор 1 функции А.
Функция Б:
Начало
Оператор,
Оператор,
Сохранение возврата на 1 Оператор,
Выход из функции Б, А.
Конец
Два дня мучаюсь, не знаю, как сделать, сохранить возврат на 1 оператор функции А и выйти из функций А, Б, а потом вернуться на оператор 1.
zltigo
Oct 22 2006, 07:43
Цитата(Alex ma @ Oct 22 2006, 08:07)

Два дня мучаюсь...
setjmp/longjmp
_Алекс
Oct 23 2006, 11:42
Посмотрел функции setjmp/longjmp, под них выделяется память, куда сохраняются sp, fp и pc. Каким образом функция получает PC, если у AVR нет команд обращения к PC(программный счетчик).
zltigo
Oct 23 2006, 12:28
Цитата(_Алекс @ Oct 23 2006, 14:42)

Посмотрел функции setjmp/longjmp
Обычно это макросы. Можете посмотреть 'исходники'.
Цитата
Каким образом функция получает PC, если у AVR нет команд обращения к PC(программный счетчик).
Я не в курсе AVR архитетуры, но "нет обращения" это практически невероятно - не встречал процессоров у которых каким-либо способом (не всегда прямым) нельзя было получить IP.
exSSerge
Oct 23 2006, 13:30
Цитата(_Алекс @ Oct 23 2006, 18:42)

Посмотрел функции setjmp/longjmp, под них выделяется память, куда сохраняются sp, fp и pc. Каким образом функция получает PC, если у AVR нет команд обращения к PC(программный счетчик).
Элементарно, сделать call и руками достать из стека адрес возврата
Код
rcall L1
L1: pop R16
pop R17
GetSmart
Oct 23 2006, 13:43
Вызов процедуры в стеке сохраняет IP. Остаётся тока взять его оттуда.
Опаздал, блин
arttab
Oct 24 2006, 02:04
Может не догнал...
Надо из функции А вызвать функцию Б и если чеого, то при возврате в ф. А выйти из неё. Так?
Используем программный флаг и при возврате из Б, проверяем его на необходимостть выхода из функции А.
Alex ma
Oct 25 2006, 14:14
rcall L1
L1: pop R16
pop R17
Спасибо,
можно ли оформить в виде макроса подстановку Cooperat():
_функция:
оператор;
оператор;
оператор;
Cooperat(); // Подстановка строчек кода
оператор_пр_пр;
оператор;
оператор;
_выход_.
Начало Макроса Cooperat():
начало asm
rcall L1
L1: pop R16
pop R17
конец asm
//Вызов функции
SetTCB(); // функция сохраняет в структуре TCB, по мимо прочего PC+(смещение на вызов SetTCB()), чтоб потом при вызове « _функция» по указателю + смещение, попасть в точку "оператор_пр_пр".
Конец Макрос Cooperat().
PC – программный счетчик.
оператор_пр_пр - оператор продолжения программы.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.