Была задача получить текущий адрес выполнения программы – программный счетчик PC. Среда разработки IAR Запомнить его, сделал вот так, результат, при отладке в AVR STUDIO выдает ошибку с переполнение стека после нескольких прогонах программы, интересно что при вызове rcall L1, стек увеличивается на 2 байта, при pop, pop уменьшается на два, вобщем кажется все правильно.
Макрос взятия адреса и функция в макросе, которая по идеи должна сохранять PC, но просто сделана как тестовая.
#define OutSaveContekst\ {\ asm ("rcall L1\n" "L1: pop r16\n" "pop r17\n");\ SaveContext();\ \ }
Функция SaveContext (по идеи сохранение контекста) ни чего полезного пока void SaveContext(void){ static int t = 0; t++; };
Функция тест в которой применен макрос void test(void){ static char i; if (i = = 5){ OutSaveContekst; i = i + 1; }; i = i + 1; };
Главная функция void main( void ) { while(1){ test(); } };
|