搜索
bottom↓
回复: 5

[求助]S3C44B0移植uCOS出问题困扰了很多天

[复制链接]

出0入0汤圆

发表于 2012-4-27 08:49:19 | 显示全部楼层 |阅读模式
  问题是出在uCOS临界段的时候,进入临界段时正常,但退出临界段的时候就飞了.下面是代码:
  OS_ENTER_CRITICAL();
    OSTime = ticks;
    OS_EXIT_CRITICAL();

我将上面三条反汇编如下:
  OS_ENTER_CRITICAL();
[0xeb000b31]   bl       ARMDisableInt
    OSTime = ticks;
[0xe59f0018]   ldr      r0,0x00004704 ; = #0x0c001800
[0xe5804000]   str      r4,[r0,#0]
    OS_EXIT_CRITICAL();
[0xe8bd4010]   ldmfd    r13!,{r4,r14}
[0xea000b32]   b        ARMEnableInt
[0x0c0017f0]   dcd      0x0c0017f0  ....
[0x0c001804]   dcd      0x0c001804  ....
[0x0c0017d6]   dcd      0x0c0017d6  ....
[0x0c002bcc]   dcd      0x0c002bcc  .+..
[0x0c001800]   dcd      0x0c001800  ....

ARMDisableInt及ARMEnableInt代码在下面.
        EXPORT         ARMDisableInt
ARMDisableInt
        MRS                r0, cpsr
        STMFD        sp!, {r0}           ; push current PSR (r0 = 0x60000013)
        ORR                r0, r0, #0xC0
        MSR                cpsr_c, r0           ; disable IRQ Int s
        MOV                pc, lr

        EXPORT         ARMEnableInt
ARMEnableInt
        LDMFD         sp!, {r0}           ; pop current PSR (r0 = 0x0000494c)
        MSR                cpsr_c, r0           ; restore original cpsr       
        MOV                pc, lr

我发现具体原因是在ARMEnableInt的
 LDMFD         sp!, {r0}
这一条语句.上面我用红色部分突出了,r0入栈的值也出栈的值不一样,这样就导致出错.
好几天了一直找不到为什么r0出栈值会与入栈不同.怀疑是堆栈深度不够,我又修改了堆栈
        AREA RamData, DATA, READWRITE

        ^        (_ISR_STARTADDRESS-0x500)
                               
;UserStack        #        256        ;c1(c7)ffa00
;SVCStack        #        256        ;c1(c7)ffb00
;UndefStack        #        256        ;c1(c7)ffc00
;AbortStack        #        256        ;c1(c7)ffd00
;IRQStack        #        256        ;c1(c7)ffe00
;FIQStack        #        0        ;c1(c7)fff00
UserStack        #        512        ;c1(c7)ffa00
SVCStack        #        512        ;c1(c7)ffb00
UndefStack        #        512 ;c1(c7)ffc00
AbortStack        #        512        ;c1(c7)ffd00
IRQStack        #        512        ;c1(c7)ffe00
FIQStack        #        0        ;c1(c7)fff00
但还是出现同样的问题(r0出栈值还是与入栈时不一样).
特来求助大家!先谢了

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2012-4-27 10:12:13 | 显示全部楼层
是SP指针不对,所以弹出的值不对,我还是不知道怎么办.

出0入0汤圆

 楼主| 发表于 2012-4-28 16:56:54 | 显示全部楼层
本帖最后由 ShaoKn 于 2012-4-28 17:10 编辑

OS_EXIT_CRITICAL();
[0xe8bd4010]   ldmfd    r13!,{r4,r14}
[0xea000b32]   b        ARMEnableInt

我注意到以上红色部分是在调转到 ARMEnableInt之前,它是编译器自动生成的,问题又定位到这里.

压栈时(r0 = 0x60000013),也即是保存了关中断时的CPSR值.
但由于 ldmfd    r13!,{r4,r14} 这条语句,堆栈将0x60000013弹出赋给了r4,堆栈指针SP减去"2".
所以当执行
LDMFD         sp!, {r0}           ; pop current PSR (r0 = 0x0000494c)
时,弹出给r0的并不是压栈时CPSR的值.

为什么会有[0xe8bd4010]   ldmfd    r13!,{r4,r14}这条语句呢???

出0入0汤圆

 楼主| 发表于 2012-4-28 17:25:18 | 显示全部楼层
本帖最后由 ShaoKn 于 2012-4-28 17:42 编辑

找到一个古董贴也是关于我这个问题的,这么多年了,我们还是得沿着前人的脚印一步一步走啊

http://forum.eepw.com.cn/thread/88731/1

本来,OS_EXIT_CRITICAL()应被编译成一条 BL ARMEnableInt语句,但是在OSSchedLock函数中却不是这样的,请看如下的反汇编代码:



void OSSchedLock(void)
{
[0xe92d401]  stmfd   r13!,{r4,r14}
  if (OSRunning ==TRUE){
[0xe59f4490]  ldr  r4,0x0c001874
[0xe5d40006]  ldrb r0,[r4,#6]
[0xe3500001]  cmp  r0,#1
[0x1a000007]  bne  0xc00140c
  OS_ENTER_CRITICAL();
[0xeb000faa]  bl ARMDisableInt
  if(OSLockNesting < 255){
[0xe5d40002]  ldrb  r0,[r4,#2]
[0xe35000ff]  cmp   r0,#0xff
[0x2a000001]  bcs   0xc001404   ;(OSSchedLock + 0x2c)
  OSLockNesting ++;
[0xe2800001]  add  r0,r0,#1
[0xe5c40002]  strb r0,[r4,#2]

  OS_EXIT_CRITICAL();         ;请看这里!!!!!!!!!!!
[0xe8bd4010] ldmfd   r13!,{r4,r14}   ;竟然不是bl  ARMEnableInt!!!
[0xea000fa8] b       ARMEnableInt    ;
  }
}
[0xe8bd8010] ldmfd  r13!{r4,pc}      ;OSSchedLock函数返回

编译器将此处的OS_EXIT_CRITICAL()函数编译成了两条汇编语句,而我在调试时,其他的恢复cpsr是的 OS_EXIT_CRITICAL()函数只汇编成一条
  bl ARMEnableInt指令(这个是符合程序的正常状态的)

正是此处的 ldmfd    r13!,{r4,r14}指令使得r13被改变(但观察时发现r13从调用前的0x0x500ff8竟变成了0x0c501000!),因此cpsr恢复错误,导致ARM的工作模式从SVC意外变成了USR态,使得程序出现异常。


有高手能解释一下这个现象么,谢谢。


答 1:
这是 ADS 优化的结果,你修改优化级别即可。DEBUG/OPTION 中,选择BEST DEBUG。。。
ADS 的C编译器文档中有说明的,CPSR不能修改,所以编译器就给优化了,最好的解决办法是用SWI,
答 2:
非常感谢深思大侠我装的D版ADS没有帮助文档,这个问题困扰我两天了,再次感谢你的指点,祝你工作顺利!
答 3:
自己到 ADS 安装目录下找,有的,只是ADS找不到而已,呵呵

出0入0汤圆

发表于 2012-4-28 18:53:21 | 显示全部楼层
这个问题我表示关注,因为我也有个这板,可以学习了。

出0入0汤圆

发表于 2012-7-5 09:07:46 | 显示全部楼层
终于找到一样的问题了……请问楼主我的一个工程从ADS移植到MDK下,出现了和你一样的问题,但是我看了一下我的MDK的优化级别是0,不知道我应该如何更改!请楼主指点一下谢谢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 13:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表