挺矬的一件事

来源:互联网 发布:南京java培训机构排名 编辑:程序博客网 时间:2024/04/30 19:36

最近在玩6410的一块开发板,跑ucOS2。

想写一个基于串口的调试命令输入,方便观察变量。基本想法是接收串口的输入回显并判别、执行命令,输出内存值。

VIC1上使能UART0输入中断,虽然在之前已经把UART0除接收中断外的都屏蔽了,刚使能立刻打印就能看到UART0的中断Pending,看来之前BOOT发送中断都是使能的。初始化完成后打开全局中断,就反复跳到UART0的ISR里,一直觉得可能是VIC1的中断响应写的有问题,看了一些文档,有的说要清VIC0和VIC1,于是反复在VIC0ADDR和VIC1ADDR之前读写,都没什么用,后来证实只要读写VIC1就可以了,试了一下2个都读写也没什么问题,但不在对应ISR中这么做是错误的,可能会使PL192异常,对于2个VIC的中断嵌套看到正规手册上是这么做的:

 

      ; 进入IRQ模式,关闭全局中断

      ;保存用到的寄存器

      ;读VICxADDR,以屏蔽其他同级和低优先级的中断源,VICIRQSTATUS和VICRAWINTR不受影响

      ;保存SPSR

      ;使能全局中断,进入SVC模式执行中断处理子程序,并清除中断源

                 。。。            <----高优先级中断可能进入

      ;关闭全局中断,再次进入IRQ模式

      ;恢复SPSR

      ;恢复用到的寄存器

      ;写VICxADDR,响应中断,清除中断向量

      ;返回

 

好像和普通的中断嵌套处理没什么区别。

FIQ,IRQ能同时从VIC发出,AMR核会优先响应FIQ,只能有一个FIQ?默认优先级都是一样的15(最低),同优先级低中断号的优先级高一些,但不会因此而发生中断嵌套。

6410支持3种中断处理方式,一种是老的AHB方式,也就是人为读写VICxADDR,读写Daisy Chain上的VIC清除中断Prime上的VIC中断自然也会清除;另一种是Daisy-chained VIC模式,VIC之间的VICIRQACKOUT是相连的,人为控制PrimeVIC;另一种是VIC port方式,由P15协处理器自动响应中断,程序跳转并ACK包括DaisyChain上的中断源,VIC之间有握手信号线,还区分同步和异步方式。faint!

 

回来说那个反复跳进ISR的问题,其实是清除UART0的pending寄存器地址定义错了,每次都没清掉,真不细心,查了1天时间,也学习了一些VIC中断的DD。搞这个挺累的。

最后查看内存的命令终于能用了,可不会弄Del的回显,光标不会动,不知道是不是Dnw的问题,下次查查。还要加点联想的功能,每次输入太累了。

原创粉丝点击