关于6410中断处理的问题
将编编译好的ucos文件,用u-boot的dnw命令下载到内存中区,go命令可以直接运行,但是这中间有个问题不明白,就是关于时钟中断的问题,看完了u-boot的源码没有发现使用中断。这样一来在ucos里面就要开中断,的确在time.c这个文件中看到了开time4中断,为IRQ中断,并且把中断向量表定义到了内存的最高位,那么就有一个问题了,中断发生后怎么处理的,按照以前的思路,当发生IRQ中断后,PC值强制为0x18,跳到那个地方去执行,而一般在内存0x18的地方有一条跳转命令跳到真正的中断处理程序。但是我们的内存中0x18处却没有指令,u-boot初始化的时候把自己搬到了内存的高位地址,即使开了MMU,我看到的u-boot源码是把虚拟地址0x00开始的地方映射到了物理地址0x50000000,也就是说物理地址0x50000000这个地址是没有异常向量表的。那么这样一来ucos程序是怎么处理这个中断的呢?另外后来我看到网上有一篇文章讲的是6410的VIC port模式,可以开启向量中断。以前看LPC系列处理器的时候也有这个向量中断控制器,但是它也必须先跳到0x18处取指令,而在那个地址上放的指令是ldr pc,pc-#0xfe,好像是这么一条吧,计算一下这句程序刚好把向量中断控制器中的中断服务程序地址放到pc中,从而实现了pc一步跳到中断处理程序,另外说一下刚才说的向量中断控制器中的中断服务程序地址是VIC控制器自动送进去的,我们在使用中断的时候先将每个中断服务程序地址放到对应的专用中断地址寄存器,LPC系列一共16个专用的。当对应的中断发生的时候,这16个个专用地址寄存器中的值会被VIC控制器自动送到刚才所提到的那个通用的地址寄存器,这样每次pc中就总能装载正确的服务程序。网上的那篇文章说要使用这个功能就要操作p15协处理器的相应寄存器,在ucos中没找到这个操作,另外即使有了这样的操作,那么0x18这个地方还是没有跳转指令。或者还有一种可能就是6410的VIC更先进,也不需要到0x18地址上去跳转,而VIC控制器直接被送到了PC,这样说有点牵强,毕竟没有验证过。但是即使这样也没有见到操作p15的寄存器。请个位高手帮我解答这个问题,我在搞裸机程序,lcd移植到U-BOOT上成功了,但是触摸屏因为要中断,而现在就卡在中断这个地方没有往下做。 回复 2# yaongtime
但是在ucos里面没看到操作p15寄存器这样的程序啊。如果是这样的,那就像我说的,6410的VIC比LPC系列的更先进一下,可以不到0x18去取指令。呵呵,需要验证一下 vic 中断的话
只需要把你中断服务程序地址放进去~
来中断后,就不需要判断,直接跳入中断服务器程序里拉~ 回复 4# 飞凌-alexlee
那中断后的寄存器怎么办呢?进入IRQ模式后r0-r7寄存器也是CPU自动保存到设置好了的IRQ堆栈吗? 你的意思是怎么返回到进入之前的程序是吗? 回复 6# 飞凌-alexlee
对,基本是那么意思,比如时钟中断是用C语言写的,在初始化中断的时候把时钟中断处理程序句柄赋值给相对应的中断通道号地址寄存器。那么在发生中断的时候CPU可以通过VIC提供的地址直接跳转到中断处理函数,那么跳过去之后r0-r7寄存器的内容怎么办呢?因为没有经过0x18那个IRQ中断地址,所以我们也就没法在汇编程序里保存r0-r7的内容了,这样的话在执行中断处理函数的时候不是会覆盖掉r0-r7吗?还是说我们在最开始的时候设置好IRQ堆栈指针后,这个保存工作也是由CPU自动完成的?
返回也是自动恢复r0-r7的内容。我在这个问题上纠结了很久一直没想明白,手头也没有仿真器不能看真实中断发生的情况,非常感谢:handshake 联系一下客服,我发电资料给你~
页:
[1]