il-2 (26.01.2012 20:26, просмотров: 196) ответил MegaJohn на Как бы в IAR AVR заполнить CSTACK и RSTACK моими значениями ? Это нужно для проверки на сколько они используются.
Вот рабочий код, дарю:
//main.cpp
extern "C" {
extern __version_1 void _InitStacks(void);
extern __version_1 unsigned int _CalcculateRStack(void);
extern __version_1 unsigned int _CalcculateCStack(void);
__task char __low_level_init(void)
{
_InitStacks();
return(1);
}
}
;debug.s90
PUBLIC _InitStacks
PUBLIC _CalcculateRStack
PUBLIC _CalcculateCStack
; Forward declarations of segments used in initialization
RSEG CSTACK:DATA:NOROOT(0)
RSEG RSTACK:DATA:NOROOT(0)
RSEG CODE
_InitStacks:
LDI R18,0
LDI R26,LOW(SFB(RSTACK))
LDI R27,HIGH(SFB(RSTACK))
LDI R24,LOW((SIZEOF RSTACK)-10)
LDI R25,HIGH((SIZEOF RSTACK)-10)
; CLI
RCALL _FillStackArea
LDI R26,LOW(SFB(CSTACK))
LDI R27,HIGH(SFB(CSTACK))
LDI R24,LOW(SIZEOF CSTACK)
LDI R25,HIGH(SIZEOF CSTACK)
RCALL _FillStackArea
; SEI
RET
_FillStackArea:
ST X+,R18
SBIW R24,1
BRNE _FillStackArea
RET
_CalcculateRStack:
PUSH R18
PUSH R24
PUSH R25
PUSH R26
PUSH R27
LDI R26,LOW(SFB(RSTACK))
LDI R27,HIGH(SFB(RSTACK))
RJMP calcspace
_CalcculateCStack:
PUSH R18
PUSH R24
PUSH R25
PUSH R26
PUSH R27
LDI R26,LOW(SFB(CSTACK))
LDI R27,HIGH(SFB(CSTACK))
calcspace:
LDI R24,0xFF
LDI R25,0xFF
loop: ADIW R24,1
LD R18,X+
CPI R18,0
BREQ loop
MOVW R16,R24
POP R27
POP R26
POP R25
POP R24
POP R18
RET
END