版主
最后登录1970-1-1
在线时间 小时
注册时间2015-12-2
|
在官方SDK中的fsl_common.c文件中发现如下函数,这个跟我们需要把中断向量表拷贝到内部RAM是差不多原理,有人知道怎么使用吗?
- #ifndef __GIC_PRIO_BITS
- #if defined(ENABLE_RAM_VECTOR_TABLE)
- uint32_t InstallIRQHandler(IRQn_Type irq, uint32_t irqHandler)
- {
- /* Addresses for VECTOR_TABLE and VECTOR_RAM come from the linker file */
- #if defined(__CC_ARM)
- extern uint32_t Image$VECTOR_ROM$Base[];
- extern uint32_t Image$VECTOR_RAM$Base[];
- extern uint32_t Image$RW_m_data$Base[];
- #define __VECTOR_TABLE Image$VECTOR_ROM$Base
- #define __VECTOR_RAM Image$VECTOR_RAM$Base
- #define __RAM_VECTOR_TABLE_SIZE (((uint32_t)Image$RW_m_data$Base - (uint32_t)Image$VECTOR_RAM$Base))
- #elif defined(__ICCARM__)
- extern uint32_t __RAM_VECTOR_TABLE_SIZE[];
- extern uint32_t __VECTOR_TABLE[];
- extern uint32_t __VECTOR_RAM[];
- #elif defined(__GNUC__)
- extern uint32_t __VECTOR_TABLE[];
- extern uint32_t __VECTOR_RAM[];
- extern uint32_t __RAM_VECTOR_TABLE_SIZE_BYTES[];
- uint32_t __RAM_VECTOR_TABLE_SIZE = (uint32_t)(__RAM_VECTOR_TABLE_SIZE_BYTES);
- #endif /* defined(__CC_ARM) */
- uint32_t n;
- uint32_t ret;
- uint32_t irqMaskValue;
- irqMaskValue = DisableGlobalIRQ();
- if (SCB->VTOR != (uint32_t)__VECTOR_RAM)
- {
- /* Copy the vector table from ROM to RAM */
- for (n = 0; n < ((uint32_t)__RAM_VECTOR_TABLE_SIZE) / sizeof(uint32_t); n++)
- {
- __VECTOR_RAM[n] = __VECTOR_TABLE[n];
- }
- /* Point the VTOR to the position of vector table */
- SCB->VTOR = (uint32_t)__VECTOR_RAM;
- }
- ret = __VECTOR_RAM[irq + 16];
- /* make sure the __VECTOR_RAM is noncachable */
- __VECTOR_RAM[irq + 16] = irqHandler;
- EnableGlobalIRQ(irqMaskValue);
- /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping
- exception return operation might vector to incorrect interrupt */
- #if defined __CORTEX_M && (__CORTEX_M == 4U)
- __DSB();
- #endif
- return ret;
- }
- #endif /* ENABLE_RAM_VECTOR_TABLE. */
- #endif /* __GIC_PRIO_BITS. */
复制代码
|
|