1

スタック 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 デバッガーに問題がありますか、それともコードの解釈方法が間違っていますか?

4

1 に答える 1

2

これはあなたにとっては少し遅いかもしれませんが、他の誰かにとっては役に立つかもしれません.

g_pfnVectors(または位置にあるものは何でも0x0)、割り込み/例外ベクトルテーブルです。SVC は SVC 例外を呼び出します。その関数へのポインターはg_pfnVectors. あなたのコードではそうではないように見えるので、 にジャンプPCします。0x0g_pfnVectors

于 2013-04-10T16:15:01.583 に答える