[技术问答] HC32L190芯片的SCB->VTOR 寄存器存在吗?

[复制链接]
 楼主| lee8871 发表于 2024-11-13 22:21 | 显示全部楼层 |阅读模式
HC32L190芯片是否做了这个寄存器:
263256734b31ecee1e.png
186766734b3a2250d7.png
我看SCB的寄存器都没有在手册里系统介绍,所以不能确定这个寄存器是否做了。

如果没做的话,还有没有什么别的办法,能够移动异常向量表的位置?
aozima 发表于 2024-11-13 22:59 | 显示全部楼层
手动测试下是否有效
 楼主| lee8871 发表于 2024-11-14 09:50 | 显示全部楼层
aozima 发表于 2024-11-13 22:59
手动测试下是否有效

这可不行。不能确定是我写的不对还是MCU没这个功能。必须先确保一头。
现在现象是这个地址能写进去。写进去以后,原来的中断进不去了,但是新的中断也没进去。
触发异常后,PC= 0xfffffffe,LR=0xfffffff1不知道跑飞到哪了。
wubangmi 发表于 2024-11-14 11:37 | 显示全部楼层
5971367356fe7e6fb9.png

需要自己去勇于探索,他肯定是有的,但是M0和M0+的话,头文件是写了,只是没有开放出来,需要自己加宏定义把这个寄存器开放出来。
当然不开放也无所谓,直接在这个寄存器的地址上写值也是可以的
 楼主| lee8871 发表于 2024-11-14 14:40 | 显示全部楼层
wubangmi 发表于 2024-11-14 11:37
需要自己去勇于探索,他肯定是有的,但是M0和M0+的话,头文件是写了,只是没有开放出来,需要自己加宏定义 ...

谢谢,这个寄存器是存在的。是我的中断程序出了问题。
 楼主| lee8871 发表于 2024-11-14 15:02 | 显示全部楼层
本帖最后由 lee8871 于 2024-11-14 15:08 编辑
wubangmi 发表于 2024-11-14 11:37
需要自己去勇于探索,他肯定是有的,但是M0和M0+的话,头文件是写了,只是没有开放出来,需要自己加宏定义 ...

969167359be4ce5cf.png
我在App的中断向量表用了这样的方法跳转回到Bootloader。
其中中断服务函数存储在syscall_table数组里。在中断时加载数组的值,然后用BX指令跳转。
6084167359c992498d.png
经过测试,R1的值正是这个函数指针,
单步调试也进入了这个函数
8150167359cdf305e5.png
单步调试可以正确的从这个函数退出,但是运行时则会出现HardFault
根据调用堆栈的显示,在进入LPUART0_IRQHandler后的第一条指令,就出错了。
423867359ed8357da.png

以上线索指向,如果在进入异常的第一句话 659967359f569b0f6.png 上打断点,就能正确执行通过;如果直接通过就会进入HardFault。
为了验证这一点,我在后面打上断点 65706735a052edf92.png ,果然印证了上述问题。
984956735a00a02d33.png

 楼主| lee8871 发表于 2024-11-14 15:04 | 显示全部楼层
本帖最后由 lee8871 于 2024-11-14 15:07 编辑

就是这个问题,让我搞不清楚SCB_VTOR是否存在。
目前这个问题的原因还找不到。
 楼主| lee8871 发表于 2024-11-14 15:30 | 显示全部楼层
也就是说,我的中断出问题了。汇编写的中断,快速执行进去,就会出HardFault,而且固定在第一条指令出HardFault 871616735a6bc36ae0.png

但是在第一条指令上下调试断点,就又能正确执行过去。这是什么原因?
wubangmi 发表于 2024-11-14 15:42 | 显示全部楼层
本帖最后由 wubangmi 于 2024-11-14 15:44 编辑

哥们不要玩的这么花,用C好好写就行了。
 楼主| lee8871 发表于 2024-11-14 15:50 | 显示全部楼层
非常感谢您的建议。不过这个我倒是比较乐观。
其实本质的原因是我用汇编写的中断函数,用来测试了中断向量重定向。
结果我用汇编写的中断函数有问题,进去就HardFault,但是单步调试又没问题,连续运行才有问题。

现在梳理了一下,应该核心就是弄清楚汇编的中断函数该怎么写。 713326735abcad9a35.png
目前是这么写的,不知道错误在哪。


wubangmi 发表于 2024-11-14 16:10 | 显示全部楼层
lee8871 发表于 2024-11-14 15:50
非常感谢您的建议。不过这个我倒是比较乐观。
其实本质的原因是我用汇编写的中断函数,用来测试了中断向量 ...

你这截图看不出来你的.s启动文件是自己写的,还是直接调用小华原厂的.s文件。
假设你调用的是小华启动文件。那么你给SCB_VTOR写了偏移量之后,就表明你的中断向量也已经做了偏移并存在你APP的flash的前面地址了,不需要你用汇编写中断函数了,直接调用小华给你写好的中断函数就行。
如果你是想自己写启动文件,貌似也不是这么写的

所以我在这里大胆预测,最后你还是放弃了。
 楼主| lee8871 发表于 2024-11-14 16:54 | 显示全部楼层
本帖最后由 lee8871 于 2024-11-14 17:15 编辑

放弃可没法进步。实际上这个问题我刚刚解决了。
首先说明一下,这个S文件不是启动文件。启动文件我用的就是原厂的。
S文件就是汇编文件。一个工程可以有多个汇编文件,启动文件只是其中之一。
这个是原厂的启动文件,在里面有这么一个函数:

477256735b6382e99f.png

函数名是Default_Handler。翻译过来也就是默认的句柄。看汇编,是一个无限循环。
启动文件将中断向量表中所有向量都赋值给了这个无线循环的函数,并且用了弱引用:
34266735bf34561db.png
弱引用 51846735b76655161.png 的作用是:如果程序中其他地方也定义了同名的函数,弱引用的就会失效。
也就是说,未用的中断如果触发了都进入无限循环,如果外面有定义,就进入对应的中断函数。

这是我写的程序,可以看出,正是仿照这个原厂提供的Default_Handler写的
293866735b84bac89f.png
586556735b83aaa6df.png

为什么原样写了还是不对呢?
我发现Default_Handler并不是像一般的函数一样使用,而是这样使用的:
966196735b8cea541b.png
看到这个 115866735b8e19937a.png 我突然想起Arm的特性,Arm分为Arm指令集,和Thumb指令集,而M0+作为控制芯片,只支持Thumb。
54146735b9770f2a2.png
检查了Bin文件,果然在这个句柄指针是Arm指令:
788196735b9aa456ee.png
如何区分Arm和Thumb呢?
跳转的目标地址必须16位对齐,最后一位如果是0,就是跳转并以Arm执行;如果是1并不是跳转到8位对齐的地方,而是是跳转并以Thumb执行。
所以在M0程序中,所有跳转指令的目标都应该以1结尾。
显然,34的末位是0。
317696735ba7b58cf0.png
我在汇编中已经说明了这是Thumb汇编,为什么还是输出了错误的函数指针呢?


 楼主| lee8871 发表于 2024-11-14 17:11 | 显示全部楼层
lee8871 发表于 2024-11-14 16:54
放弃可没法进步。实际上这个问题我刚刚解决了。首先说明一下,这个S文件不是启动文件。启动文件我用的就是 ...

问题就在这条命令: 537106735bbbe5c253.png

在汇编中,符号可以是各种东西,包括变量,数据集,函数。
我必须告诉编译器,LPUART0_IRQHandler是一个函数,编译器才会根据当前是什么指令集,决定符号指针是否要作为函数指针,并将末位写入1。
我加上这行指令输出文件就从34变成了35,然后程序就可以正常运行了。
810986735bc630a618.png
原厂的启动文件并没有把Default_Handler标记为function,不过因为外部没有引用,也没有引起错误。与我所想一致,问题就是这个汇编少了一点点东西,就是这个:    .type LPUART0_IRQHandler, %function




最后就是离大谱的问题,为啥单步调试能通过,正常运行才会卡进HardFault?
这个就不清楚了。
不过我猜测单步调试的时候,Jtag会塞给MCU一些指令来执行,这些指令当然是Thumb指令,也就会顺带将芯片设置成Thumb状态。
所以单步执行的时候在死机的边缘将指令集状态拉了回来,就能顺利走下去。




 楼主| lee8871 发表于 2024-11-14 17:19 | 显示全部楼层
所以总结这次调试的经验:
第一,单步调试能过去,连续调试过不去的地方,想想是不是指令集用错了。
说是有办法从寄存器看到当前的指令集,可以在HardFault里面看寄存器的T是不是错了。
第二,写汇编的时候要给函数加上这个伪指令:

    .type LPUART0_IRQHandler, %function


您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

60

帖子

0

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