ShaoKn 发表于 2012-4-27 09:08

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

问题是出在uCOS临界段的时候,进入临界段时正常,但退出临界段的时候就飞了.下面是代码:
  OS_ENTER_CRITICAL();
    OSTime = ticks;
    OS_EXIT_CRITICAL();

我将上面三条反汇编如下:
OS_ENTER_CRITICAL();
   bl       ARMDisableInt
    OSTime = ticks;
   ldr      r0,0x00004704 ; = #0x0c001800
   str      r4,
    OS_EXIT_CRITICAL();
   ldmfd    r13!,{r4,r14}
   b      ARMEnableInt
   dcd      0x0c0017f0....
   dcd      0x0c001804....
   dcd      0x0c0017d6....
   dcd      0x0c002bcc.+..
   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出栈值还是与入栈时不一样).
特来求助大家!先谢了

ShaoKn 发表于 2012-4-27 10:17

怎么会显示"已结贴"呢,我问题还没有解决呀

lllaaa 发表于 2012-4-27 10:19

因为你分数给的是0。所以一发出来就是结贴
页: [1]
查看完整版本: [求助]S3C44B0移植uCOS出问题困扰了很多天