2013-08-06 4 views
3

현재 특정 주소의 SRAM 값을 확인한 다음 일치하는 경우 일부 C 코드를 실행하는 코드를 작성하려고합니다. 이것은 atmega32u4 AVR 칩에서 실행 중입니다. 여기에 지금까지 무엇을 가지고 :AVR 인라인 어셈블리 : 변수에 레지스터?

volatile char a = 0; 

void setup(){ 
} 

void loop(){ 
asm(
"LDI r16,77\n"  //load value 77 into r16 
"STS 0x0160,r16\n"  //copy r16 value into RAM location 0x0160 
"LDS r17,0x0160\n"  //copy value of RAM location 0x0160 into register r17 
          //some code to copy value r17 to char a? 
); 

if(a == 77){  
//do something 
    } 
} 

나는 내가 레지스터 R17 내부의 가치를 어떻게 조립 다시 C.까지 전환과에서 변수에 넣어 문제 부분을 파악하는 데 문제가 있습니다 C 코드?

코드 스니 펫 this을 찾았지만 어떻게 작동하는지 이해하지 못했거나이 방법에 접근하는 것이 가장 좋은 방법인지는 알 수 없습니다.

+2

인라인 구문은 gcc와 같습니다. 도움이 될 수 있습니다 : http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html – dbrank0

답변

2

See here on how to inline assembly. 매우 특별한 이유가있는 경우가 아니면 컴파일러에서 변수를 처리하도록해야합니다. 코드에서 a을 휘발성으로 선언했지만 AVR 코어의 GP 레지스터 파일에있는 32 개의 레지스터 중 하나에 매우 잘 바인딩 될 수 있습니다. 이것은 본질적으로 변수가 RAM에 저장되지 않는다는 것을 의미합니다. 컴파일러가 실제로 무엇을하는지 알고 싶다면 avr-objdump -S으로 최종 오브젝트 파일을 분해하고 연구하십시오.

2
__asm__ __volatile__ (
    " ldi __tmp_reg__, 77"  "\n\t" 
    " sts 0x0160, __tmp_reg__" "\n\t" 
    " lds %0, 0x0160"   "\n\t" 
    : "=r" (a) 
    : 
); 
관련 문제