ucos程序运行出错?
调试ucos程序时(如下),发现运行到程序OSTimeSet(0);句时总是进入databort,跟踪调试发现是OS_EXIT_CRITICAL() 句执行进入下面汇编语句出错:
ARMEnableInt
LDMFD sp!, {r0} ; pop current PSR
MSRcpsr_c, r0 ; restore original cpsr
MOVpc, 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, 1);
OSTaskCreate(TaskLED, (void *)&Id1, (void *)&Stack1, 51);
OSTaskCreate(lwip_init_task, (void *)&Id3, &lwip_init_stk, 2);
/* Start thesystem running */
ARMTargetStart();
/* start the system */
OSStart();
/* never reached */
} OSTimeSet(0);做了什么事情? OSTimeSet()是UCOS提供的函数,设置系统时钟节拍的
我这个程序是移植Lwip,会不会是因为我在是否是因为我在lwip程序里用了_packed关键字的问题?
可是就算这样也应该是等UCOS启动后才会出现这样的问题吧,现在好象是在启动中断ARMEnableInt 时有问题啊???
会是什么问题呢?? mov 指令执行前, lr 的值是多少? 呵呵,真是感谢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.
十分感谢李明斑竹的帮助啊!!! ARMTargetStart(); 是不是应该放到 第一个任务里面去运行? 这样比较正规。
还有就是 ARM ADS 对 C 的 packed 的支持似乎不怎么好用, 我后来都是直接用 4 个字节定义内部数据结构的。这个在 ARMCC 编译器里面支持 packed 定义的问题你可以花点时间测试和验证一下。
页:
[1]