|
困扰半个月的问题:ucOS中,第2次调用OSTimeDly()死机
[复制链接]
我按照步骤把 ucos 移植到 ZLG 的 easyARM 开发板上,前面工作进行的挺顺利,但最近被这个问题给卡住了,半个月了,还没有搞定。
请求高手解疑释惑啊:
在一些初始化工作之后,创建了两个任务:
void main(void)
{
OSInit();
(void)OSTaskCreate(task_idle, (void *)0, &TaskIdleStk[TASK_STK_SIZE - 1], OS_LOWEST_PRIO - 4);
(void)OSTaskCreate(task_handset, (void *)0, &TaskHandsetStk[TASK_STK_SIZE - 1], 5);
OSStart();
}
两个 task 代码如下:
void task_idle(void * pdata)
{
for (;;)
{
LED_flash(1);
delay_NS(LED_FLASH_KEEP_TIME);
}
}
void task_handset(void * pdata)
{
timer_init();
for (;;)
{
LED_flash(2);
OSTimeDly(OS_TICKS_PER_SEC);
}
}
其中 task_handset 的优先级比 task_idle 的优先级高,所以我在 task_handset 中启动时钟中断定时器。
时钟中断处理函数是按照 easyARM 开发版的标准模板写的,其中通过如下函数调用 ucos 的 tick 函数:
void IRQ_Timer0(void)
{
T0IR = 0x01; // Clear IR flag.
VICVectAddr = 0x00; // Notify VIC work has done.
LED_flash(7);
OSTimeTick();
}
由于笔记本上没有并口,不能用 ZLG 带的 easyJTAG,只能用 LED 指示;
运行现象如下:
1. LED 2 亮一下,说明 task_hanset 启动了,同时 delay;
2. LED1 闪烁,同时 LED 7 闪烁,说明 task_idle 运行正常,时钟中断函数运行正常;
3. 过一会 LED 2 亮一下,之后就死机了。
应该是 task_handset delay 时间到,由于其优先级高,所以抢占执行,LED 2 亮一下是正常的,但是之后第二次调用 OSTimeDly 就死机了,不知道为什么。
跪求高手指点迷津????
|
|