当前位置: 首页 > news >正文

向量表与重定位(Cortex‑M 系列)

向量表与重定位(Cortex‑M 系列)

一、向量表是什么(快速回顾)

  • 向量表是处理器在异常/中断发生时查找中断处理程序入口的表格,通常放在存储器的低地址(默认 0x00000000)。
  • 向量表第 0 项是主堆栈指针(MSP)初始值,第 1 项是复位处理程序(Reset Handler),随后按 Exception/IRQ 编号顺序排列。
  • 每项为 32 位(地址),向量表按 4 字节对齐存放。
    在这里插入图片描述

二、为什么需要重定位向量表

常见场景:

  • Bootloader → 用户程序切换:Bootloader 在 ROM/Flash,用户程序在 Flash 的另一段,需要把 VTOR 指向用户程序的向量表。
  • 程序运行于 RAM:例如关键 ISR 放 RAM 以获得零等待或动态替换中断向量。
  • 外部/可移植启动:从 SD 卡、外部存储加载程序,然后把向量表放到 RAM 并设置 VTOR。
  • 多镜像/固件升级场景:运行时选择不同的向量表以切换上下文。

三、VTOR(Vector Table Offset Register)

  • Cortex‑M 的 VTOR(SCB->VTOR)用来指定当前使用的向量表基地址。
  • 要求:实现平台通常要求 VTOR 的低若干位为 0(例如最小对齐 128 字节,低 7 位为 0);具体以芯片参考手册为准。
  • 使用 VTOR 前请确保向量表已拷贝到目标地址并对齐。

四、重定位步骤与要点(推荐流程)

  1. 在关闭中断或临界区内执行重定位:
    • __disable_irq();
  2. 将新向量表从 Flash 拷贝到 RAM(若需要):
    • memcpy(RAM_VTOR_ADDR, FLASH_VECTOR_ADDR, vector_size);
  3. 设置 SCB->VTOR 指向 RAM 基址(需 32 位对齐,按芯片对齐要求):
    • SCB->VTOR = (uint32_t)RAM_VTOR_ADDR;
  4. (可选)清空或无效化 I/D cache(M7 等)以保证一致性。
  5. 恢复中断: __enable_irq();

注意:务必先拷贝并设置好 vector entries(MSP、Reset 不必修改,通常保留),再开启中断。若中断已启用,可能在切换瞬间触发意外 ISR。
在这里插入图片描述

五、示例代码(基于 CMSIS)

// filepath: c:\Users\yeyue\Desktop\book\学习记录\MD文件2\向量表与重定位.md
// ...existing code...
// 向量表重定位示例(在启动或运行时调用)
#include <string.h>
#include "stm32f4xx.h" // 或相应 CMSIS 头extern uint32_t __Vectors[];          // 链接脚本中定义的向量表起始符号
#define RAM_VTOR_ADDR  ((uint32_t)0x20000000) // 目标 RAM 地址(示例)void relocate_vector_table_to_ram(void) {uint32_t vector_size_words = 128 / 4; // 示例:128 字节向量表(按实际 IRQ 数确定)__disable_irq();memcpy((void*)RAM_VTOR_ADDR, (void*)__Vectors, vector_size_words * 4);SCB->VTOR = RAM_VTOR_ADDR;__DSB(); __ISB(); // 确保 VTOR 覆盖可见__enable_irq();
}
// ...existing code...

说明:实际 vector_size 应根据芯片的 IRQ 数(异常编号最大值)和实现所需字节数调整;不要盲目固定为 128 字节。

六、链接脚本与放置(常见做法)

  • 在链接脚本中保持原始向量表符号(如 __Vectors)位于 Flash 起始,若需把向量表放入特定段供拷贝,添加 .isr_vector 或 .vector_ram 段并导出符号。
  • 将 ISR 频繁修改或对响应时间敏感的函数放到 RAM(使用属性 section(“.ramfunc”) 并在启动时复制)。

七、注意事项与常见陷阱

  • 对齐与大小:VTOR 基址须满足最低对齐要求(例如 128 字节);否则硬件可能忽略或产生异常。
  • MSP 与 Reset:第 0/1 项非常关键,非必要不要任意覆盖。
  • 多核/共享内存(如 H7 双核):注意各核的 VTOR 独立,若共享向量表需处理缓存一致性与互斥。
  • 调试影响:单步调试或断点可能改变缓存/中断时序,验证请在 Release 下做真实测量。
  • Cache 一致性(Cortex‑M7):拷贝后需清 D‑Cache 或刷新 I‑Cache,防止执行旧指令。

八、结论

向量表重定位是启动引导、运行时升级与 RAM 执行常用技术。核心要点是:确保拷贝完整、地址对齐、在安全(中断受控)环境下更新 VTOR,并考虑缓存一致性与多核场景。按上述步骤实现后,系统能够在运行时灵活切换中断向量,支持 Bootloader、温跃式升级、运行时代码替换等功能。

参考:ARM Cortex‑M 权威指南(向量表章节)、设备参考手册(VTOR 对齐要求)。

http://www.dtcms.com/a/454818.html

相关文章:

  • 网站空间是不是服务器河南省建设厅举报网站
  • Linux中查询运行进程的命令
  • 四川建设厅网站施工员证查询建设学校网站多钱
  • 微信小程序连接OneNET需要生成token,简单快速的办法
  • 做网站还是自媒体更适合赚钱wordpress主题 游戏
  • Python3 tuple 函数
  • 网站建设公司江苏wordpress下载类主题
  • 作者新游戏1.2
  • 中国建设银行网站登陆免费个人网页模板
  • 网站建设怎么赚钱深圳市电商网站建设企业
  • 【Linux】线程概念与控制(1)
  • 网站做5年有多少流量网站关键词如何布局
  • H5网站开发工程师网站建设网站形象
  • 狮岭做包包的网站优秀网站推荐
  • Python chr() 函数
  • wordpress网站文章排版插件镇海建设银行网站
  • 用cms建网站ps网站首页设计图制作教程
  • wordpress 浮动播放器seo工作前景如何
  • wordpress做什么网站好网站推广策略有哪些
  • 昆山外贸公司网站建设流程国内做网站哪家公司好
  • 沧州各种网站wordpress首页循环
  • [Java]PTA:(选做) jmu-Java-03面向对象基础-clone方法、标识接口、深拷贝
  • 酒店网站建设考虑的因素wordpress手机版切换
  • Makefile快速入门1
  • 网站信息架构图怎么做阿里巴巴网站维护要怎么做
  • 企业网站网络营销婚礼婚庆网站建设需求分析
  • C4D组域及其他常见的8种域:深度解析与应用指南
  • 网站建设内容3000字网站制作群系统
  • 一个公司多个网站做优化北京餐饮网络营销公司
  • 自建网站有哪些营销培训心得