打印
[技术问答]

HC32L190芯片的SCB->VTOR 寄存器存在吗?

[复制链接]
557|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lee8871|  楼主 | 2024-11-13 22:21 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
HC32L190芯片是否做了这个寄存器:


我看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 | 只看该作者


需要自己去勇于探索,他肯定是有的,但是M0和M0+的话,头文件是写了,只是没有开放出来,需要自己加宏定义把这个寄存器开放出来。
当然不开放也无所谓,直接在这个寄存器的地址上写值也是可以的

使用特权

评论回复
5
lee8871|  楼主 | 2024-11-14 14:40 | 只看该作者
wubangmi 发表于 2024-11-14 11:37
需要自己去勇于探索,他肯定是有的,但是M0和M0+的话,头文件是写了,只是没有开放出来,需要自己加宏定义 ...

谢谢,这个寄存器是存在的。是我的中断程序出了问题。

使用特权

评论回复
6
lee8871|  楼主 | 2024-11-14 15:02 | 只看该作者
本帖最后由 lee8871 于 2024-11-14 15:08 编辑
wubangmi 发表于 2024-11-14 11:37
需要自己去勇于探索,他肯定是有的,但是M0和M0+的话,头文件是写了,只是没有开放出来,需要自己加宏定义 ...


我在App的中断向量表用了这样的方法跳转回到Bootloader。
其中中断服务函数存储在syscall_table数组里。在中断时加载数组的值,然后用BX指令跳转。

经过测试,R1的值正是这个函数指针,
单步调试也进入了这个函数

单步调试可以正确的从这个函数退出,但是运行时则会出现HardFault
根据调用堆栈的显示,在进入LPUART0_IRQHandler后的第一条指令,就出错了。


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


使用特权

评论回复
7
lee8871|  楼主 | 2024-11-14 15:04 | 只看该作者
本帖最后由 lee8871 于 2024-11-14 15:07 编辑

就是这个问题,让我搞不清楚SCB_VTOR是否存在。
目前这个问题的原因还找不到。

使用特权

评论回复
8
lee8871|  楼主 | 2024-11-14 15:30 | 只看该作者
也就是说,我的中断出问题了。汇编写的中断,快速执行进去,就会出HardFault,而且固定在第一条指令出HardFault

但是在第一条指令上下调试断点,就又能正确执行过去。这是什么原因?

使用特权

评论回复
9
wubangmi| | 2024-11-14 15:42 | 只看该作者
本帖最后由 wubangmi 于 2024-11-14 15:44 编辑

哥们不要玩的这么花,用C好好写就行了。

使用特权

评论回复
10
lee8871|  楼主 | 2024-11-14 15:50 | 只看该作者
非常感谢您的建议。不过这个我倒是比较乐观。
其实本质的原因是我用汇编写的中断函数,用来测试了中断向量重定向。
结果我用汇编写的中断函数有问题,进去就HardFault,但是单步调试又没问题,连续运行才有问题。

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


使用特权

评论回复
11
wubangmi| | 2024-11-14 16:10 | 只看该作者
lee8871 发表于 2024-11-14 15:50
非常感谢您的建议。不过这个我倒是比较乐观。
其实本质的原因是我用汇编写的中断函数,用来测试了中断向量 ...

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

所以我在这里大胆预测,最后你还是放弃了。

使用特权

评论回复
12
lee8871|  楼主 | 2024-11-14 16:54 | 只看该作者
本帖最后由 lee8871 于 2024-11-14 17:15 编辑

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



函数名是Default_Handler。翻译过来也就是默认的句柄。看汇编,是一个无限循环。
启动文件将中断向量表中所有向量都赋值给了这个无线循环的函数,并且用了弱引用:

弱引用 的作用是:如果程序中其他地方也定义了同名的函数,弱引用的就会失效。
也就是说,未用的中断如果触发了都进入无限循环,如果外面有定义,就进入对应的中断函数。

这是我写的程序,可以看出,正是仿照这个原厂提供的Default_Handler写的



为什么原样写了还是不对呢?
我发现Default_Handler并不是像一般的函数一样使用,而是这样使用的:

看到这个 我突然想起Arm的特性,Arm分为Arm指令集,和Thumb指令集,而M0+作为控制芯片,只支持Thumb。

检查了Bin文件,果然在这个句柄指针是Arm指令:

如何区分Arm和Thumb呢?
跳转的目标地址必须16位对齐,最后一位如果是0,就是跳转并以Arm执行;如果是1并不是跳转到8位对齐的地方,而是是跳转并以Thumb执行。
所以在M0程序中,所有跳转指令的目标都应该以1结尾。
显然,34的末位是0。

我在汇编中已经说明了这是Thumb汇编,为什么还是输出了错误的函数指针呢?


使用特权

评论回复
13
lee8871|  楼主 | 2024-11-14 17:11 | 只看该作者
lee8871 发表于 2024-11-14 16:54
放弃可没法进步。实际上这个问题我刚刚解决了。首先说明一下,这个S文件不是启动文件。启动文件我用的就是 ...

问题就在这条命令:

在汇编中,符号可以是各种东西,包括变量,数据集,函数。
我必须告诉编译器,LPUART0_IRQHandler是一个函数,编译器才会根据当前是什么指令集,决定符号指针是否要作为函数指针,并将末位写入1。
我加上这行指令输出文件就从34变成了35,然后程序就可以正常运行了。

原厂的启动文件并没有把Default_Handler标记为function,不过因为外部没有引用,也没有引起错误。与我所想一致,问题就是这个汇编少了一点点东西,就是这个:    .type LPUART0_IRQHandler, %function




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




使用特权

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

    .type LPUART0_IRQHandler, %function


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

47

帖子

0

粉丝