困扰半个月的问题:ucOS中,第2次调用OSTimeDly()死机

jianshe999 jianshe999 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
我按照步骤把 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 就死机了,不知道为什么。


跪求高手指点迷津????
...全文
评论 17
收藏 已收藏
分享
返回顶部