mbed-OS移植到TivaC TM4123,Trouple具有动态中断处理功能

时间:2016-07-29 19:57:55

标签: c arm cortex-m texas-instruments mbed

最近我正在尝试将mbed-OS移植到Tiva-C启动板TM4C123,我面临mbed提供的文件问题,即cmsis_nvic.c和cmsis_nvic.h

该模块应该动态地将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 vector)

来自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时,会执行该函数。但是当启用中断时,软件仍会跳转到硬故障,我猜(只是猜测或可能是解决方案的一部分)头文件中的定义未正确配置,有人可以向我解释它们的含义是什么?以及如何计算向量地址的数量?什么是用户偏移?

1 个答案:

答案 0 :(得分:1)

我已经解决了这个问题,这是我找到的

1- NVIC_RAM_VECTOR_ADDRESS不是我的目标RAM的第一个地址,应该是“0x20000000”

2-链接器文件应该更新,以便堆栈指针不应该写入新复制的向量表。因此,将RAM地址移位矢量表应占用的字节数。

3-(主要原因)函数NVIC_SetVector内,i被声明为uint32_t,然后与低于255的预处理器值进行比较。因此,通过将uint32_tuint8_t进行比较,将编译混淆,通过将UL添加到预处理器值,它解决了整个问题。