gpt4 book ai didi

Cortex-M3 实时中断 vector 重映射

转载 作者:行者123 更新时间:2023-11-30 17:06:43 25 4
gpt4 key购买 nike

我将 GCC 4.9 (arm-none-eabi) 与 STM32 结合使用,并希望将中断表放入数组中,以便在代码中需要时更改中断处理程序地址。
我阅读了现有的手册和文章并执行了以下操作:

我必须对齐数组,因此我更改了链接描述文件以在 RAM 中添加自定义部分并将其放置到 0x20001000 以便自动对齐

 .vectorsSection 0x20001000 :
{
KEEP(*(.vectorsSection))
} >RAM

声明数组来放置 IVT,我在 header 中将其声明为 extern,在 .cc 中:

volatile word __attribute__((section (".vectorsSection"))) _vectors_[64] = {0};

检查数组是否位于正确的地址:

arm-none-eabi-nm program.elf | grep _vectors_
20001000 d _ZL9_vectors_

现在需要将表重新分配到 RAM。我写了这个函数

void (*new_code_entry)(void);
.......
static void remap_vector_table (void)
{
//VTOR is 0 on startup, so we change VTOR only once
if(SCB->VTOR)
return;
new_code_entry = (void (*)(void))((word)&_vectors_ + sizeof(word) + 1);//Skip SP and jump to Reset
memcpy((void*)_vectors_, (void*)SCB->VTOR, sizeof _vectors_);
SCB->VTOR = 0x1FFFFF80ul & (word)(&_vectors_); //Set VTOR offset
__DSB(); //Complete all memory requests
new_code_entry(); //Jump to new code
}

我从启动代码创建了枚举,以便轻松访问数组。
最后跳转后,代码从头开始,VTOR 为 4096。
数组包含正确的地址,其顺序与启动代码中的顺序相同。
但说到

__enable_irq();
__ISB();

它卡在第一个异常上,更具体地说,这是调用堆栈

5 <symbol is not available> 0x697b617a   
4 <signal handler called>() 0xfffffff9
3 <symbol is not available> 0x200011f8
2 remap_vector_table() main.cc:31 0x08000cd4
1 main() main.cc:46 0x08000d32

200011f4: tickcounter+0 movs r0, r0
200011f6: tickcounter+2 movs r0, r0
200011f8: ; <UNDEFINED> instruction: 0xf0d3e321

tickcounter 来自 SysTick_Handler,肯定首先被调用。也许我应该用堆栈指针做点什么?我不知道这里出了什么问题。

最佳答案

根本原因很简单:

  1. 根据手册第29位显示基本偏移:RAM或FLASH。

    SCB->VTOR |= 1 << SCB_VTOR_TBLBASE_Pos;

这解决了问题

  • 更改表格后无需重置 - 它会清除我的数组
  • 关于Cortex-M3 实时中断 vector 重映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34474738/

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