기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.
안녕하세요?
처음 글을 질문을 드려 죄송하게 생각합니다만, 달리 질문을 할 데가 없네요.
beaglebone 보드를 구입해 처음부터 공부를 하고 있습니다.
ti am3359 라는 cortex-a8 프로세서를 달고 있습니다.
ti에서 제공하는 am3359용 startware 라는 것을 받아 bootloader를 컴파일 해보고 있습니다.
startware에는 gcc, 코드콤포저, iar 환경을 위한 프로젝트 를 같이 제공해 주고 있습니다.
그런데 cygwin에서 arm-none-eabi-* (yagarto) 를 사용해 컴파일 하면
selected processor does not support requested special purpose register -- `msr cpsr_c,#MODE_UND|I_F_BIT'
라는 에러를 만납니다.
ARM사에서 제공하는 퀵 인스트럭션 카드를 보면 틀리지 않은 구문 같은데요.
이 문장이 ccs 에서는 잘 컴파일이 되어서 빌드가 됩니다.
ccs에서 사용하는 컴파일러는 ccs 설치할때 같이 설치된 것입니다.
그런데 재미나는 것은 iar에서는 저렇게 immediate 값을 쓰지 않고 구현이 되어있습니다.
<iar 용 소스>
mrs r0,cpsr ; Original PSR value
bic r0,r0,#MODE_MSK ; Clear the mode bits
orr r0,r0,#MODE_SVC|I_F_BIT ; Set Supervisor mode bits
msr cpsr_c,r0 ; Change the mode
ldr sp,=SFE(SVC_STACK) ; End of SVC_STACK
참고로,
<gcc 용 소스>
LDR r0, =_stack @ Read the stack address
MSR cpsr_c, #MODE_UND|I_F_BIT @ switch to undef mode
MOV sp,r0 @ write the stack pointer
SUB r0, r0, #UND_STACK_SIZE @ give stack space
<ccs용 소스>
LDR r0, _stackptr ; Read the stack address
MSR cpsr_c, #MODE_UND|I_F_BIT ; switch to undef mode
MOV sp,r0 ; write the stack pointer
SUB r0, r0, #UND_STACK_SIZE ; give stack space
gnu as 문서를 살펴봤지만, msr에 대한 단서는 못찾았습니다. 당연한가요? ㅜㅜ
arm 좀 어렵네요. 찾아봐야 할 문서의 양은 둘째치고 체계적으로 정리해나가기가 참 힘듭니다.
장황해서 다시 질문을 요약하겠습니다.
위 gcc용 소스에서 왜 다음과 같은 컴파일 에러가 날까요?
selected processor does not support requested special purpose register -- `msr cpsr_c,#MODE_UND|I_F_BIT'
답변 부탁드립니다.
감사합니다.
gcc 버전의 문제이거나, gcc 옵션의 문제입니다.
즉, 해당 명령어는 선택된 cpu에는 지원하지 않는다는 것이거든요.
대부분 이런 경우는 툴체인 문제거나, 아니면 컴팔옵션 중 cpu 옵션 문제입니다.