这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » [求助]调试UC/OS 2遇到的奇怪问题

共4条 1/1 1 跳转至

[求助]调试UC/OS 2遇到的奇怪问题

菜鸟
2006-02-26 01:06:46     打赏
我用2.52的源代码移植了一下ucos-ii,在Main()函数里创建了Main_task,点全速运行,任务创建等都可以,可以从Task1切换到Taks2,可以从Task2切换到Task3,也可以从Task3切换到Main_task,但是当从Main_task再次切换到空闲任务的时候就不行了,进入OSCtxSw就出不来了,系统进入中止模式,何故?

优先级:Main_task > Task1 > Task2 > Task3
void Task1_Task(void *Id)
{
int i;
while(1)
{
i++;
OS_ENTER_CRITICAL();
uHALr_printf(" Task1\n");
OS_EXIT_CRITICAL();
OSTimeDly(1000);
}
}

void Task2_Task(void *Id)
{
int i;
while(1)
{
i++;
OS_ENTER_CRITICAL();
uHALr_printf(" Task2\n");
OS_EXIT_CRITICAL();
OSTimeDly(2000);
}
}
void Task3_Task(void *Id)
{
int i;
while(1)
{
i++;
OS_ENTER_CRITICAL();
uHALr_printf(" Task3\n");
OS_EXIT_CRITICAL();
OSTimeDly(3000);
}
}
void Main_Task(void *Id)
{
ARMTargetStart();

OSTaskCreate(Task1_Task, (void *)0, (OS_STK *)&Task1_Stack[TASK_STACK_SIZE-1], Task1_PRIO);
OSTaskCreate(Task2_Task, (void *)0, (OS_STK *)&Task2_Stack[TASK_STACK_SIZE-1], Task2_PRIO);
OSTaskCreate(Task3_Task, (void *)0, (OS_STK *)&Task3_Stack[TASK_STACK_SIZE-1], Task3_PRIO);

while (1)
{
OS_ENTER_CRITICAL();
uHALr_printf("It is in main_task,notice!!\n");
OS_EXIT_CRITICAL();
OSTimeDly(40);
}
}

现象如下:
Starting target!
It is in main_task,notice!! (在Main_task运行时所打印)
OSCtxSw! (切换到任务1时打印OSCtxSw!) ->Task1
OSCtxSw! (切换到任务2时打印OSCtxSw!) ->Task2
OSCtxSw! (切换到任务3时打印OSCtxSw!) ->Task3
OSCtxSw! (切换到空闲任务时打印OSCtxSw!) ->idle task
the task is running in idle task (在空闲任务中运行时所打印)
the task is run (中断到来,进入OSTickISR)
OSIntCtxSw! (切换到main_task时打印,我已经设置了调用OSIntCtxSw()时打印OSIntCtxSw!) ->main_task
It is in main_task,notice!!
OSCtxSw! (虽然进入了OSCtxSw,但是却切换不到空闲任务,执行OSCtxSw最后一条指令后系统进入中止模式!!)

请多多关照,已经调了好几天了,不知道错在何处!

请多多指教!谢谢!!

[align=right][color=#000066][此贴子已经被作者于2006-2-27 8:46:05编辑过][/color][/align]



关键词: 求助     调试     遇到     奇怪     问题     切换     OSCtxSw    

菜鸟
2006-02-26 06:21:00     打赏
2楼

看看堆栈有没有问题


菜鸟
2006-02-27 16:58:00     打赏
3楼

我查了一下是堆栈的问题,我的任务都是在管理模式运行,要在时钟ISR中保存任务的堆栈的话要切换到管理模式。现在的问题就是在进入OSIntCtxSw()之前时钟ISR不仅没有保存空闲任务的堆栈,而且还清零了,我单步调试进入空闲任务,它又是可以在ISR中保存自己的堆栈的,就是在进入OSIntCtxSw()的某个时钟滴答ISR开始就不保存空闲任务的堆栈了,即在某个时钟滴答开始就切换不到管理模式了,何故?

LR_SAVE DCD 0,0

OSTickISR

STMFD SP!, {R0,R1,R4} ;IRQ模式下的SP

LDR R4, =LR_SAVE
STR LR, [R4] ;保存IRQ模式下的LR

MRS LR, SPSR
STR LR, [R4,#4]

LDR R0, =I_ISPC
LDR R1, =BIT_TIMER0
STR R1, [R0] ;CLR PEND

LDMFD SP!, {R0,R1,R4}

ORR LR, LR, #0X80 ;切换到管理模式并禁止IRQ
MSR CPSR_cxsf, LR

SUB SP ,SP ,#4
STMFD SP!, {R0-R12,LR}

LDR R4, =LR_SAVE
LDR LR, [R4, #0]
SUB LR, LR, #4
STR LR, [SP, #(14*4)] ;save pc

LDR R4, [R4, #4]
STMFD SP!, {R4} ;管理模式下的CPSR,即任务的的CPSR

LDR R4, =OSIntNesting
LDR R5, [R4]
ADD R5, R5, #1
STR R5, [R4]

CMP R5, #1
LDREQ r4, =OSTCBCur
LDREQ r4, [r4]
STREQ sp, [r4] ; OSTCBCur -> stkptr = sp


BL OSTimeTick
BL OSIntExit

LDMFD SP!, {R4}
MSR CPSR_cxsf, R4
LDMFD SP!, {R0-R12,LR,PC}

OSIntCtxSw

BL OSdebug

LDR R4, =OSPrioCur
LDR R5, =OSPrioHighRdy
LDRB R6,[R5]
STRB R6,[R4] ;将新任务的优先级复制给当前任务的优先级

LDR R4, =OSTCBCur
LDR R5, =OSTCBHighRdy
LDR R6, [R5]
STR R6, [R4] ; OSTCBCur = OSTCBHighRdy

LDR SP, [R6] ; SP = OSTCBHighRdy -> OSTCBStkPtr

LDMFD SP!, {R4}
MSR CPSR_cxsf, R4
LDMFD SP!, {R0-R12,LR,PC} ;从新任务的任务堆栈中恢复处理器所有寄存器的值

[align=right][color=#000066][此贴子已经被作者于2006-2-27 9:03:00编辑过][/color][/align]

菜鸟
2006-03-01 16:18:00     打赏
4楼
严格按照邵贝贝教授翻译的书第2版写的

共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]