Assembly 调试IAR组件的ARM Cortex-M硬故障
以下代码是为GCC编写的 我想知道如何在IAR编译器下编译这段代码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
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有效吗?检查块前后编译器生成指令的反汇编。