打印

s3c44b0好像用不了向量中断模式

[复制链接]
2271|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wx_scut|  楼主 | 2009-5-12 20:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
   我想使用s3c44b0的向量中断,修改了启动代码44b0init.s:
AREA    Init,CODE,READONLY

    ENTRY 
    b ResetHandler  ;for debug
    b HandlerUndef  ;handlerUndef
    b HandlerSWI    ;SWI interrupt handler
    b HandlerPabort ;handlerPAbort
    b HandlerDabort ;handlerDAbort
    b .                ;handlerReserved
    subs pc,lr,#4
    b HandlerFIQ
HandlerADC      VHANDLER     HandleADC
HandlerRTC      VHANDLER     HandleRTC
HandlerUTXD1    VHANDLER     HandleUTXD1
HandlerUTXD0    VHANDLER     HandleUTXD0
HandlerSIO        VHANDLER     HandleSIO
HandlerIIC        VHANDLER     HandleIIC
HandlerURXD1    VHANDLER     HandleURXD1
HandlerURXD0    VHANDLER     HandleURXD0
HandlerTIMER5    VHANDLER     HandleTIMER5
HandlerTIMER4    VHANDLER     HandleTIMER4
HandlerTIMER3    VHANDLER     HandleTIMER3
HandlerTIMER2    VHANDLER     HandleTIMER2
HandlerTIMER1    VHANDLER     HandleTIMER1
HandlerTIMER0    VHANDLER     HandleTIMER0
HandlerUERR01    VHANDLER     HandleUERR01
HandlerWDT        VHANDLER     HandleWDT
HandlerBDMA1    VHANDLER     HandleBDMA1
HandlerBDMA0    VHANDLER     HandleBDMA0
HandlerZDMA1    VHANDLER     HandleZDMA1
HandlerZDMA0    VHANDLER     HandleZDMA0
HandlerTICK        VHANDLER     HandleTICK
HandlerEINT4567    VHANDLER     HandleEINT4567
HandlerEINT3    VHANDLER     HandleEINT3
HandlerEINT2    VHANDLER    HandleEINT2
HandlerEINT1    VHANDLER     HandleEINT1
HandlerEINT0    VHANDLER     HandleEINT0


HandlerDef
     stmfd   sp!,{r0,r1}    ;//r0,r1入栈
     ldr     r0,=I_PMST        ;//把中断主从优先级分配器地址放入r0
     ldr     r1,[r0]        ;//把其里面的内容放入r1
     str     r1,[r0]        ;//把寄存器r1的内容放入中断主从优先级分配器地址
     ldmfd   sp!,{r0,r1}    ;//原r0,r1工作寄存器内容出栈
     subs    pc,lr,#4        ;//跳回到原执行地址

去掉了非向量中断的部分
重新使用了向量中断处理宏定义:
;/************************************** 向量中断跳转宏定义 ************************************************/

    MACRO
$VHandlerLabel VHANDLER $VHandleLabel

$VHandlerLabel
    sub        sp,sp,#4              ;//sp 减4是为了存储跳转地址用
    stmfd   sp!,{r0}             ;//工作寄存器入栈r0(LR不入栈,因为它返回到原始地址)
    ldr     r0,=I_ISPR            ;//把中断挂起寄存器地址放入r0
    ldr     r0,[r0]                 ;//把中断挂起寄存器内容放入r0
    cmp     r0,#0x0                 ;//比较,看是否有中断产生
    beq         %F0                 ;//若无中断产生,跳到标号0处
    
    ldr        r0,=$VHandleLabel     ;//加载 VHandleXXX的地址到 r0寄存器
    ldr        r0,[r0]                 ;//加载VHandleXXX的内容(即服务子程序的起始地址)到r0寄存器
    str        r0,[sp,#4]              ;//r0寄存器内容入栈
    ldmfd   sp!,{r0,pc}              ;//原r0工作寄存器内容和跳转到ISR的地址出栈
    
0   stmfd   sp!,{r1}             ;//工作寄存器r1入栈(LR不入栈,因为它返回到原始地址)
    ldr     r0,=I_PMST             ;//把中断主从优先级分配器地址放入r0
    ldr     r1,[r0]                 ;//把其里面的内容放入r1
    str     r1,[r0]                 ;//把寄存器r1的内容放入中断主从优先级分配器地址
    
    ldmfd   sp!,{r0,r1}          ;//原r0,r1工作寄存器内容出栈//是否r0r1应该交换?
    add     sp,sp,#4             ;//指针堆栈加4
    subs    pc,lr,#4              
    MEND 
填充了中断向量表空缺的内容(以下是一部分):
VECTOR_BRANCH
    ldr pc,=HandlerEINT0    ;mGA    H/W interrupt vector table
    ldr pc,=HandlerEINT1    ;    
    ldr pc,=HandlerEINT2    ;
    ldr pc,=HandlerEINT3    ;
    ldr pc,=HandlerEINT4567 ;
    ldr pc,=HandlerTICK        ;mGA
    
    ldr pc,=HandlerDef     ;这是我填充的
    ldr pc,=HandlerDef    
    ......
主程序中改成了向量中断模式:
 rINTCON = 0x1;      // 所有中断均使用向量中断,打开 IRQ ,禁止 FIQ     
    rINTMOD = 0x00;          // 所有模式配置为 IRQ 模式
    rINTMSK = 0x07ffffff;        // 屏蔽所有中断
但是我用ADS中的AXD调试时,程序一发生中断(按下了按键)就进入为定义异常,在u-boot里面运行go 0xc008000后,按下键就重新启动,请各位高手帮我看看是什么问题?


相关帖子

沙发
biehoff| | 2009-5-15 15:31 | 只看该作者

RE

兄弟 这现象我半年前也发现过  具体怎么回事也没去仔细查
所以自己改了44b0init.s  完全取消掉向量中断的代码 也很好用啊  而且
44b0init.s更简化了

使用特权

评论回复
板凳
ccxlslr| | 2009-5-15 23:46 | 只看该作者

仔细检察!

我用向量中断并且将向量映射到RAM没问题的,

用的44B0

使用特权

评论回复
地板
wx_scut|  楼主 | 2009-5-27 01:19 | 只看该作者

谢谢楼上两位,呵呵

哦,你用的是映射阿,能发代码过来吗?我的邮箱starzhouxing@163.com,谢谢

使用特权

评论回复
5
djyos| | 2009-5-27 16:58 | 只看该作者

可以的

djyos用的就是向量模式,而且支持中断嵌套,你可以去下载源码来看看。

使用特权

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

本版积分规则

6

主题

28

帖子

0

粉丝