Tip / Sign in to post questions, reply, level up, and achieve exciting badges. Know more

XMC1000 中断向量表重映射 – KBA235654

XMC1000 中断向量表重映射 – KBA235654

LinglingG_46
Moderator
Moderator
Moderator
10 questions asked 5 questions asked 250 sign-ins

XMC1000 中断向量表重映射 – KBA235654

Community Translation:XMC1000-Vector-table-remap-KBA235654 

 

Arm® Cortex®内核搭载了嵌套向量中断控制器(NVIC),可处理多种中断和内核异常。NVIC使用中断向量表决定执行哪些代码。如果需要重映射中断向量表,在部分Cortex®架构中可通过修改向量表偏移量寄存器(VTOR)的值实现。在以下场景中可能出现该需求:

  • 应用程序带bootloader,但bootloader和应用程序各有中断向量表。
  • 需要将中断向量表放在RAM来动态地修改中断向量
  • 使用外部RAM

注意,XMC1000系列的Cortex® M0内核并不支持这一功能,需要另行使用Dave启动代码。

关于XMC1000系列的更多信息,请参阅应用说明AP32326.

中断向量表重映射:

中断向量表被重新映射到SRAM中,但每个向量只占4个字节,不足以处理异常或中断。因此,需要添加分支指令让处理器跳到另一个实际处理中断的地址处。该功能需要通过veneer实现,让veneer作为指令的中间目标,使处理器跳到实际位置。以下为veneer代码示例:

.section “.XmcVeneerCode”,”ax”,%progbits
.align 1
.globl HardFault_Veneer
HardFault_Veneer:
LDR R0, =HardFault_Handler
MOV PC, R0
In the startup code you can see this being done by using the following Macro
.macro Insert_InterruptVeener Interrupt
.globl \Interrupt()_Veener
\Interrupt()_Veener:
LDR R0, =\Interrupt()_Handler
BX R0
.endm

通过以下宏映射到默认handler:

.macro Insert_InterruptHandler Interrupt
.weak \Interrupt()_Handler
#if defined(ENABLE_OWN_HANDLER)
.thumb_func
.type \Interrupt()_Handler, %function
\Interrupt()_Handler:
b .
.size \Interrupt()_Handler, . - \Interrupt()_Handler
#else
.thumb_set \Interrupt()_Handler, Default_Handler
#endif
.endm

用户可选择自定义handler,还可以查看linker文件中veneer是否映射至初始SRAM地址。

/* DSRAM layout (Lowest to highest)*/
/* Veneer <> Stack <> DATA <> BSS <> HEAP */

.VENEER_Code ABSOLUTE(0x2000000C):
{ . = ALIGN(4); /* section size must be multiply of 4. See startup.S file */ VeneerStart = .; KEEP(*(.XmcVeneerCode)); . = ALIGN(4); /* section size must be multiply of 4. See startup.S file */ VeneerEnd = .; }
> SRAM AT > FLASH
eROData = LOADADDR (.VENEER_Code);
VeneerSize = ABSOLUTE(VeneerEnd) - ABSOLUTE(VeneerStart);

 

 

0 Likes
28 Views
Contributors