スタック PSP を使用してユーザー モードから SVC を呼び出そうとしています。LPC 1769 (cortex m3) でコードをデバッグすると、次のエラーが表示されます------- "g_pfnVectors() at 0x0" のソースがありません 使用している IDE は、LPC 1769 を搭載した CODE RED LPC Xpresso です。アーティスト。
ここにアセンブリコードがあります
.syntax unified
.cpu cortex-m3
.thumb
.align 2
.global Start
.thumb
.thumb_func
Start:
// LDR r0,=0xf00d //initial value of r0 which has to be changed in svc handler
PUSH {lr}
MOV r0,#0x2 // set stack to PSP now. Set CONTROL[1]=1
MSR CONTROL,r0
ISB // Instruction memory barrier – ensures that the above is executed
MOV r0,#0x3 //change to user level
MSR CONTROL, r0
ISB
MOV r0,#0x2
MOV r2,#0x2
exp:
MUL r0,r0
SUBS r2,#1
BNE exp
SVC 1 //print in hex
MOV r0,#0x4 //print in decimal
SVC 2
MOV r0,#'A'
SVC 3 //print character
MOV r1,0x0
MSR CONTROL,r1
ISB
POP {lr}
BX lr
SVC 内で、スタック チェックを行い、対応する関数を呼び出してコンソールに出力します。SVC コードは次のとおりです。
__attribute__ ((section(".after_vectors")))
void SVCall_Handler(void)
{
while(1)
{
__asm(
"TST lr, #4 \n"
"ITE eq \n"
"MRSEQ r0, MSP \n"
"MRSNE r0, PSP \n"
"LDR r0,[r0,#0] \n"
"LDR r1, [r0, #24] \n"
"LDRB r1, [r1, #-2] \n"
//immediate data in r1 and input parameter in r0
//"PUSH {LR} \n"
"CBNZ r1,svc_hex \n"
"B svc_end \n"
"svc_hex: \n"
"CMP r1,#1 \n"
"BNE svc_decimal \n"
" BL printhex \n"
"B svc_end \n"
"svc_decimal: \n"
"CMP r1,#2 \n"
"BNE svc_character \n"
"BL printdecimal \n"
"B svc_end \n"
"svc_character: \n"
"CMP r1,#3 \n"
"BL printcharacter \n"
"B svc_end \n"
"svc_end: \n"
"MOV r0,#0x0 \n"
"MSR CONTROL,r0 \n"
"ISB \n"
"BX LR \n"
);
}
}
printhex/printcaharaacter/printdecimal は、それぞれの値をコンソールに出力するための関数です。
シングル ステップ モードのデバッグ中、SVC 命令の後に、 No source available for "g_pfnVectors() at 0x0" というエラーが発生します。
エラーの原因と到着はまったく予想外です。gdb デバッガーに問題がありますか、それともコードの解釈方法が間違っていますか?