|
Ошибка при отладке в 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, 17:09
|
Частый гость
 
Группа: Новичок
Сообщений: 81
Регистрация: 9-08-06
Пользователь №: 19 445

|
Получилось вот так unsigned int OutSaveContekst(void){ return (*(unsigned int *)(SP + 2)); };
Возвращает адрес во Flash на оператор после вызова функции
18: it = OutSaveContekst(); +0000002B: D005 RCALL PC+0x0006 Relative call subroutine +0000002C: EDE4 LDI R30,0xD4 Load immediate +0000002D: E0F0 LDI R31,0x00 Load immediate +0000002E: 8300 STD Z+0,R16 Store indirect with displacement +0000002F: 8311 STD Z+1,R17 Store indirect with displacement Возвращает 0х002С
Корректно будет если 0х002С + 4, т.е unsigned int OutSaveContekst(void){ return ((*(unsigned int *)(SP + 2)) + 4); }; Тогда возвращает 0х0030 18: it = OutSaveContekst(); +0000002B: D005 RCALL PC+0x0006 Relative call subroutine +0000002C: EDE4 LDI R30,0xD4 Load immediate +0000002D: E0F0 LDI R31,0x00 Load immediate +0000002E: 8300 STD Z+0,R16 Store indirect with displacement +0000002F: 8311 STD Z+1,R17 Store indirect with displacement @00000030: _..X_RSTACK_BASE 19: }; +00000030: 9508 RET Subroutine return
Будет так работать, указывать на следующий оператор во флеш после вызова функции, затем можно выйти return, а потом вернуться icall, Будет работать?
PS _Alex на работе, Alex ma дома.
|
|
|
|
|
Nov 16 2006, 17:37
|

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

|
Цитата(Alex ma @ Nov 17 2006, 00:09)  Будет так работать, указывать на следующий оператор во флеш после вызова функции, затем можно выйти return, а потом вернуться icall, Будет работать? Данной функцией Вы получили указатель на Память Программ и можете делать с ним все что Вам заблагорассудится - читать данные, прыгнуть по этому адресу и т.п. Цитата(Alex ma @ Nov 17 2006, 00:09)  PS _Alex на работе, Alex ma дома. Не мое, конечно, дело... Но зачем усложнять жизнь себе и другим? Или есть желание пообщаться с самим собой?)))
--------------------
|
|
|
|
|
Nov 16 2006, 18:18
|
Частый гость
 
Группа: Новичок
Сообщений: 81
Регистрация: 9-08-06
Пользователь №: 19 445

|
Цитата(prottoss @ Nov 16 2006, 23:37)  Цитата(Alex ma @ Nov 17 2006, 00:09)  Будет так работать, указывать на следующий оператор во флеш после вызова функции, затем можно выйти return, а потом вернуться icall, Будет работать? Данной функцией Вы получили указатель на Память Программ и можете делать с ним все что Вам заблагорассудится - читать данные, прыгнуть по этому адресу и т.п. Цитата(Alex ma @ Nov 17 2006, 00:09)  PS _Alex на работе, Alex ma дома. Не мое, конечно, дело... Но зачем усложнять жизнь себе и другим? Или есть желание пообщаться с самим собой?))) Сначала зарегистрировался дома, пришел на работу, а вопрос очень мучил по МК AVR, спросить не у кого пароля нет, вот и зарегистрировался второй раз.
|
|
|
|
Сообщений в этой теме
_Алекс Ошибка при отладке в 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, 14:39 prottoss Цитата(IgorKossak @ Nov 16 2006, 21:39) Ц... Nov 16 2006, 14:58  IgorKossak Цитата(prottoss @ Nov 16 2006, 16:58) А ч... Nov 16 2006, 15:05   prottoss Цитата(IgorKossak @ Nov 16 2006, 22:05) Ц... Nov 16 2006, 15:13 IgorKossak Согласен, сказались предрассудки при работе с друг... Nov 16 2006, 15:19
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|