3747|3

80

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

移植ucosii的时候ads编译器遇到的问题 [复制链接]

 我是新手,第一次移植系统,在移植过程中遇到了以下问题,我尽量把相关的函数都贴出来:
在os_cpu.h中,我定义了函数:

#define        OS_ENTER_CRITICAL()        ARMDisableInt()
#define        OS_EXIT_CRITICAL()        ARMEnableInt()

extern void ARMEnableInt(void);        // enable global interrupts
extern void ARMDisableInt(void);         // disable global interrupts


在os_cpu_a.s中有以下定义:

        EXPORT         ARMDisableInt
ARMDisableInt
        MRS                r0, cpsr
        STMFD        sp!, {r0}                         ; push current PSR
        ORR                r0, r0, #0xC0
        MSR                cpsr_c, r0                                 ; disable IRQ Int s
        MOV        pc, lr

        EXPORT         ARMEnableInt
ARMEnableInt
        LDMFD        sp!, {r0}                                ; pop current PSR
        MSR                cpsr_c, r0                                ; restore original cpsr       
        MOV                pc, lr
编译一切正常,没有报错,但运行不了系统,我进行单步跟踪后发现问题出在这里:

os_core.c中有函数:

#if OS_SCHED_LOCK_EN > 0
void  OSSchedLock (void)
{
#if OS_CRITICAL_METHOD == 3  /* 在OS_CPU.H中宏定义为OS_CRITICAL_METHOD=2*/
    OS_CPU_SR  cpu_sr;
     cpu_sr = 0;                  /* Prevent compiler     */
#endif   
    if (OSRunning == TRUE) {                  /* Make sure multitasking is    */
        OS_ENTER_CRITICAL();
        if (OSLockNesting < 255u) {      /* Prevent OSLockNesting from wrapping back to 0  */
            OSLockNesting++;                     /* Increment lock nesting */
        }
        OS_EXIT_CRITICAL();
    }
}
#endif  

函数OSSchedLock的disassemble如下:

    OSSchedLock
        0x0000053c:    e92d4010    .@-.    STMFD    r13!,{r4,r14}
        0x00000540:    e59f4568    hE..    LDR      r4,0xab0
        0x00000544:    e5d40007    ....    LDRB     r0,[r4,#7]
        0x00000548:    e3500001    ..P.    CMP      r0,#1
        0x0000054c:    1a000007    ....    BNE      {pc} + 0x24  ; 0x570
        0x00000550:    ebfffffe    ....    BL       ARMDisableInt
        0x00000554:    e5d40003    ....    LDRB     r0,[r4,#3]
        0x00000558:    e35000ff    ..P.    CMP      r0,#0xff
        0x0000055c:    2a000001    ...*    BCS      {pc} + 0xc  ; 0x568
        0x00000560:    e2800001    ....    ADD      r0,r0,#1
        0x00000564:    e5c40003    ....    STRB     r0,[r4,#3]
        0x00000568:    e8bd4010    .@..    LDMFD    r13!,{r4,r14}
        0x0000056c:    eafffffe    ....    B     ARMEnableInt   
        0x00000570:    e8bd8010    ....    LDMFD    r13!,{r4,pc}
如红色字体所示,同是OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL(),为什么一个是BL(可以返回),另一个是B(跳转后无法返回)?
    好像OS_EXIT_CRITICAL()放在函数的末尾都会这样编译。。。。(汗一个)
    这是为什么?是编译器设置错了,还是程序写错?希望大虾们帮忙,不胜感激~~~~

最新回复

您好!我在用ucos,板子也是44b0。可是现在出现了一个问题,在给定时器赋值启动的时候 void ARMStartTimer(void) {         rTCON = 0x9;                //autoreload and start 跑到这句程序就跑飞掉了。 不知是什么原因。请指教!谢谢!  详情 回复 发表于 2008-11-19 10:29
点赞 关注
 

回复
举报

81

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
忘说了,我用的是44B0X的开发板,ARM7TDMI
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
已经解决了,是C编译器优化等级设置的问题,没有人跟帖,分都没法给了,浪费了。。。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

4
 
您好!我在用ucos,板子也是44b0。可是现在出现了一个问题,在给定时器赋值启动的时候
void ARMStartTimer(void)
{
        rTCON = 0x9;                //autoreload and start
跑到这句程序就跑飞掉了。
不知是什么原因。请指教!谢谢!
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
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
快速回复 返回顶部 返回列表