나는 많은 엄지와 피질-M 기반의 예 http://github.com/dwelch67
있습니다. cortex-m에는 팔과 동일한 벡터 테이블이 없으므로 팔 명령으로 팔 모드로 부팅됩니다.
은 설치 첫 번째 단어의 위치에 스택 포인터의 시작 값을 넣어 스택
.cpu cortex-m3
.thumb
.word 0x10008000 /* stack top address */
.word _start /* 1 Reset */
.word hang /* 2 NMI */
.word hang /* 3 HardFault */
.word hang /* 4 MemManage */
당신이 확실히 한 번에 스택 포인터를 설정 실행 할 수 있습니다 피질-m에 대해,하지만 대답을 완료하려면 팔 모드 또는 대부분의 다른 프로세서에서 팔을 사용하는 것처럼 수동으로 수행 할 수 있습니다.
코드가 무한 루프에 빠지면 코드가 정의되지 않은 명령어 등으로 분류되지 않습니다 (0xFFs 여야합니다.-m3에서 정의되지 않은 것으로 생각되는 피질 -m0에 있어야합니다). 또는 armv7 thumb2를 지원하는 -m4는 실제 명령어 일 수 있습니다.
나는 내 벡터에서 +1을 사용하지 않았다. 당신은 당신의 도구를 알아야합니다. 가지에 엄지 주소/엄지 모드를 표시하기 위해 lsbit 세트가 필요합니다. 내가 그에게 교훈을 비록 당신이 지시를 넣을 경우 GNU 어셈블러로
Arm/Thumb: using BX in Thumb code, to call a Thumb function, or to jump to a Thumb instruction in another function
을 (너무 질문을 찾을 수있을 것이다).thumb_func를 레이블 앞에 붙이면 그 레이블은 thumb 레이블로 표시되고 gnu 도구는 주소 | 1을 사용합니다.
.thumb_func
.globl _start
_start:
당신은 적절한 주소를 사용하고 있는지 테이블 정확하고 지점과 같은 건설되고있다 있도록 다시 구축하고 지금은 모든를 분해 할 필요가있다.
0: 10008000 andne r8, r0, r0
4: 0000005b andeq r0, r0, fp, asr r0
8: 00000050 andeq r0, r0, r0, asr r0
c: 00000050 andeq r0, r0, r0, asr r0
10: 00000050 andeq r0, r0, r0, asr r0
(즉 내가 모르고 멀리 있었는지 그래서, 예에서로 사용하는 인터럽트)가 재설정하지만 아무것도하지 않을 ... 분명히 내가 예 중 하나의 버그를 참조하십시오. .thumb_func
hang: b .
이
00000050 <hang>:
50: e7fe b.n 50 <hang>
변화
.thumb_func
hang: b .
에 생산 벡터 테이블이
00000000 <hang-0x50>:
0: 10008000 andne r8, r0, r0
4: 0000005b andeq r0, r0, fp, asr r0
8: 00000051 andeq r0, r0, r1, asr r0
c: 00000051 andeq r0, r0, r1, asr r0
10: 00000051 andeq r0, r0, r1, asr r0
14: 00000051 andeq r0, r0, r1, asr r0
이 흥미 롭,
에 코드를 변경 간다 잊었다
.cpu cortex-m3
.thumb
.word 0x10008000 /* stack top address */
.word _start+1 /* 1 Reset */
.word hang+1 /* 2 NMI */
.word hang+1 /* 3 HardFault */
.word hang /* 4 MemManage */
.word hang /* 5 BusFault */
실제로 더하기 하나가 아니라 하나 또는 그 이상을 수행합니다.
00000000 <hang-0x50>:
0: 10008000 andne r8, r0, r0
4: 0000005b andeq r0, r0, fp, asr r0
8: 00000051 andeq r0, r0, r1, asr r0
c: 00000051 andeq r0, r0, r1, asr r0
10: 00000051 andeq r0, r0, r1, asr r0
조금 불안합니다. 결론적으로 두 가지 사항은 벡터 테이블에 스택 포인터를 설정할 수 있다는 점입니다. 둘째, 새 프로젝트를 시작할 때 벡터 테이블을 검사하여 기대하는 바를 확인하십시오. 그것은 당신이해야한다고 생각하는 일을하지 않으면 Esp.
http://github.com/dwelch67에서 일반적인 예제로 많은 cortex-m과 thumb을 사용합니다. 이런 간단한 프로그램을 위해 add hang 후에 무한 루프를 만들 것이다 : b hang, 그런 식으로. –