2017-05-06 14 views
2

런타임에 검색 할 수 있어야하는 정적 인 상수 데이터가 있습니다. 해당 데이터를 어디에 둘 필요가 있으며 어떻게 액세스 할 수 있습니까?어디에서 정적이고 일정한 데이터에 액세스 할 것인가?

데이터를 .text에 넣고 .data에 넣고 ld r24, X을 사용해 보았습니다. 또한 GDB의 print 명령을 사용해 보았습니다. 그러나 이러한 모든 접근 방식을 통해 나는 항상 0 개의 결과를보고 있습니다. .data :

1 시도 런타임시

Sections: 
Idx Name   Size  VMA  LMA  File off Algn 
    0 .data   00000010 00800100 000000d2 00000146 2**0 
        CONTENTS, ALLOC, LOAD, DATA 
    1 .text   000000d2 00000000 00000000 00000074 2**1 
        CONTENTS, ALLOC, LOAD, READONLY, CODE 
    2 .stab   000006cc 00000000 00000000 00000158 2**2 
        CONTENTS, READONLY, DEBUGGING 
    3 .stabstr  00000054 00000000 00000000 00000824 2**0 
        CONTENTS, READONLY, DEBUGGING 
Contents of section .data: 
800100 01010101 01000000 00000000 00000100 ................ 

Disassembly of section .text: 
... 
    c2: a0 50   subi r26, 0x00  ; 0 
    c4: bf 4f   sbci r27, 0xFF  ; 255 
    c6: 8c 91   ld  r24, X 

이 나에게주는

=> 0x000000c6 <_ZN8external6decode17hbbb21fc0c1cdbaf3E+18>: 8c 91 ld r24, X 
(gdb) i r r26 r27 
r26   0x3 3 
r27   0x1 1 
(gdb) ni 
0x000000c8 in external::decode::hbbb21fc0c1cdbaf3() 
=> 0x000000c8 <_ZN8external6decode17hbbb21fc0c1cdbaf3E+20>: 08 95 ret 
(gdb) i r r24 
r24   0x0 0 
(gdb) p *0x103 
$8 = 0 
(gdb) p *0x800103 
$9 = 0 

시도 2 ​​: .text : 다음

Sections: 
Idx Name   Size  VMA  LMA  File off Algn 
    0 .data   00000000 00800100 000000e1 00000155 2**0 
        CONTENTS, ALLOC, LOAD, DATA 
    1 .text   000000e1 00000000 00000000 00000074 2**1 
        CONTENTS, ALLOC, LOAD, READONLY, CODE 
    2 .stab   000006cc 00000000 00000000 00000158 2**2 
        CONTENTS, READONLY, DEBUGGING 
    3 .stabstr  00000054 00000000 00000000 00000824 2**0 
        CONTENTS, READONLY, DEBUGGING 

Disassembly of section .text: 
... 
    c2: ae 52   subi r26, 0x2E  ; 46 
    c4: bf 4f   sbci r27, 0xFF  ; 255 
    c6: 8c 91   ld  r24, X 
... 
000000d2 <_etext>: 
    d2: 01 01   movw r0, r2 
    d4: 01 01   movw r0, r2 
    d6: 01 00   .word 0x0001 ; ???? 
     ... 
    e0: 01 00   Address 0x00000000000000e0 is out of bounds. 
.word 0xffff ; ???? 

과 t 런타임 :

0x000000c6 in external::decode::hbbb21fc0c1cdbaf3() 
=> 0x000000c6 <_ZN8external6decode17hbbb21fc0c1cdbaf3E+18>: 8c 91 ld r24, X 
(gdb) i r r26 r27 
r26   0xd5 213 
r27   0x0 0 
(gdb) ni 
0x000000c8 in external::decode::hbbb21fc0c1cdbaf3() 
=> 0x000000c8 <_ZN8external6decode17hbbb21fc0c1cdbaf3E+20>: 08 95 ret 
(gdb) i r r24 
r24   0x0 0 
(gdb) p *0xd5 
$1 = 0 
(gdb) p *0x8000d5 
$2 = 0 
+2

데이터를 삽입하는 부분이 차이가 없어야합니다. C 컴파일러로 유사한 프로그램을 컴파일하고 해당 데이터에 어떻게 액세스하는지 관찰하십시오. – fuz

+0

@fuz : 자답을 추가했습니다. 'lpm'을 사용하여, 나는이 접근법을 얻을 수 있었지만 접근법 # 2에서만 가능했다. 섹션 선택이 중요하지 않아야하는 이유에 대해 확장 할 수 있습니까? – Cactus

+0

AVR에는 코드와 데이터를위한 별도의 주소 공간이있는 것으로 보입니다. 프로그램에 데이터 섹션을 RAM에 복사하는 일반적인 스텁이 포함되어 있습니까? – fuz

답변

2

내가 .text의 정적 데이터를 넣어이 작업을 얻을 수 있었다 (즉, 이것은 원래의 질문에서 "접근 2"입니다.) 그리고 ld 대신 lpm을 사용하여로드하십시오.