Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Возврат в функцию на тоже место.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Alex ma
Функция А:
Начало
Оператор,
Оператор,
Оператор,
Вызов функции Б,
1Оператор,
Оператор,
Выход из функции.
Конец

Проблема . необходимо выйти из функции А по оператору из вызванной функции Б. Функция Б в глобальной переменной сохраняет адрес возврата на оператор 1 функции А.

Функция Б:
Начало
Оператор,
Оператор,
Сохранение возврата на 1 Оператор,
Выход из функции Б, А.
Конец

Два дня мучаюсь, не знаю, как сделать, сохранить возврат на 1 оператор функции А и выйти из функций А, Б, а потом вернуться на оператор 1.
zltigo
Цитата(Alex ma @ Oct 22 2006, 08:07) *
Два дня мучаюсь...

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

Обычно это макросы. Можете посмотреть 'исходники'.
Цитата
Каким образом функция получает PC, если у AVR нет команд обращения к PC(программный счетчик).

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

Элементарно, сделать call и руками достать из стека адрес возврата
Код
        rcall    L1
L1:     pop      R16
        pop      R17
GetSmart
Вызов процедуры в стеке сохраняет IP. Остаётся тока взять его оттуда.


Опаздал, блин sad.gif
arttab
Может не догнал...
Надо из функции А вызвать функцию Б и если чеого, то при возврате в ф. А выйти из неё. Так?
Используем программный флаг и при возврате из Б, проверяем его на необходимостть выхода из функции А.
Alex ma
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 – программный счетчик.
оператор_пр_пр - оператор продолжения программы.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.