Witam.
Chce zainicjować stos korzystając z makra RAMEND żeby nadawał się dla różnych procesorów.
Niestety po kompilacji kod wygląda tak.
Opcje kompilacji
Rozwiązałem ten problem w następujący sposób
Interesuje mnie jak napisać kod korzystając z makra RAMEND które od razu uzupełni rejestr Y.
Pozdrawiam
Chce zainicjować stos korzystając z makra RAMEND żeby nadawał się dla różnych procesorów.
#include <avr/boot.h>
static void __start(void) __attribute__ (( section( ".init2"), naked, used ));
static void __start(void){
asm volatile (
"out __SP_L__, %A0" "\n\t"
"out __SP_H__, %B0" "\n\t"
"clr __zero_reg__" "\n\t"
"out __SREG__, __zero_reg__" "\n\t"
: : "y"( ( uint16_t )( RAMEND ) ) );
}
void main(void) __attribute__ (( naked, used ));
void main(void){
asm("jmp 0");
}
Niestety po kompilacji kod wygląda tak.
00001c00 <__start>:
static void __start(void){
/* asm("clr __zero_reg__" "\n\t"
"out __SREG__,__zero_reg__" "\n\t"
"ldi r28,0x5f" "\n\t"
"ldi r29,0x04" "\n\t);*/
asm volatile (
1c00: 2f e5 ldi r18, 0x5F ; 95
1c02: 34 e0 ldi r19, 0x04 ; 4
1c04: e9 01 movw r28, r18
1c06: cd bf out 0x3d, r28 ; 61
1c08: de bf out 0x3e, r29 ; 62
1c0a: 11 24 eor r1, r1
1c0c: 1f be out 0x3f, r1 ; 63
Opcje kompilacji
avr-gcc -g -Os -mmcu=atmega16 -c boot.c
avr-gcc -mmcu=atmega16 -nostartfiles -g -Wl,--section-start=.text=0x1C00 -o boot.elf boot.o
avr-objcopy -O ihex boot.elf boot.hex
avr-objdump -h -S boot.elf > boot.lst
Rozwiązałem ten problem w następujący sposób
asm volatile (
"out __SP_L__, %A0" "\n\t"
"out __SP_H__, %B0" "\n\t"
"clr __zero_reg__" "\n\t"
"out __SREG__, __zero_reg__" "\n\t"
"in r28, __SP_L__" "\n\t"
"in r29, __SP_H__" "\n\t"
: : "r"( ( uint16_t )( RAMEND ) ) );
Interesuje mnie jak napisać kod korzystając z makra RAMEND które od razu uzupełni rejestr Y.
Pozdrawiam
