Assembly 调试IAR组件的ARM Cortex-M硬故障

Assembly 调试IAR组件的ARM Cortex-M硬故障,assembly,arm,inline-assembly,iar,Assembly,Arm,Inline Assembly,Iar,以下代码是为GCC编写的 我想知道如何在IAR编译器下编译这段代码 Default_Handler: /* Load the address of the interrupt control register into r3. */ ldr r3, NVIC_INT_CTRL_CONST /* Load the value of the interrupt control register into r2 from the address held in r3. */ ldr

以下代码是为GCC编写的 我想知道如何在IAR编译器下编译这段代码

Default_Handler:
  /* Load the address of the interrupt control register into r3. */
  ldr r3, NVIC_INT_CTRL_CONST
  /* Load the value of the interrupt control register into r2 from the
  address held in r3. */
  ldr r2, [r3, #0]
  /* The interrupt number is in the least significant byte - clear all
  other bits. */
  uxtb r2, r2
Infinite_Loop:
  /* Now sit in an infinite loop - the number of the executing interrupt
  is held in r2. */
  b  Infinite_Loop
  .size  Default_Handler, .-Default_Handler

.align 4
/* The address of the NVIC interrupt control register. */
NVIC_INT_CTRL_CONST: .word 0xe000ed04


/* The prototype shows it is a naked function - in effect this is just an
assembly function. */
static void HardFault_Handler( void ) __attribute__( ( naked ) );

/* The fault handler implementation calls a function called
prvGetRegistersFromStack(). */
static void HardFault_Handler(void)
{
    __asm volatile
    (
        " tst lr, #4                                                \n"
        " ite eq                                                    \n"
        " mrseq r0, msp                                             \n"
        " mrsne r0, psp                                             \n"
        " ldr r1, [r0, #24]                                         \n"
        " ldr r2, handler2_address_const                            \n"
        " bx r2                                                     \n"
        " handler2_address_const: .word prvGetRegistersFromStack    \n"
    );
}

我确信有一些简单的语法更改可以让它进行编译

我自己已经找到了,下面是解决方案:

 __asm volatile
        (
            " tst lr, #4                                                \n"
            " ite eq                                                    \n"
            " mrseq r0, msp                                             \n"
            " mrsne r0, psp                                             \n"
            " ldr r1, [r0, #24]                                         \n"
            " ldr r2, =prvGetRegistersFromStack                         \n"
            " bx r2                                                     \n"
        );

我自己就想出来了,以下是解决方案:

 __asm volatile
        (
            " tst lr, #4                                                \n"
            " ite eq                                                    \n"
            " mrseq r0, msp                                             \n"
            " mrsne r0, psp                                             \n"
            " ldr r1, [r0, #24]                                         \n"
            " ldr r2, =prvGetRegistersFromStack                         \n"
            " bx r2                                                     \n"
        );

为什么要乱来?将其实现为真正的汇编函数不是更好吗?我想用内联汇编实现它,因为HardFault_处理程序在C文件中运行。将代码移到汇编文件如何?C文件中的大部分内容用于防止编译器将源代码解释为C代码,并且仅在原型上有它。你确定这对GCC有效吗?在块之前/之后检查编译器生成的指令的反汇编。为什么要乱用内联汇编呢?将其实现为真正的汇编函数不是更好吗?我想用内联汇编实现它,因为HardFault_处理程序在C文件中运行。将代码移到汇编文件如何?C文件中的大部分内容用于防止编译器将源代码解释为C代码,并且仅在原型上有它。你确定这对GCC有效吗?检查块前后编译器生成指令的反汇编。