2016-07-29 19 views
0

最近我试图将mbed-OS移植到Tiva-C启动板TM4C123,我遇到了由mbed提供的文件cmsis_nvic.c和cmsis_nvic的问题。 hmbed-OS移植到TivaC TM4123,带动态中断处理的Trouple

该模块应该动态分配OS定时器的中断处理程序到可寻址的功能(或者据我所知)。

什么发生的是,该软件执行以下行

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的矢量)从这样

NVIC_SetVector(TIMER0A_IRQn,(uint32_t的)us_ticker_irq_handler)文件us_ticker.c

;

(我的编译器是ARM​​ GCC,我使用CDT的建设,GDB OpenOCD的调试,并集成在Eclipse中的所有这些工具)

任何人都可以请让我知道是怎么回事错在这里?或者至少我应该在哪里调试或阅读以帮助我解决这个问题?

UPDATE

我想出问题的一部分,所述的载体不指向哪个应该是目标SRAM的第一地址

#define NVIC_RAM_VECTOR_ADDRESS (0x20000000) 

代替

#define NVIC_RAM_VECTOR_ADDRESS (0x02000000) 

所以现在当调用NVIC_SetVector时,函数被执行。但是,当启用中断时,软件仍然跳转到硬故障,我猜(只是猜测或可能是解决方案的一部分)头文件中的定义配置不正确,有人可以向我解释它们是什么意思?以及如何计算向量地址的数量?什么是用户偏移?

+0

'i'的价值是什么?也就是说,如果> 0,那么一些设置好了。如果没有,使用gdb打印值。你正在接线'16' - 是NVIC_USER_IRQ_OFFSET吗?如果是这样,请使用它。你可能会跑到最后(例如'i'> ='NVIC_NUM_VECTORS')。你能用gdb戳“矢量”吗? 'VTOR'在开始时是否有效? (即,两个正确值中的一个:0/0x2000000)。它是获取'old_vectors'还是存储'vectors'这个问题(即做'x = old_vectors [i]; vectors [i] = x;'并且看哪条线路故障)?我希望你正在做'-O0'来进行调试。你在任何指针变量上都需要'volatile'吗? –

+0

我已经更新了这个问题?你能否检查出来,让我知道你是否有答案? –

+0

TIMER0A_IRQn定义为什么?它是代码期望的向量编号还是中断编号(向量编号减16)?另请参阅数据表中的表2-9;你有一个_lot_多于66个外设IRQs ...... – Notlikethat

回答

1

我已经解决了这个问题,这里是我发现

1- NVIC_RAM_VECTOR_ADDRESS不应该是`0x20000000'

2 - 连接文件应如此更新我的目标RAM的首地址堆栈指针不应写入新复制的向量表。所以按照向量表占用的字节数来移动RAM地址。

函数NVIC_SetVector,i内部的3-(主要原因)被宣布为uint32_t,然后与小于255的预处理器值进行比较。所以编译通过比较uint32_tuint8_t,通过将UL添加到预处理器的值来弄糊涂,它解决了整个问题。