2012-02-02 4 views
3

ARM 베어 메탈 프로그램에서 C 코드에 %를 사용하려고하면 libgcc에서 래퍼가 필요합니다. 문제는 없지만 링크 할 수 있습니다. 링커가 불평을 멈추지 만 프로그램이 멈추는 경우 (레지스터를 보면 사실상 알 수없는 방식으로 사이클을 시작합니다) mod를 사용합니다. %로 라인을 주석 처리하면 프로그램이 이런 방식으로 멈추지 않으므로 이것이 분명히 문제가됩니다.ARMv6에서 베어 메탈 모드 (%)가 libgcc와 함께 중단됩니다.

qemu-system-arm -M versatilepb -cpu arm1176 -nographic -kernel kernel.elf | xxd 

그런^도끼를 종료하고, % 선이 주석과 나는 바이트 수 :

나는 내가 사용 테스트를 실행 https://gist.github.com/1724746

에서 문제의 사소한 예를 구축했다 나는 출력을 기대하지만, 거기에 선을 긋는다면 출력이 나오지 않는다.

여기에 무슨 일이 일어나고 있는지 아십니까?

편집 : https://launchpad.net/gcc-linaro

+0

해체를 검사해야합니다. 관련 디스 어셈블리를 게시 할 수 있습니까? 당신이 만든 프로그램? qemu가 아닌 실제 하드웨어에서 이것을 실행 했습니까? –

+0

https://singpolyma.net/test.asm에서 분해 코드를 게시했습니다 (경고 : 매우 큼). 실제 하드웨어에는 액세스 할 수 없습니다. 내 목표는 QEMU입니다. – singpolyma

답변

2

그래서 R0와 R1은 현재 작업 + 1

을에 2 (잘 더하기를 수행 한 가지로로드 : 내가 사용 크로스 컴파일러는 우분투의 기본에있다
10648: e1a00003 mov r0, r3 
1064c: e51b1010 ldr r1, [fp, #-16] 
10650: eb00fd36 bl 4fb30 <____aeabi_uidivmod_veneer> 

나는 그들이 엄지 손가락으로 팔을 전환하는 _veneer 사용 추측이 모드를 전환 할 수 트램 폴린이다, 여기에 실제 모듈로 작업을 이동합니다

0004fb30 <____aeabi_uidivmod_veneer>: 
    4fb30: e51ff004 ldr pc, [pc, #-4] ; 4fb34 <____aeabi_uidivmod_veneer+0x4> 
    4fb34: 00010905 .word 0x00010905 

을,이 엄지 손가락 코드 ,

00010904 <__aeabi_uidivmod>: 
    10904: 2900  cmp r1, #0 
    10906: d0f8  beq.n 108fa <__aeabi_uidiv+0x252> 
    10908: e92d 4003 stmdb sp!, {r0, r1, lr} 
    1090c: f7ff fecc bl 106a8 <__aeabi_uidiv> 
    10910: e8bd 4006 ldmia.w sp!, {r1, r2, lr} 
    10914: fb02 f300 mul.w r3, r2, r0 
    10918: eba1 0103 sub.w r1, r1, r3 
    1091c: 4770  bx lr 
    1091e: bf00  nop 

엄지 손가락 모드 그래서 그 다음, 정상적인 분열을 보이는 결과를 곱하고 예를

문제가 엄지 손가락 모드 궁금
12345 % 100 = 12345 - ((12345/100)*100) = 12345 - (123*100) = 12345 - 12300 = 45 

에 대한 뺍니다. arm1176에는 확실히 엄지 손가락 형태가, 진짜 것 및 I qemu 엄지를 할 수있다.

당신은 알아 조립 및 링크 할 수 있지만 실험을 시도 할 수 있습니다 : 당신의 툴체인 접두사가있는 경우입니다

.thumb 
.thumb_func 
.globl thumb_test 
thumb_test: 
    add r0,#1 
    bx lr 

arm-none-linux-gnueabi-as thumb_test.s -o thumb_test.o 

또는 무엇이든을, 그리고 다른 모든 것들에 제출 된 .o를 연결합니다. C 코드에서

unsigned int thumb_test (unsigned int); 

로 선언하고 그 값을 더한 다시 가야 전달할 어떤 ... 대신 모듈의이 시도.

시도해 볼 또 다른 사항은 나누기가 작동하지만 모듈러스가 아닌지 확인하십시오. 문제는 곱하기 명령어입니까? 누가 알아.

흠, 나는 내가 문제를 볼 생각 : 당신은 그것이 BX 또는 BLX 수있는 LDR로 모드를 전환하지 못할

0004fb30 <____aeabi_uidivmod_veneer>: 
    4fb30: e51ff004 ldr pc, [pc, #-4] ; 4fb34 <____aeabi_uidivmod_veneer+0x4> 
    4fb34: 00010905 .word 0x00010905 

을가 엄지 손가락을 실행하려고 할 때, 그것은 아마도 정의되지 않은 핸들러 것입니다 암 모드의 코드.

전환 모드가 작동해야하는 몇 가지 예를 특히 qemu로 작성했습니다.이제 이것은 낮은 수준의 예제입니다. 예를 들어 printf가 없습니다. uart에 대한 정보를 볼 수있는 출력을 가지고 있습니다. 이것이 문제 (엄지 모드로 전환) 인 경우 프로그램을 컴파일하고 링크하는 방법을 검토해야합니다. 인터 워킹을 지정해야 할 수도 있고 이전에 코드 쉐어리 (현재 멘토 그래픽에 의해 소비 됨) 툴 체인을 사용하지 않는 경우 툴 체인이 어떻게 구축되었는지 이해해야 할 수도 있습니다. gnu/gcc 기반의 것을 사용하고 있다고 가정합니다.

거기에 정의되지 않은 처리기를 넣거나 추적을보고 주소 0x0000000 근처의 PC 드롭을 볼 수 있다면 어떻게 될까요? 당신이 나의 작은 thumb_test 물건으로 만들면 bx 대신에 ldr을 사용하여 거기에 도착하면 작동하지 않아야합니다. ...

+0

thumb_test.s 코드를 링크하고 호출하면 작동합니다. CFLAGS에 -mthumb-interwork을 추가해도 작동하지 않습니다. 음, 테스트에서 ".thumb_func"를 제거하면 같은 문제가 발생합니다. 따라서 다른 코드가 엄지 손가락인지는 알지 못합니다. 그래서 컴파일러에게 엄지 코드를 호출하여 올바른 트램펄린을 생성하도록 유도하는 방법을 찾아야합니다. – singpolyma

+0

엄지 모드에서 컴파일하기 위해 주 코드를 변경해도 문제가 해결되지 않습니다. Dissasembly : http://singpolyma.net/test2.asm – singpolyma

+0

거기에 thumb2 많은 코드가 arm11 thumb2를 지원하지 않습니다. 모듈러스를 제거하지만이 엄지 버전으로 컴파일하면 어떻게됩니까? –

관련 문제