Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вызов функции по указателю на функцию.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Alex ma
@000001ED: ?EPILOGUE_B0_L09
+000001ED: E0F0 LDI R31,0x00 Load immediate
+000001EE: B60F IN R0,0x3F In from I/O location
+000001EF: 94F8 CLI Global Interrupt Disable
+000001F0: 0FCE ADD R28,R30 Add without carry
+000001F1: 1FDF ADC R29,R31 Add with carry
+000001F2: BE0F OUT 0x3F,R0 Out to I/O location
+000001F3: 9508 RET Subroutine return

Есть функция:

void TaskA(void){
char t;
t = DIInput();
};

Функция, которая вызывает TaskA:
void CallTask(void){ Работает
TaskA();
};

void CallTask(void){ А так не работает!
void (*pf)(void);
pf = TaskA;
pf ();
};

При вызове функции по указателю на функцию, происходит переполнение стека Stack Underflow at 0x01f3, не могу понять почему.
_artem_
Вторая функция на первый взгляд отличается от первой большим использованием стека на величину размера указателя на функцию.
singlskv
Цитата(Alex ma @ Dec 23 2006, 13:27) *
При вызове функции по указателю на функцию, происходит переполнение стека Stack Underflow at 0x01f3, не могу понять почему.


Если это Вы про отладку в AVR Studio, то можете не париться.
Все у Вас в порядке со стеком.
Просто при таком обращении к функции:
void (*pf)(void);
pf = TaskA;
pf ();
компиляторы используют соманду ICALL, а AVR Studio ее недолюбливает sad.gif

Чтобы убедиться в этом, пройдите Вашу функцию по шагам
в 2x вариантах (лучше в дизасемблере) и убедитесь что стек расходуется ОДИНАКОВО
_Bill
Цитата(Alex ma @ Dec 23 2006, 13:27) *
@000001ED: ?EPILOGUE_B0_L09
+000001ED: E0F0 LDI R31,0x00 Load immediate
+000001EE: B60F IN R0,0x3F In from I/O location
+000001EF: 94F8 CLI Global Interrupt Disable
+000001F0: 0FCE ADD R28,R30 Add without carry
+000001F1: 1FDF ADC R29,R31 Add with carry
+000001F2: BE0F OUT 0x3F,R0 Out to I/O location
+000001F3: 9508 RET Subroutine return

Есть функция:

void TaskA(void){
char t;
t = DIInput();
};

Функция, которая вызывает TaskA:
void CallTask(void){ Работает
TaskA();
};

void CallTask(void){ А так не работает!
void (*pf)(void);
pf = TaskA;
pf ();
};

При вызове функции по указателю на функцию, происходит переполнение стека Stack Underflow at 0x01f3, не могу понять почему.

Код
    (*pf) ();
Alex ma
Цитата(_Bill @ Dec 23 2006, 17:11) *
Цитата(Alex ma @ Dec 23 2006, 13:27) *

@000001ED: ?EPILOGUE_B0_L09
+000001ED: E0F0 LDI R31,0x00 Load immediate
+000001EE: B60F IN R0,0x3F In from I/O location
+000001EF: 94F8 CLI Global Interrupt Disable
+000001F0: 0FCE ADD R28,R30 Add without carry
+000001F1: 1FDF ADC R29,R31 Add with carry
+000001F2: BE0F OUT 0x3F,R0 Out to I/O location
+000001F3: 9508 RET Subroutine return

Есть функция:

void TaskA(void){
char t;
t = DIInput();
};

Функция, которая вызывает TaskA:
void CallTask(void){ Работает
TaskA();
};

void CallTask(void){ А так не работает!
void (*pf)(void);
pf = TaskA;
pf ();
};

При вызове функции по указателю на функцию, происходит переполнение стека Stack Underflow at 0x01f3, не могу понять почему.

Код
    (*pf) ();



(*pf) (); так пробовал, тоже самое
_Bill
Цитата(Alex ma @ Dec 23 2006, 13:27) *
@000001ED: ?EPILOGUE_B0_L09
+000001ED: E0F0 LDI R31,0x00 Load immediate
+000001EE: B60F IN R0,0x3F In from I/O location
+000001EF: 94F8 CLI Global Interrupt Disable
+000001F0: 0FCE ADD R28,R30 Add without carry
+000001F1: 1FDF ADC R29,R31 Add with carry
+000001F2: BE0F OUT 0x3F,R0 Out to I/O location
+000001F3: 9508 RET Subroutine return

Есть функция:

void TaskA(void){
char t;
t = DIInput();
};

Функция, которая вызывает TaskA:
void CallTask(void){ Работает
TaskA();
};

void CallTask(void){ А так не работает!
void (*pf)(void);
pf = TaskA;
pf ();
};

При вызове функции по указателю на функцию, происходит переполнение стека Stack Underflow at 0x01f3, не могу понять почему.

Откуда ассемблерный код взялся?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.