2013-03-04 6 views
1

스택 PSP를 사용하여 사용자 모드에서 SVC를 호출하려고합니다. LPC 1769 (cortex m3)에서 코드를 디버깅 할 때 다음 오류가 발생합니다. ------- "g_pfnVectors() at 0x0"에 사용할 수있는 소스가 없습니다 사용중인 IDE가 LPC 1769 인 코드 빨강 LPC Xpresso입니다. 임베디드 아티스트. 여기 LPC 1769 (cortex m3) 코드 레드 IDE --- g_pfnVectors() at0x0에 사용할 수있는 소스가 없습니다.

는 I 스택 검사를 수행하고 해당 기능 콘솔에 인쇄라고 어셈블리 코드 SVC 내부

 .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 

이다.

__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/printcaharacter/printdecimal 콘솔에서 각 값을 인쇄 기능은 : 여기 SVC 코드이다.

디버그 중에 단일 단계 모드에서 SVC 명령 다음에 "g_pfnVectors() at 0x0"에 사용할 수있는 소스가 없습니다.

오류의 원인과 도착은 예상치 못한 것입니다. gdb 디버거에 문제가 있습니까? 아니면 코드를 잘못 해석하고있는 것입니까?

답변

2

조금 늦을 수 있지만 다른 사람에게 유용 할 수 있습니다.

g_pfnVectors (또는 위치가 0x0 인 항목)은 인터럽트/예외 벡터 테이블입니다. SVC가 SVC 예외를 호출하면 해당 함수에 대한 포인터는 g_pfnVectors에 있어야합니다. 그것은 귀하의 코드에 해당하지 않는 것으로 보입니다. 따라서 PC0x0으로 점프되며, 이는 또한 g_pfnVectors입니다.

+0

감사합니다. 이걸 좀 볼 수 있니? http://stackoverflow.com/questions/15542360/pass-by-reference-in-assembly –