|
|
  |
setjmp, в каком порядке сохраняются регистры в буфере jmp_buf |
|
|
|
May 25 2008, 17:12
|

Местный
  
Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530

|
Народ, подскажите, в каком порядке сохраняются регистры, текущий pc и указатели стека(SP и Y), в буфере jmp_buf в компиляторе ИАР при использовании макро setjmp? В Вин АВР всё прозрачно Код jmp_buf: offset size description 0 16 call-saved registers (r2-r17) 16 2 frame pointer (r29:r28) 18 2 stack pointer (SPH:SPL) 20 1 status register (SREG) 21 2/3 return address (PC) (2 bytes used for <=128Kw flash) 23/24 = total size Чувствую что в ИАРе нужно внимательно изучать мап файл? Дабы потом не рассказывать для чего оно мне нужно, приведу пример кода написанного Rst7 , хотя по коду вопрос больше к автору Код ((unsigned int *)rs_task)[10]=((unsigned int)rs_rstack)+7; //SP ((unsigned int *)rs_task)[8]=((unsigned int)rs_cstack)+64; //Y ((unsigned int *)rs_task)[9]=(unsigned int)RS_TRX; //Адрес перехода просто, насколько я понимаю, то setjmp сохраняет текущий pc и указатели стека(SP и Y), и так званые localstore-регистры, остальными сохранениями заведует компилятор при переходе, тогда непонятен размер буфера задачи ну и манипуляции с ним Понимаю, что ВинАВР за уши притянут к аврам, у него один стек -- может в этом особенность? всем заранее спасибо
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
|
May 25 2008, 20:13
|

Местный
  
Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530

|
Цитата(meister @ May 25 2008, 21:13)  Прошагать setjmp слабо? Да не особо, но слабо. вырезка из листинга скомпилированного файла(мега8) Код \ 00000000 938A ST -Y, R24 \ 00000002 93FA ST -Y, R31 \ 00000004 93EA ST -Y, R30 \ 00000006 923A ST -Y, R3 \ 00000008 922A ST -Y, R2 \ 0000000A 921A ST -Y, R1 \ 0000000C 920A ST -Y, R0 \ 0000000E 937A ST -Y, R23 \ 00000010 936A ST -Y, R22 \ 00000012 935A ST -Y, R21 \ 00000014 934A ST -Y, R20 \ 00000016 933A ST -Y, R19 \ 00000018 932A ST -Y, R18 \ 0000001A 931A ST -Y, R17 \ 0000001C 930A ST -Y, R16 \ 0000001E B78F IN R24, 0x3F 122 if (!setjmp(main_task)) //Запомнили контекст осн. задачи \ 00000020 .... LDI R16, LOW((iprx_task + 61)) \ 00000022 .... LDI R17, HIGH((iprx_task + 61)) \ 00000024 .... RCALL ?setjmp_0 меп файл, сегмент setjmp Код ?setjmp_0 0000144E TCP_init (main) _sliprx (main) _tcp_delay (main) _txb (main) delayint (main) rxint (main) txint (main) ------------------------------------------------------------------------- CODE Relative segment, address: CODE 0000144E, align: 1 Segment part 1. Intra module refs: ?setjmp_0 ENTRY ADDRESS REF BY ===== ======= ====== ?setjmp_1 0000144E ------------------------------------------------------------------------- CODE Relative segment, address: CODE 0000144E, align: 1 Segment part 2. Intra module refs: ?setjmp_1 ENTRY ADDRESS REF BY ===== ======= ====== ?setjmp_2 0000144E ------------------------------------------------------------------------- CODE Relative segment, address: CODE 0000144E, align: 1 Segment part 3. Intra module refs: ?setjmp_2 ENTRY ADDRESS REF BY ===== ======= ====== ?setjmp_3 0000144E ------------------------------------------------------------------------- CODE Relative segment, address: CODE 0000144E, align: 1 Segment part 4. Intra module refs: ?setjmp_3 ENTRY ADDRESS REF BY ===== ======= ====== ?setjmp_4 0000144E ------------------------------------------------------------------------- CODE Relative segment, address: CODE 0000144E, align: 1 Segment part 5. Intra module refs: ?setjmp_4 ENTRY ADDRESS REF BY ===== ======= ====== ?setjmp_5 0000144E ------------------------------------------------------------------------- CODE Relative segment, address: CODE 0000144E, align: 1 Segment part 6. Intra module refs: ?setjmp_5 ENTRY ADDRESS REF BY ===== ======= ====== ?setjmp_6 0000144E ------------------------------------------------------------------------- CODE Relative segment, address: CODE 0000144E, align: 1 Segment part 7. Intra module refs: ?setjmp_6 ENTRY ADDRESS REF BY ===== ======= ====== ?setjmp_7 0000144E ------------------------------------------------------------------------- CODE Relative segment, address: CODE 0000144E, align: 1 Segment part 8. Intra module refs: ?setjmp_7 ENTRY ADDRESS REF BY ===== ======= ====== ?setjmp_8 0000144E ------------------------------------------------------------------------- CODE Relative segment, address: CODE 0000144E, align: 1 Segment part 9. Intra module refs: ?setjmp_8 ENTRY ADDRESS REF BY ===== ======= ====== ?setjmp_9 0000144E ------------------------------------------------------------------------- CODE Relative segment, address: CODE 0000144E, align: 1 Segment part 10. Intra module refs: ?setjmp_9 ENTRY ADDRESS REF BY ===== ======= ====== ?setjmp_10 0000144E ------------------------------------------------------------------------- CODE Relative segment, address: CODE 0000144E, align: 1 Segment part 11. Intra module refs: ?setjmp_10 ENTRY ADDRESS REF BY ===== ======= ====== ?setjmp_11 0000144E ------------------------------------------------------------------------- CODE Relative segment, address: CODE 0000144E - 00001451 (0x4 bytes), align: 1 Segment part 12. Intra module refs: ?setjmp_11 ENTRY ADDRESS REF BY ===== ======= ====== ?setjmp_12 0000144E ------------------------------------------------------------------------- CODE Relative segment, address: CODE 00001452 - 00001453 (0x2 bytes), align: 1 Segment part 13. Intra module refs: ?setjmp_0 ENTRY ADDRESS REF BY ===== ======= ====== ?setjmp_save_R15 00001452 ------------------------------------------------------------------------- CODE Relative segment, address: CODE 00001454 - 00001455 (0x2 bytes), align: 1 Segment part 14. Intra module refs: ?setjmp_1 ENTRY ADDRESS REF BY ===== ======= ====== ?setjmp_save_R14 00001454 ------------------------------------------------------------------------- CODE Relative segment, address: CODE 00001456 - 00001457 (0x2 bytes), align: 1 Segment part 15. Intra module refs: ?setjmp_2 ENTRY ADDRESS REF BY ===== ======= ====== ?setjmp_save_R13 00001456 ------------------------------------------------------------------------- CODE Relative segment, address: CODE 00001458 - 00001459 (0x2 bytes), align: 1 Segment part 16. Intra module refs: ?setjmp_3 ENTRY ADDRESS REF BY ===== ======= ====== ?setjmp_save_R12 00001458 ------------------------------------------------------------------------- CODE Relative segment, address: CODE 0000145A - 0000145B (0x2 bytes), align: 1 Segment part 17. Intra module refs: ?setjmp_4 ENTRY ADDRESS REF BY ===== ======= ====== ?setjmp_save_R11 0000145A ------------------------------------------------------------------------- CODE Relative segment, address: CODE 0000145C - 0000145D (0x2 bytes), align: 1 Segment part 18. Intra module refs: ?setjmp_5 ENTRY ADDRESS REF BY ===== ======= ====== ?setjmp_save_R10 0000145C ------------------------------------------------------------------------- CODE Relative segment, address: CODE 0000145E - 0000145F (0x2 bytes), align: 1 Segment part 19. Intra module refs: ?setjmp_6 ENTRY ADDRESS REF BY ===== ======= ====== ?setjmp_save_R9 0000145E ------------------------------------------------------------------------- CODE Relative segment, address: CODE 00001460 - 00001461 (0x2 bytes), align: 1 Segment part 20. Intra module refs: ?setjmp_7 ENTRY ADDRESS REF BY ===== ======= ====== ?setjmp_save_R8 00001460 ------------------------------------------------------------------------- CODE Relative segment, address: CODE 00001462 - 00001463 (0x2 bytes), align: 1 Segment part 21. Intra module refs: ?setjmp_8 ENTRY ADDRESS REF BY ===== ======= ====== ?setjmp_save_R7 00001462 ------------------------------------------------------------------------- CODE Relative segment, address: CODE 00001464 - 00001465 (0x2 bytes), align: 1 Segment part 22. Intra module refs: ?setjmp_9 ENTRY ADDRESS REF BY ===== ======= ====== ?setjmp_save_R6 00001464 ------------------------------------------------------------------------- CODE Relative segment, address: CODE 00001466 - 00001467 (0x2 bytes), align: 1 Segment part 23. Intra module refs: ?setjmp_10 ENTRY ADDRESS REF BY ===== ======= ====== ?setjmp_save_R5 00001466 ------------------------------------------------------------------------- CODE Relative segment, address: CODE 00001468 - 00001469 (0x2 bytes), align: 1 Segment part 24. Intra module refs: ?setjmp_11 ENTRY ADDRESS REF BY ===== ======= ====== ?setjmp_save_R4 00001468 ------------------------------------------------------------------------- CODE Relative segment, address: CODE 0000146A - 0000148D (0x24 bytes), align: 1 Segment part 25. Intra module refs: ?setjmp_12 подкажите где здесь сохраняется текущий pc и указатели стека? 0x3F - это регистр статуса. Код приведённый в первом посте не из этой оперы
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
|
May 26 2008, 06:05
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Исходник библиотеки есть в про-версии Код ;---------------------------------------------------------------------------- ; ; Library routines for the ATMEL AT90S processors ; setjmp/longjmp ; ; Copyright 1996-1998 IAR Systems. All rights reserved. ; ; $Revision: 1.12 $ ; ;----------------------------------------------------------------------------
#include "macros.m90"
PUBLISH MACRO PUBLIC ?\1_0 PUBLIC ?\1_1 PUBLIC ?\1_2 PUBLIC ?\1_3 PUBLIC ?\1_4 PUBLIC ?\1_5 PUBLIC ?\1_6 PUBLIC ?\1_7 PUBLIC ?\1_8 PUBLIC ?\1_9 PUBLIC ?\1_10 PUBLIC ?\1_11 PUBLIC ?\1_12 ENDM
ENTRY MACRO \1 0,1,R15 \1 1,2,R14 \1 2,3,R13 \1 3,4,R12 \1 4,5,R11 \1 5,6,R10 \1 6,7,R9 \1 7,8,R8 \1 8,9,R7 \1 9,10,R6 \1 10,11,R5 \1 11,12,R4 \1 12 ENDM
REGS MACRO \1 R15 \1 R14 \1 R13 \1 R12 \1 R11 \1 R10 \1 R9 \1 R8 \1 R7 \1 R6 \1 R5 \1 R4 ENDM SAVE MACRO RSEG CODE:CODE:NOROOT PUBLIC ?setjmp_save_\1 ?setjmp_save_\1: ST Z+,\1 ENDM
RESTORE MACRO RSEG CODE:CODE:NOROOT PUBLIC ?longjmp_restore_\1 ?longjmp_restore_\1: LD \1,Z+ ENDM
ENTRY1 MACRO RSEG CODE:CODE:NOROOT ?setjmp_\1: IF _args > 1 REQUIRE ?setjmp_\2 IF _args > 2 REQUIRE ?setjmp_save_\3 ENDIF ENDIF ENDM
ENTRY2 MACRO RSEG CODE:CODE:NOROOT ?longjmp_\1: IF _args > 1 REQUIRE ?longjmp_\2 IF _args > 2 REQUIRE ?longjmp_restore_\3 ENDIF ENDIF ENDM
#define SPL 0x3D #define SPH 0x3E
#ifdef __XMEGA_CORE__ #define CCP 0x34 #endif /* __XMEGA_CORE__ */
;------------------------------------------------------------------------- ; ; Function: setjmp ; ; Created: 18/Jun/96 IANP ; ; Inputs: P2:P1:P0 - jmp_buf ; ; Returns: P2:P1:P0 - == 0 when the buffer is set up, ; != 0 when returning from a longjmp ; ; Size: ; ; Destroys: T0 T1 T2 T3 Z (and all other scratch registers ; if returning from a longjmp). ; ; Description: ; Store the stack and register environment in the buffer pointed to ; by P2:P1:P0. PC, SP, Y, and all non-scratch registers are stored. ; ;------------------------------------------------------------------------- MODULE setjmp
PUBLISH setjmp
ENTRY ENTRY1
MOV Z0,P0 #if (A90_POINTER_REG_SIZE > 1) #if (MEMORY_MODEL == SMALL_MEMORY_MODEL) || (MEMORY_MODEL == LARGE_MEMORY_MODEL) MOV Z1,P1 #else LDI Z1,0 ; Running -v[3,5] -mt #endif #if (A90_POINTER_REG_SIZE == 3) #if (MEMORY_MODEL == SMALL_MEMORY_MODEL) CLR T0 OUT RAMPZ,T0 #else OUT RAMPZ,P2 #endif #endif #endif REQUIRE ?SAVE_R24
REGS SAVE
RSEG CODE:CODE:NOROOT ?SAVE_R24: ST Z+,R24 ; save R24 ST Z+,R25 ; save R25 ST Z+,R26 ; save R26 ST Z+,R27 ; save R27 ST Z+,Y0 ; save Y0 ST Z+,Y1 ; save Y1
;; read PC by popping the return address stack #ifdef A90_LARGE_CODE POP T2 #endif POP T1 POP T0 ST Z+,T0 ; save PC low ST Z+,T1 ; save PC high #ifdef A90_LARGE_CODE ST Z+,T2 ; save PC highest #endif ;; read SP from SFR SP IN T3,SPL ST Z+,T3 ; save SP low
#if A90_POINTER_REG_SIZE > 1 IN T3,SPH ST Z+,T3 ; save SP high #endif
LDI P0,0 ; return value 0 LDI P1,0
#ifdef __HAS_ENHANCED_CORE__ MOVW Z1:Z0,T1:T0 #else MOV Z0,T0 MOV Z1,T1 #endif #ifdef A90_LARGE_CODE OUT EIND,T2 EIJMP ; return #else IJMP #endif
ENDMOD
;------------------------------------------------------------------------- ; ; Function: longjmp ; ; Created: 18/Jun/96 IANP ; ; Inputs: P2:P1:P0 - jmp_buf ; Q1:Q0 - value to give as "return" from setjmp ; ; Returns: (not applicable) ; ; Size: ; ; Destroys: All scratch registers. ; ; Description: ; Restore the stack and register environment from the buffer pointed to ; by P2:P1:P0. PC, SP, Y, and all non-scratch registers are stored. ; ;------------------------------------------------------------------------- MODULE longjmp
PUBLISH longjmp
#if (A90_POINTER_REG_SIZE == 3) && (MEMORY_MODEL == LARGE_MEMORY_MODEL) #define V0 Q0 #define V1 Q1 #else #define V0 R18 #define V1 R19 #endif
ENTRY ENTRY2
MOV Z0,P0 #if A90_POINTER_REG_SIZE > 1 #if (MEMORY_MODEL == SMALL_MEMORY_MODEL) || (MEMORY_MODEL == LARGE_MEMORY_MODEL) MOV Z1,P1 #else CLR Z1 ; Running -v[3,5] -mt #endif #if (A90_POINTER_REG_SIZE == 3) CLR T0 #if (MEMORY_MODEL == SMALL_MEMORY_MODEL) OUT RAMPZ,T0 #else OUT RAMPZ,P2 #endif OUT RAMPD,T0 ; Keep RAMPD zero #endif #endif
MOV P0,V0 MOV P1,V1 ; return value OR V0,V1 BRNE ?SKIP LDI P0,1 ; zero return --> make it non-zero ?SKIP: REQUIRE ?RESTORE_R24
REGS RESTORE
RSEG CODE:CODE:NOROOT ?RESTORE_R24: LD R24,Z+ ; restore R24 LD R25,Z+ ; restore R25 LD R26,Z+ ; restore R26 LD R27,Z+ ; restore R27
#ifdef __XMEGA_CORE__ LD Q0,Z+ ; restore Y0 LD Q1,Z+ ; restore Y1 MOVW Y1:Y0,Q1:Q0 #else /* Classic */ ;; Disable interrupts while restoring SP and Y IN Q0,SREG CLI ; disable interrupt LD Y0,Z+ ; restore Y0 LD Y1,Z+ ; restore Y1 #endif /* !Classic */
;; saved PC LD T0,Z+ ; restore PC low LD T1,Z+ ; restore PC high #ifdef A90_LARGE_CODE LD T2,Z+ ; restore PC highest #endif
#ifdef __XMEGA_CORE__ LDI Q0,0x9D LD Q1,Z+ ; restore SP low LD Q2,Z+ ; restore SP high OUT CCP,Q0 ;; store saved SP in SFR SP, while interrupts are disabled OUT SPL,Q1 OUT SPH,Q2 #else /* Classic */ ;; store saved SP in SFR SP, while interrupts are disabled LD T3,Z+ ; restore SP low OUT SPL,T3 #if A90_POINTER_REG_SIZE > 1 LD T3,Z+ ; restore SP high OUT SPH,T3 #endif
;; Restore interrupt flag OUT SREG,Q0 #endif /* !Classic */
#ifdef __HAS_ENHANCED_CORE__ MOVW Z1:Z0,T1:T0 #else MOV Z0,T0 MOV Z1,T1 #endif #ifdef A90_LARGE_CODE OUT EIND,T2 EIJMP ; return #else IJMP #endif
END
;---------------------------------------------------------------------------- ; $Log: l05.s90 $ ; Revision 1.12 2007/09/17 13:44:18Z IPEO ; Revision 1.11 2003/12/09 11:34:30Z IPEO ; Revision 1.10 2003/10/24 11:45:21Z IPEO ; Revision 1.9 2003/10/10 14:06:42Z IPEO ; S031011110A ; Revision 1.8 2003/10/01 12:19:54Z IPEO ; Revision 1.7 2003/09/03 13:05:10Z IPEO ; Revision 1.6 2003/08/22 14:09:14Z IPEO ; Revision 1.5 2003/08/22 08:54:13Z IPEO ; Revision 1.4 2003/08/20 08:39:01Z IPEO ; Revision 1.3 2003/08/05 15:35:25Z IPEO ; Revision 1.2 2002/11/27 16:45:48Z IPEO ; Revision 1.4 2000/12/07 14:48:17 daniel ; Revision 1.3 2000/10/19 09:17:46 daniel ; Revision 1.2 2000/05/31 14:55:23 daniel ; Revision 1.1 1999/10/18 09:06:31 daniel ; Initial revision
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Jun 12 2008, 08:11
|

Местный
  
Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530

|
Цитата(IgorKossak @ Jun 11 2008, 20:17)  Выдержка из файла macros.m90 /* Register nicknames */ Всё намного проще чем ожидалось Спасибо Игорь!
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|