gpt4 book ai didi

c - mbed-OS 移植到 TivaC TM4123,动态中断处理问题

转载 作者:行者123 更新时间:2023-11-30 15:06:58 27 4
gpt4 key购买 nike

最近我尝试将 mbed-OS 移植到 Tiva-C launchpad TM4C123,我遇到了 mbed 提供的文件 cmsis_nvic.c 和 cmsis_nvic.h 的问题

这个模块应该动态地将操作系统定时器的中断处理程序分配给可寻址函数。(或者据我所知)。

发生的情况是,执行以下行后软件跳转到“硬故障处理程序”

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上集成了所有这些工具)

谁能告诉我这里出了什么问题吗?或者至少我应该调试或阅读哪里来帮助我解决这个问题???

更新

我解决了部分问题, vector 没有指向目标SRAM的首地址,而目标SRAM应该是

#define NVIC_RAM_VECTOR_ADDRESS (0x20000000)

而不是

#define NVIC_RAM_VECTOR_ADDRESS (0x02000000)

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

最佳答案

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

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

2- 应更新链接器文件,以便堆栈指针不会覆盖新复制的 vector 表。因此,将 RAM 地址移动 vector 表应占用的字节数。

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

关于c - mbed-OS 移植到 TivaC TM4123,动态中断处理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38666587/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com