Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: setjmp
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
sKWO
Народ, подскажите, в каком порядке сохраняются регистры, текущий 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-регистры, остальными сохранениями заведует компилятор при переходе,
тогда непонятен размер буфера задачи ну и манипуляции с ним
Понимаю, что ВинАВР за уши притянут к аврам, у него один стек -- может в этом особенность?
всем заранее спасибо
meister
Цитата(sKWO @ May 25 2008, 21:12) *
Народ, подскажите, в каком порядке сохраняются регистры


Прошагать setjmp слабо?
sKWO
Цитата(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 - это регистр статуса. Код приведённый в первом посте не из этой оперы
Rst7
Исходник библиотеки есть в про-версии
Код
;----------------------------------------------------------------------------
;
;  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
sKWO
Чисто из спортивного интересса, никогда не писал макросы.
подскажите, какие регистры портачатся?
Destroys: T0 T1 T2 T3 (and all other scratch registers
if returning from a longjmp).
Не могу понять сопоставление регистров контроллера данным названиям T0 T1 T2 T3 в примере выше,Z - это общеизвестная пара R30-31
Спасибо
IgorKossak
Выдержка из файла macros.m90
Код
/* Register nicknames */
#define T0 R0
#define T1 R1
#define T2 R2
#define T3 R3
sKWO
Цитата(IgorKossak @ Jun 11 2008, 20:17) *
Выдержка из файла macros.m90 /* Register nicknames */

Всё намного проще чем ожидалось 07.gif
Спасибо Игорь!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.