75

帖子

0

TA的资源

一粒金砂(初级)

21
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

22
 
引用 20 楼 gooogleman 的回复:
不要过早下结论,书写的未必是对的,运行起来的才是对的。
[/quote]

老大我没说书是对的,我就是在怀疑书里有问题。

[quote]引用 20 楼 gooogleman 的回复:
我在wince 的内核的ARM汇编部分看了,这些保护都有。

ARM汇编调用C语言程序使用了CALL

至于为什么不用BL,我想估计是参数传递的问题。

BL仅仅是有LR保存现场,CALL估计使用了R0~R3传递参数,并使用栈保存了现场。

至于具体原因,等我搞定了我的串口再分析。


老大,ARM指令集中有CALL指令么?WinCE调用C语言的程序使用了CALL?那个是指令么?那是个定义的宏吧~
如果你不嫌麻烦的话,随便反汇编个函数调用看看,看有没有CALL。

老大,你在怀疑什么?你执意不用压栈保存么?
此帖出自ARM技术论坛
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

23
 
  1. ;-------------------------------------------------------------------------------
  2. ;-------------------------------------------------------------------------------
  3.         NESTED_ENTRY FIQHandler
  4.         sub     lr, lr, #4                      ; fix return address
  5.         stmfd   sp!, {r0-r3, r12, lr}
  6.         PROLOG_END

  7.         CALL    OEMInterruptHandlerFIQ

  8.         ldmfd   sp!, {r0-r3, r12, pc}^          ; restore regs & return for NOP
  9.         ENTRY_END FIQHandler

  10. ALTERNATE_ENTRY CaptureContext
  11.         sub     sp, sp, #CtxSizeof              ; (sp) = CONTEXT_RECORD
  12.         stmib   sp, {r0-r15}                    ; store all registers
  13.         mrs     r1, cpsr                        ; (r1) = current status
  14.         mov     r0, #CONTEXT_FULL
  15.         str     r1, [sp,#CtxPsr]
  16.         str     r0, [sp,#CtxFlags]              ; set ContextFlags
  17.         mov     r0, sp                          ; (r0) = Arg0 = ptr to CONTEXT_RECORD
  18.         CALL    ExceptionDispatch
  19.         mov     r1, sp                          ; (r1) = ptr to CONTEXT_RECORD
  20.         ldr     r2, [r1,#CtxPsr]                ; (r0) = new Psr
  21.         and     r0, r2, #0x1f                   ; (r2) = destination mode
  22.         cmp     r0, #USER_MODE
  23.         bne     %F9     
复制代码


C:\WINCE500\PRIVATE\WINCEOS\COREOS\NK\KERNEL\ARM\armtrap.s

我没有怀疑什么哦,我不知道是否对,所以就像上面说了。上面是wince的内核代码,够有说服力了,要保存的,有些书说FIQ不用入栈,但是这里都有入栈。

至于CALL在ARM中是个宏定义,传递参数什么都行。在X86下就直接拿来用了。
你也帮帮我看我的问题啊。不然我哪有心思看这个啊,(*^__^*) 嘻嘻……
此帖出自ARM技术论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

24
 
引用 23 楼 gooogleman 的回复:
你也帮帮我看我的问题啊。不然我哪有心思看这个啊,(*^__^*) 嘻嘻……


呵呵,问题,大家拿出来一共解决么,还是很感谢你啊,我初来eeworld,发现这里不错哦~
此帖出自ARM技术论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

25
 
引用 24 楼 friendfish 的回复:
引用 23 楼 gooogleman 的回复:
你也帮帮我看我的问题啊。不然我哪有心思看这个啊,(*^__^*) 嘻嘻……


呵呵,问题,大家拿出来一共解决么,还是很感谢你啊,我初来eeworld,发现这里不错哦~


eeworld是不错,不过这里的人绝大多数都是偏软的,涉及汇编等东西就比较少人回答的。

我记得有个牛人写过一篇什么 wince中断分析吧。我今晚回去找找。

这本书的东西只是设置了CPSR而已,其实并没有开什么实际的IRQ/FIQ,不会产生什么不良后果的。
因为开IRQ/FIQ是在 你贴的代码之后,中断自然不会在那个代码那里产生了。
此帖出自ARM技术论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

26
 
高手就是高手,收藏仔细学习下
此帖出自ARM技术论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

27
 
学习学习按时大法师的
此帖出自ARM技术论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

28
 
nasiry 前辈对这个中断是相当了解的。哈哈。下面讲的不错
          ---------by nasiry 转载请说明出处


1。中断/异常相量的装入和执行方式。      

      中断和异常都是异步发生的事件,当该事件发生,系统将停止目前正在执行的代码转而执行事件响应的服务程序。而事件服务程序的入口点就是中断/异常向量所在的位置。arm的中断向量可以是0x0开始的低地址向量,也可以是在FFFF0000位置的高向量地址。winCE下使用高地址作为trap区,所以在CE下arm使用高地址向量。下面我们来了解一下中断/异常向量的安装和执行过程。
在kernelStart的过程中通过程序将如下代码复制到ffff0000的位置.
VectorInstructions
        ldr     pc, [pc, #0x3E0-8]              ; reset
        ldr     pc, [pc, #0x3E0-8]              ; undefined instruction
        ldr     pc, [pc, #0x3E0-8]              ; SVC
        ldr     pc, [pc, #0x3E0-8]              ; Prefetch abort
        ldr     pc, [pc, #0x3E0-8]              ; data abort
        ldr     pc, [pc, #0x3E0-8]              ; unused vector location
        ldr     pc, [pc, #0x3E0-8]              ; IRQ
        ldr     pc, [pc, #0x3E0-8]              ; FIQ

  而在ffff03e0的位置放上如下的数据,每一项(32bit)对应一个异常的跳转地址也就是winCE的异常/中断向量跳转表。该表项的内容就是发生异常后将要执行的服务程序的入口地址。具体如下。
VectorTable
        DCD     -1                              ; reset
        DCD     UndefException                  ; undefined instruction
        DCD     SWIHandler                      ; SVC
        DCD     PrefetchAbort                   ; Prefetch abort

        IF :DEF:ARMV4T :LOR: :DEF:ARMV4I
        DCD     OEMDataAbortHandler             ; data abort
        ELSE
        DCD     DataAbortHandler                ; data abort
        ENDIF

        DCD     -1                              ; unused vector
        DCD     IRQHandler                      ; IRQ
        DCD     FIQHandler                      ; FIQ
      在上面的这些代码/数据在内存空间上按照上述要求放置好以后,每次触发一个异常就自动运行到相应跳转表项所对应的地址执行。
  
2.异常/中断服务程序
  在arm下,由于有7种异常状态包括reset、Undef exception、software interrupt(swi)、Prefech Abort、DataAbort、IRQ、FIQ七种异常/中断。reset仅在复位时发生,其他6种都是在系统运行时发生。当任何一个异常发生并得到响应时,ARM 内核自动完成以下动作:
拷贝 CPSR 到 SPSR_
设置适当的 CPSR 位:
改变处理器状态进入 ARM 状态
改变处理器模式进入相应的异常模式
设置中断禁止位禁止相应中断
更新 LR_
设置 PC 到相应的异常向量
同时不管异常发生在ARM 还是Thumb 状态下,处理器都将自动进入ARM 状态。并且中断使能会自动被关闭。在这个时候由于部分通用寄存器是不同模式公用的,所以还需要保存这些将会被破坏的寄存器,待到处理完成的时候恢复这些寄存器被中断前的状态。另外在进入异常模式后,lr的值不一定就是我们所需恢复执行的位置,该位置受到异常类型和流水线误差的影响。在SWI模式下,LR就是返回值。在IRQ和FIQ中LR=LR-4,DataAbort下LR=LR-8;具体原因我们就不讨论了,有兴趣可以参看<基于ARM 的嵌入式程序开发要点>一文。
此帖出自ARM技术论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

29
 
引用 25 楼 gooogleman 的回复:
我记得有个牛人写过一篇什么 wince中断分析吧。我今晚回去找找。
[/quote]
哦?找到了别忘了一同分享,等待~

[quote]引用 25 楼 gooogleman 的回复:
这本书的东西只是设置了CPSR而已,其实并没有开什么实际的IRQ/FIQ,不会产生什么不良后果的。
因为开IRQ/FIQ是在 你贴的代码之后,中断自然不会在那个代码那里产生了。

在这本书里,CPSR中打开irq就是打开了中断.你可以参考9.3.2嵌套中断的流程图,那一步就是打开中断,代码就是按照那个流程来的.
你说打开IRQ/FIQ是在 我贴的代码之后??请指出来,后面的代码是中断进一步的处理.
此帖出自ARM技术论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

30
 
引用 28 楼 gooogleman 的回复:
nasiry 前辈对这个中断是相当了解的。哈哈。下面讲的不错
          ---------by nasiry 转载请说明出处


1。中断/异常相量的装入和执行方式。      

      中断和异常都是异步发生的事件,当该事件发生,系统将停止目前正在执行的代码转而执行事件响应的服务程序。而事件服务程序的入口点就是中断/异常向量所在的位置。arm的中断向量可以是0x0开始的低地址向量,也可以是在FFFF0000位置的高向量地址。winCE下使用高地…

这个就是中断的处理方法,CE就是用了LDR向PC中赋值,而没有用跳转类指令直接跳转(跳转类指令:B,BL,BX...)原因就是跳转类指令的"标号"是PC相对寻址的,只能跳转到当前PC前后32mb的范围.

另此文貌似没有结束,贴个连接撒~~
对了,能不能把你的邮箱地址通知我一下先~便于交流~呵呵~
此帖出自ARM技术论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

31
 
http://www.cnblogs.com/nasiry/

在论坛交流就不错了。免得我说错了没有人指出来就不好了。
此帖出自ARM技术论坛
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

32
 
引用 31 楼 gooogleman 的回复:
http://www.cnblogs.com/nasiry/

在论坛交流就不错了。免得我说错了没有人指出来就不好了。
[/quote]
貌似也对~

另29楼,这个你在看看~
[quote]引用 31 楼 gooogleman 的回复:
这本书的东西只是设置了CPSR而已,其实并没有开什么实际的IRQ/FIQ,不会产生什么不良后果的。
因为开IRQ/FIQ是在 你贴的代码之后,中断自然不会在那个代码那里产生了。


在这本书里,CPSR中打开irq就是打开了中断.你可以参考9.3.2嵌套中断的流程图,那一步就是打开中断,代码就是按照那个流程来的.
你说打开IRQ/FIQ是在 我贴的代码之后??请指出来,后面的代码是中断进一步的处理
此帖出自ARM技术论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

33
 
IRQ/FIQ涉及到具体的ARM寄存器了,

在wince中是放在驱动中的,并且是C语言写的。在内核初始化的时候就设置了CPSR了。
我看wince的中断就是这样的,比较合理,至于你说流程图,我没有看,我的书在家里,晚上回去看看吧。
此帖出自ARM技术论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

34
 
引用 33 楼 gooogleman 的回复:
IRQ/FIQ涉及到具体的ARM寄存器了,

在wince中是放在驱动中的,并且是C语言写的。在内核初始化的时候就设置了CPSR了。
我看wince的中断就是这样的,比较合理,至于你说流程图,我没有看,我的书在家里,晚上回去看看吧。

恩,建议你看看那一章,不错,比较基础,对了建议你看英文版!!!(我是打出来看得~)
此帖出自ARM技术论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

35
 
有人看过那个流程图么?说说在栈帧创建完成之前打开中断的理由。
此帖出自ARM技术论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

36
 
看了,我觉得这样做不合理。

还有,他的书不一定是对的,别信它。总之wince下的内核代码能运行的才是最好参考。
此帖出自ARM技术论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

37
 
仔细看了看,这段代码没有问题。如果刚打开irq时再次发生中断,r2中断在入口处会被再次保存。
r14_svc只有LDMIA r13!,{r0-r12,r14}这句会被改写,但是这句的前面r14_svc进栈了,后面又恢复了,所以也是安全的。
比较奇妙的是r4-r9确实没有保护,但是如果你仔细看的话r4-r9也是安全的。因为再次进入中断到STMIA r13, {r4-r11}这句之前r4-r9没有使用,也就是说r4-r9没有被破坏,是安全的;另一方面,如果中断处理调用到其他子函数,那么ARM的ATPCS调用规则要求子函数自己要保证不破坏r4-r9,换句话说子函数要么不使用r4-r9,要么在使用之前把r4-r9进栈,返回前再恢复,因此也是安全的。当然如果你自己写的子函数不遵循ATPCS调用规则那么r4-r9确实会被破坏,但这是你的责任;另一方面C等高级语言的编译器会保证遵循ATPCS调用规则,所以中断处理调用C语言写的子函数也是没问题的。
此帖出自ARM技术论坛
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

38
 
引用 36 楼 gooogleman 的回复:
看了,我觉得这样做不合理。

还有,他的书不一定是对的,别信它。总之wince下的内核代码能运行的才是最好参考。

这本书非常权威,犯错的可能性很小,何况是这么重要的错误。
此帖出自ARM技术论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

39
 
引用 37 楼 singlerace 的回复:
仔细看了看,这段代码没有问题。如果刚打开irq时再次发生中断,r2中断在入口处会被再次保存。
r14_svc只有LDMIA r13!,{r0-r12,r14}这句会被改写,但是这句的前面r14_svc进栈了,后面又恢复了,所以也是安全的。
比较奇妙的是r4-r9确实没有保护,但是如果你仔细看的话r4-r9也是安全的。因为再次进入中断到STMIA r13, {r4-r11}这句之前r4-r9没有使用,也就是说r4-r9没有被破坏,是安全的;另一方面,如果中断处理调用到其他子函数,那么ARM的ATPCS调用规则要求子函数自己要保证不破坏r4-r9,换句话说子函数要么不使用r4-r9,要么在使用之前把r4-r9进栈,返回前再恢复,因此也是安全的。当然如果你自己写的子函数不遵循ATPCS调用规则那么r4-r9确实会被破坏,但这是你的责任;另一方面C等高级语言的编译器会保证遵循ATPCS调用规则,所以中断处理调用C语言写的子函数也是没问题的。


ATPCS,有空找来看看才行,在很多地方提到。
此帖出自ARM技术论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

40
 
引用 37 楼 singlerace 的回复:
仔细看了看,这段代码没有问题。如果刚打开irq时再次发生中断,r2中断在入口处会被再次保存。
r14_svc只有LDMIA r13!,{r0-r12,r14}这句会被改写,但是这句的前面r14_svc进栈了,后面又恢复了,所以也是安全的。
比较奇妙的是r4-r9确实没有保护,但是如果你仔细看的话r4-r9也是安全的。因为再次进入中断到STMIA r13, {r4-r11}这句之前r4-r9没有使用,也就是说r4-r9没有被破坏,是安全的;另一方面,如果中断处理调用到其他子函数…
[/quote]
等了好久,终于有人深入研究了,感激不尽~

我觉得还有有问题,问题就处在R9_SVC上。

[quote]引用 37 楼 singlerace 的回复:
比较奇妙的是r4-r9确实没有保护,但是如果你仔细看的话r4-r9也是安全的。因为再次进入中断到STMIA r13, {r4-r11}这句之前r4-r9没有使用,也就是说r4-r9没有被破坏,是安全的;

在STMIA r13, {r4-r11}这句之前,R4-R9(这里指的是SVC模式下)但是下一句,确实致命的:

  1.     LDMIA r0,{r4-r9} ;     7 : restore r4-r9
复制代码

这里回复的是IRQ堆栈里的“R0,R1,R2,R3,R12,R14_IRQ”
因为这些是在IRQ里保存过的:

  1.     STMDB r13!,{r0-r3,r12,r14} ; 2 : save context
复制代码


现在我们假设IRQ中断再次发生,那么,R14_IRQ保存的将是返回到SVC模式下的地址。(因为第二次中断发生了,也就是说第二次中断先要返回到SVC模式,然后再返回USER模式)
但是执行完

  1.     LDMIA r0,{r4-r9} ;     7 : restore r4-r9
复制代码

致命的错误发生了,第二次中断的返回地址覆盖了返回到USER模式的地址。

我最大的怀疑是在这里。明鉴~

此帖出自ARM技术论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条
电源解决方案和技术 | DigiKey 应用探索站
当月好物、电源技术资源、特色活动、DigiKey在线实用工具,干货多多~

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表