|
Ошибка при отладке в AVR Studio маленького макроса |
|
|
|
Nov 16 2006, 07:56
|
Местный
  
Группа: Свой
Сообщений: 252
Регистрация: 14-09-06
Пользователь №: 20 377

|
Была задача получить текущий адрес выполнения программы – программный счетчик 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(); } };
|
|
|
|
|
 |
Ответов
|
Nov 16 2006, 14:58
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(IgorKossak @ Nov 16 2006, 21:39)  Цитата Была задача получить текущий адрес выполнения программы – программный счетчик PC. SP указывает на место куда в следующий раз будет сохранён байт (pop) или адрес (call). Поэтому надо модифицировать SP (чтобы он указывал на место в стеке, где лежит сохранённый адрес) и после этого РАЗЫМЕНОВАТЬ его, т. е. взять значение, лежащее в стеке (а не в SP и уж тем более, не во __flash). Да, Вы правы... А что по поводу вот такого варианта? Код 19 unsigned int __flash *OutSaveContekst(void) \ OutSaveContekst: 20 { 21 return (unsigned int __flash *)(*(unsigned int *)(SP + 2)); \ 00000000 B7ED IN R30, 0x3D \ 00000002 B7FE IN R31, 0x3E \ 00000004 9632 ADIW R31:R30, 2 \ 00000006 8100 LD R16, Z \ 00000008 8111 LDD R17, Z+1 \ 0000000A 9508 RET 22 }
--------------------
|
|
|
|
Сообщений в этой теме
_Алекс Ошибка при отладке в AVR Studio маленького макроса Nov 16 2006, 07:56 _Bill Цитата(_Алекс @ Nov 16 2006, 10:56) Была ... Nov 16 2006, 09:43 prottoss Цитата(_Bill @ Nov 16 2006, 16:43) Ваша ф... Nov 16 2006, 12:15 IgorKossak prottoss, Вы получили таким образом значение SP, а... Nov 16 2006, 13:38 prottoss Цитата(IgorKossak @ Nov 16 2006, 20:38) p... Nov 16 2006, 14:01 IgorKossak Согласен, сказались предрассудки при работе с друг... Nov 16 2006, 15:19 Alex ma Получилось вот так
unsigned int OutSaveContekst(v... Nov 16 2006, 17:09 prottoss Цитата(Alex ma @ Nov 17 2006, 00:09) Буде... Nov 16 2006, 17:37  Alex ma Цитата(prottoss @ Nov 16 2006, 23:37) Цит... Nov 16 2006, 18:18
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|