打印
[ARM7]

Micrium官方的汇编中断嵌套难道由bug???

[复制链接]
1229|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 ilikedota 于 2016-7-18 17:17 编辑

研究了下Micrium官方给出的关于ARM7的汇编中断嵌套的代码,突然冒出个疑问,如下图C:\Users\Administrator\Desktop\360截图20160718171005982.jpg,不知道我这样的理解对不对,如果不对是哪里有问题,请大家帮忙看下,谢谢!

360截图20160718171759742.jpg (228.65 KB )

360截图20160718171759742.jpg

相关帖子

沙发
JasonWangSE| | 2016-7-19 10:03 | 只看该作者
你的代码是老版本吧

使用特权

评论回复
板凳
ilikedota|  楼主 | 2016-7-23 08:18 | 只看该作者
JasonWangSE 发表于 2016-7-19 10:03
你的代码是老版本吧

不是啊,最新下载的

使用特权

评论回复
地板
nicholasldf| | 2016-7-23 17:09 | 只看该作者
以前我用过arm9的atmel9260的ucos移植代码,,就是有bug,,我自己改过来了,,过了一两年,,micrium也那样改过来了,,

使用特权

评论回复
5
ilikedota|  楼主 | 2016-7-25 21:39 | 只看该作者
nicholasldf 发表于 2016-7-23 17:09
以前我用过arm9的atmel9260的ucos移植代码,,就是有bug,,我自己改过来了,,过了一两年,,micrium也那 ...

你好,请问你发现的bug也是我说的这个地方吗?谢谢!!

使用特权

评论回复
6
nicholasldf| | 2016-7-26 11:12 | 只看该作者
ilikedota 发表于 2016-7-25 21:39
你好,请问你发现的bug也是我说的这个地方吗?谢谢!!

OS_CPU_ARM_ExceptHndlr_BrkExcept
    STMFD   SP!, {R1}                                           ; Push exception's SPSR.

;luodefu add - 保存EXP现场堆栈指针,以便OS_CPU_ExceptHndlr输出异常时的寄存器信息
;堆栈存储信息为CPSR R0-R12 LR,没有PC
        LDR     R2, =OS_CPU_ExceptStkPtr                            ; OS_CPU_ExceptStkPtr = SP;
    STR     SP, [R2]

    MRS     R3, CPSR                                            ; Push exception's CPSR.
    STMFD   SP!, {R3}

                                                                ; Change to SVC mode & disable interruptions.
    MSR     CPSR_c, #(OS_CPU_ARM_CONTROL_INT_DIS | OS_CPU_ARM_MODE_SVC)

                                                                ; HANDLE NESTING COUNTER:
    LDR     R2, =OSIntNesting                                   ;   OSIntNesting++;
    LDRB    R4, [R2]
    ADD     R4, R4, #1
    STRB    R4, [R2]

    MSR     CPSR_cxsf, R3                                       ; RESTORE INTERRUPTED MODE.

                                                                ; EXECUTE EXCEPTION HANDLER:
    LDR     R2, =OS_CPU_ExceptHndlr                             ; OS_CPU_ExceptHndlr(except_type = R0);
    MOV     LR, PC
    BX      R2

        ;以下原始代码BUG - 切换到SVC模式操作OSIntNesting变量,然后通过SVC的SP恢复R3,而不是异常模式的SP,R3的值是未知的
    MRS     R3, CPSR;luodefu 保存当前异常模式
                                                                    ; Change to SVC mode & disable interruptions.
    MSR     CPSR_c, #(OS_CPU_ARM_CONTROL_INT_DIS | OS_CPU_ARM_MODE_SVC)

                                                                ; HANDLE NESTING COUNTER:
    LDR     R2, =OSIntNesting                                   ;   OSIntNesting--;
    LDRB    R4, [R2]
    SUB     R4, R4, #1
    STRB    R4, [R2]

        MSR     CPSR_cxsf, R3;luodefu 恢复当前异常模式,下面两行汇编代码除了将R3出栈,做了重复的恢复当前模式的工作

    LDMFD   SP!, {R3}
    MSR     CPSR_cxsf, R3                                       ; RESTORE INTERRUPTED MODE.

                                                                ; RESTORE INTERRUPTED EXCEPTIONS' CONTEXT:
    LDMFD   SP!, {R0}                                           ;    Pop exception's CPSR,
    MSR     SPSR_cxsf, R0

    LDMFD   SP!, {R0-R12, PC}^                                  ;   Pull working registers and return from exception.


使用特权

评论回复
7
JasonWangSE| | 2016-7-26 14:51 | 只看该作者
本帖最后由 JasonWangSE 于 2016-7-26 14:56 编辑
ilikedota 发表于 2016-7-23 08:18
不是啊,最新下载的

哦,看到你说的代码了,这个确实是问题,但是感觉系统应该跑不到下面恢复的地方,因为这段代码只有在异常中发生异常才会进来,但官方给的的bsp代码里OS_CPU_ExceptHndlr判断如果不是IRQ或FIQ就直接死循环了,而在异常模式时中断又没开过。所以如果在异常中发生了异常,那系统就直接挂死了

使用特权

评论回复
8
ilikedota|  楼主 | 2016-8-5 20:29 | 只看该作者
JasonWangSE 发表于 2016-7-26 14:51
哦,看到你说的代码了,这个确实是问题,但是感觉系统应该跑不到下面恢复的地方,因为这段代码只有在异常 ...

最进比较忙,有些天没有回论坛了。兄弟,你说的可能不对,我贴的代码就是中断嵌套处理的代码,程序肯定是要执行到那里去的,处理完了最外层的中断,跳到SVC模式将中断嵌套深度标志减1,然后又回到中断模式下,继续执行其他中断服务,知道没有中断要执行。

使用特权

评论回复
9
JasonWangSE| | 2016-8-8 10:46 | 只看该作者
ilikedota 发表于 2016-8-5 20:29
最进比较忙,有些天没有回论坛了。兄弟,你说的可能不对,我贴的代码就是中断嵌套处理的代码,程序肯定是 ...

中断处理程序貌似不支持中断嵌套,因为进IRQ后中断就被关掉了,后面也没有再打开的地方,所以如果代码跑到这里,那应该只有两种情况:要么就是IRQ或FIQ中发生了其他异常,要么就是IRQ中发生了FIQ。

前一种情况进入异常处理打印异常信息后就直接死循环了;而对于FIQ得看BSP怎么配的,我感觉ucosii貌似是不支持既有FIQ,又有IRQ的情况,好像所有的中断源都配的是IRQ。如果某个中断源配成了FIQ,就有可能发生你说的情况了

使用特权

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

本版积分规则

33

主题

98

帖子

3

粉丝