Moderator
Mar 16, 2023
10:59 PM
- Subscribe to RSS Feed
- Mark as New
- Mark as Read
- Bookmark
- Subscribe
- Printer Friendly Page
- Report Inappropriate Content
Mar 16, 2023
10:59 PM
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);
Labels
Rate this article: