最近,我试图将mbed-OS移植到Tiva-C启动板TM4C123,我遇到了mbed提供的文件cmsis_nvic.c和cmsis_nvic.h的问题。
该模块应该将OS计时器的中断处理程序动态分配给可寻址功能(据我所知)。
发生的是,执行以下行后,软件跳至“ Hard Fault Handler”
vectors[i] = old_vectors[i];
这是我使用的文件
#include "cmsis_nvic.h"
#define NVIC_RAM_VECTOR_ADDRESS (0x02000000) // Vectors positioned at start of RAM
#define NVIC_FLASH_VECTOR_ADDRESS (0x0) // Initial vector position in flash
void NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) {
uint32_t *vectors = (uint32_t*)SCB->VTOR;
uint32_t i;
// Copy and switch to dynamic vectors if the first time called
if (SCB->VTOR == NVIC_FLASH_VECTOR_ADDRESS) {
uint32_t *old_vectors = vectors;
vectors = (uint32_t*)NVIC_RAM_VECTOR_ADDRESS;
for (i=0; i<NVIC_NUM_VECTORS; i++) {
vectors[i] = old_vectors[i];
}
SCB->VTOR = (uint32_t)NVIC_RAM_VECTOR_ADDRESS;
}
vectors[IRQn + 16] = vector;
}
uint32_t NVIC_GetVector(IRQn_Type IRQn) {
uint32_t *vectors = (uint32_t*)SCB->VTOR;
return vectors[IRQn + 16];
}
这是cmsis_nvic.h
#ifndef MBED_CMSIS_NVIC_H
#define MBED_CMSIS_NVIC_H
#define NVIC_NUM_VECTORS (154) // CORE + MCU Peripherals
#define NVIC_USER_IRQ_OFFSET 16
#include "cmsis.h"
#ifdef __cplusplus
extern "C" {
#endif
void NVIC_SetVector(IRQn_Type IRQn, uint32_t vector);
uint32_t NVIC_GetVector(IRQn_Type IRQn);
#ifdef __cplusplus
}
#endif
#endif
我正在打电话
NVIC_SetVector(IRQn_Type IRQn,uint32_t矢量)
来自这样的文件us_ticker.c
NVIC_SetVector(TIMER0A_IRQn,(uint32_t)us_ticker_irq_handler);
(我的编译器是ARM GCC,我使用CDT进行构建,使用GDB openOCD进行调试,并将所有这些工具集成到Eclipse上)
有人可以让我知道这里出了什么问题吗?或至少我应该在哪里调试或阅读以帮助我解决此问题???
我发现了问题的一部分,向量没有指向目标SRAM的第一个地址,应该是
#define NVIC_RAM_VECTOR_ADDRESS (0x20000000)
代替
#define NVIC_RAM_VECTOR_ADDRESS (0x02000000)
因此,现在在调用NVIC_SetVector时,将执行该函数。但是,当启用中断时,软件仍然跳到“硬故障”,我猜(只是猜测,或者可能是解决方案的一部分),头文件中的定义配置不正确,有人可以向我解释它们的意思吗?以及如何计算向量地址的数量?USER OFFSET是什么?
我已经解决了这个问题,这就是我所发现的
1-NVIC_RAM_VECTOR_ADDRESS
不是我的目标RAM的第一个地址,应该是0x20000000
2-链接器文件应进行更新,以使堆栈指针不应覆盖新复制的向量表。因此,将RAM地址移动向量表应占用的字节数。
3-(主要原因)的内部功能NVIC_SetVector
,i
被宣布为uint32_t
然后与小于255预处理器的值。因此,通过uint32_t
与进行比较来使编译感到困惑uint8_t
,通过增加UL
预处理器的值,它解决了整个问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句