QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 3194|回复: 5

ucos程序运行出错?

[复制链接]
发表于 2005-7-21 21:59:09 | 显示全部楼层 |阅读模式
调试ucos程序时(如下),发现运行到程序OSTimeSet(0);句时总是进入databort,跟踪调试发现是

OS_EXIT_CRITICAL() 句执行进入下面汇编语句出错:

ARMEnableInt
LDMFD sp!, {r0}    ; pop current PSR
MSR  cpsr_c, r0    ; restore original cpsr
MOV  pc, lr                                         (在该句出错)

pc指向0xffffffff  地址,且内容也为0xfffffff

按道理前面执行基本初始化程序,PC不应该跑飞啊,斑竹能否指点下???

---------------------------------------------------------------------------------------



附主程序:

void Main(void)
{

char Id0 = '1';
char Id1 = '2';
char Id3 = '4';

ARMTargetInit();

Uart_Printf("\n\n\n\n\n");
Uart_Printf("   ******************************\n");
Uart_Printf("   *     uCos demo code    *\n");
Uart_Printf("   *******************************\n");
Uart_Printf("\n\n");
Delay(100);

OSInit();

OSTimeSet(0);
   
UartSem = OSSemCreate(1);
KeySem = OSMboxCreate((void *)0);
    /*
     * create the tasks in uC/OS and assign decreasing
     * priority to them
     */
OSTaskCreate(TaskStart, (void *)&Id0, (void *)&Stack0[STACKSIZE_L - 1], 1);
OSTaskCreate(TaskLED, (void *)&Id1, (void *)&Stack1[STACKSIZE_L - 1], 51);
OSTaskCreate(lwip_init_task, (void *)&Id3, &lwip_init_stk[STACKSIZE_H-1], 2);
        
    /* Start the  system running */
ARMTargetStart();

    /* start the system */
OSStart();

    /* never reached */
}
发表于 2005-7-22 01:37:59 | 显示全部楼层
OSTimeSet(0);  做了什么事情?
回复

使用道具 举报

 楼主| 发表于 2005-7-22 12:26:04 | 显示全部楼层
OSTimeSet()是UCOS提供的函数,设置系统时钟节拍的

我这个程序是移植Lwip,会不会是因为我在是否是因为我在lwip程序里用了_packed关键字的问题?

可是就算这样也应该是等UCOS启动后才会出现这样的问题吧,现在好象是在启动中断ARMEnableInt 时有问题啊???

会是什么问题呢??
回复

使用道具 举报

发表于 2005-7-23 09:51:09 | 显示全部楼层
mov 指令执行前, lr 的值是多少?
回复

使用道具 举报

 楼主| 发表于 2005-7-24 20:26:51 | 显示全部楼层
呵呵,真是感谢liming斑主了,今天有看了看程序啊,还是没能搞定,头都大了!原来以为lwip应该可以轻松搞顶的,现在看来自己编程基础还差了点啊!

lwip 部分程序我是参考skyeye的,移植到ADS上,几处关键的部分感觉都改了,应该没问题啊.现在有问题是:lwip程序里用到_packed关键字,才会导致程序不能运行的?
但似乎应该是运行ucos任务后才能跳到lwip程序里,现在ucos根本没启动起来啊,在别的ucos程序却没有这种情况啊? 快要崩溃了,呵呵!

仔细看了下,在执行句MOV pc, lr ,之前lr里面内容竟为0啊,这就奇怪了??? AXD还有以下提示:
DBT Warning 00008: Already at base of stack.

十分感谢李明斑竹的帮助啊!!!
回复

使用道具 举报

发表于 2005-7-25 10:28:50 | 显示全部楼层
ARMTargetStart(); 是不是应该放到 第一个任务里面去运行? 这样比较正规。
还有就是 ARM ADS 对 C 的 packed 的支持似乎不怎么好用, 我后来都是直接用 4 个字节定义内部数据结构的。这个在 ARMCC 编译器里面支持 packed 定义的问题你可以花点时间测试和验证一下。
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-11-22 00:32 , Processed in 0.085510 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

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