[活动] [1024极海技术日]你知道中断向量入口吗

[复制链接]
565|15
jobszheng 发表于 2025-10-30 19:43 | 显示全部楼层 |阅读模式
一天的时间,两个好基友,一行#define预定义,这三个元素组成了今天这台戏!
公司有一个测试项目安排我来写一段测试工程。工程的技术需求明确,业务逻辑简单。抽象出来也没有多少——启动MCU,配置一些参数,再从中断函数中观察测试结果是否符合预期。
我倒是很快写完了代码,因为业务逻辑并不多,并且项目的主分支上也可以利用现成的软件环境,所以改动并不大,时间也没有花掉多少。
交付之后,我的好基友来测试验证。不久,他反馈,测试未通过!原因是由于配置参数有前置条件,上回的文档未包括。这回才补全,让我赶紧再出一版固件。
补全的内容也不多,又不影响架构。简单写了几下,程序就修改完成了,再次提交给他。
没过多久,他就反馈,仍然不通!而且,MCU貌似宕机crash了!他也坐到我工位旁边,与我一起分析 、调试!
从代码配置到堆栈溢出,从变量初始值再到MAP表。由于crash的时间正好在开启中断的那一刻,我们又对了中断线编写和中断函数列表是否有错位。文档也从业务逻辑,查到keil的帮助文档。大脑好久没有这么快的运行过了!
就当我们计划放弃另请高人的时候,我突然意识到是不是中断向量入口地址写错了!如果中断向量入口地址写错了,也就是基地址错了。中断入口函数的偏移地址即使正确,当中断触发时,同样会发生调用空指针的crash后果。在ARM Cortex-M系列的MCU中,中断向量入口地址是通过SCB->VTOR寄存器写入,是在系统进入main()函数之前由预置代码完成。
这时,倒是熟练的打开了system.c文件,查看systeminit()函数的实现。果然,我的上一位同事是直接把SCB->VTOR的预置代码修改了,如下所示:
  1. //#ifdef VECT_TAB_SRAM
  2.     SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET;
  3. //#endif
而正确的应该为:
  1. #ifdef VECT_TAB_SRAM
  2.     SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET;
  3. #else
  4.     SCB->VTOR = FMC_BASE | VECT_TAB_OFFSET;
  5. #endif
我git pull下来的项目代码的上一位同事,估计没有注意看预定义部分,而是上手直接修改了SCB->VTOR的实现代码。在项目中的实现与变更应该遵守项目原代码的框架设计即修改头部的预定义(官方代码也有注释说明):
  1. //#define VECT_TAB_SRAM
  2. /* Vector Table base offset field. This value must be a multiple of 0x200. */
  3. #define VECT_TAB_OFFSET       0x00

也就是说,我的上一位同事应该把上面第1行的代码注释去掉即可,systeminit()函数的内容不应该修改。
这个调试bug终于解决了!我也把代码恢复了原官方架构。
我们这次的bug调试还是非常辛苦,所以,大家在团队编码的时候,一定要注意只修改,只更新属于自己负责的那部分代码。切记!切记!


@Gfan 参加活动了





Gfan 发表于 2025-10-31 15:06 | 显示全部楼层
哈哈哈哈哈很喜欢看jobszheng大佬的分享文章~第一句话就有种脱口秀的感觉了,后面又给到大家实质性的分享,真好呀
永恒的一瞥 发表于 2025-10-31 18:22 | 显示全部楼层
还别说!这文字的风格有点意思!
神秘低语 发表于 2025-11-1 20:39 | 显示全部楼层
为什么要使用SRAM地址啊
发光的梦 发表于 2025-11-1 21:48 | 显示全部楼层
还没有使用过这个功能 呢!
空灵回声 发表于 2025-11-1 23:57 | 显示全部楼层
中断异常先检查一下NVIC的寄存器值。如果pending了,再考虑入口函数的问题。如果没有pending肯定是哪个中断屏蔽位没有释放呗
抒情黎明 发表于 2025-11-2 15:32 | 显示全部楼层
没有使用过中断向量入口。
水之呢喃 发表于 2025-11-3 09:52 | 显示全部楼层
中断向量表不是Keil默认实现的吗?
星云狂想曲 发表于 2025-11-4 14:18 | 显示全部楼层
中断向量表的技术知识点还挺多的。
星辰伴梦 发表于 2025-11-5 21:04 | 显示全部楼层
这个故事告诉我们,代码审查和团队沟通是多么重要,一个小小的疏忽就可能引发大问题。
梦塑者 发表于 2025-11-4 23:42 | 显示全部楼层
这是越学习,知识越多。
估计又涉及到了sct链接文件了
亿年回响 发表于 2025-11-5 17:04 | 显示全部楼层
有意思。
以后遇到类似的问题知道如何去调试与解决了
星云避风港 发表于 2025-11-5 19:52 | 显示全部楼层
修改了基础代码,这个确实比较难发现。
默认这些代码都是正确的,潜意识这东西很难校正过来。
天体书记 发表于 2025-11-7 17:33 | 显示全部楼层
如果不做IAP的话,基本也用不到这个定义
梦之一瞥 发表于 2025-11-9 17:00 | 显示全部楼层
如果使用IAP的话,这个是基本原理,必须要掌握
治愈糖果屋 发表于 2025-11-12 22:13 | 显示全部楼层
调试过程听起来很紧张刺激,能够从细节中发现问题并解决,你的技术功底真的很扎实。
CloudKiss 发表于 2025-11-14 23:15 | 显示全部楼层
中断向量入口也会被修改了啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:嵌入式技术专家
简介:热爱开源,乐于分享。在嵌入式技术领域里面,主攻通讯协议,Modbus,TCP/IP以及虚拟化和RTOS

32

主题

781

帖子

24

粉丝
快速回复 在线客服 返回列表 返回顶部