📄 task.lst
字号:
old_prio = _current_prio;
}
if (!(_tasks[old_prio].state & STATE_READY)) {
_tasks[new_prio].state &= ~STATE_ZOMBIE;
CRITICAL_EXIT;
return ENOTEXIST;
}
__memcpy(&_tasks[new_prio], &_tasks[old_prio], sizeof(task_t));
__tcb_free(old_prio);
#if CFG_IPC_EN > 0
if (_tasks[new_prio].pend_q != NULL) {
__queue_remove_f(_tasks[new_prio].pend_q, old_prio);
__queue_add_f(_tasks[new_prio].pend_q, new_prio);
} else
#endif
{ __ready_que_move(old_prio, new_prio); }
if (_current_prio == old_prio) {
_current_prio = new_prio;
}
CRITICAL_EXIT;
__schedule();
return EOK;
}
#endif
290
291
292 #if CFG_PRIO_MODE == 2
err_t task_change_prio(u8 old_prio, u8 new_prio)
{
register u8 cprio;
#if CFG_ARG_CHK > 1
if ((old_prio >= TASK_IDLE_PRIO && old_prio != SELF_PRIO) ||
new_prio >= TASK_IDLE_PRIO) {
return EOUTRANGE;
}
#else
C51 COMPILER V6.12 TASK 12/07/2004 17:58:47 PAGE 6
__ASSERT((old_prio < TASK_IDLE_PRIO || old_prio == SELF_PRIO) &&
new_prio < TASK_IDLE_PRIO);
#endif
CRITICAL_ENTER;
if (_tasks[new_prio].state != STATE_NONE) {
CRITICAL_EXIT;
return EEXIST;
}
if (old_prio == SELF_PRIO) {
cprio = _current_prio;
old_prio = _tasks[cprio].prio.normal;
} else if (!__prio_if_normal(old_prio)) {
CRITICAL_EXIT;
return ENOTEXIST;
} else {
cprio = _tasks[old_prio].prio.current;
}
if (_tasks[cprio].lock > 0) {
CRITICAL_EXIT;
return ELOCK;
}
__nprio_lock(cprio);
_tasks[new_prio].state = STATE_ZOMBIE;
CRITICAL_EXIT;
__dummy();
CRITICAL_ENTER;
cprio = _tasks[old_prio].prio.current;
__nprio_unlock(cprio);
_tasks[cprio].prio.normal = new_prio;
__memcpy(&_tasks[new_prio], &_tasks[old_prio], sizeof(task_t));
__tcb_free(old_prio);
if (cprio == old_prio) {
#if CFG_IPC_EN > 0
if (_tasks[new_prio].pend_q != NULL) {
__queue_remove_f(_tasks[new_prio].pend_q, cprio);
__queue_add_f(_tasks[new_prio].pend_q, new_prio);
} else
#endif
{ __ready_que_move(cprio, new_prio); }
}
if (_current_prio == old_prio) {
_current_prio = new_prio;
}
CRITICAL_EXIT;
__schedule();
return EOK;
}
err_t task_change_cprio(u8 prio, u8 new_cprio)
{
register u8 old_cprio;
#if CFG_ARG_CHK > 1
if ((prio >= TASK_IDLE_PRIO && prio != SELF_PRIO) ||
C51 COMPILER V6.12 TASK 12/07/2004 17:58:47 PAGE 7
new_cprio >= TASK_IDLE_PRIO) {
return EOUTRANGE;
}
#else
__ASSERT((prio < TASK_IDLE_PRIO || prio == SELF_PRIO) &&
new_cprio < TASK_IDLE_PRIO);
#endif
/*see if prio is available*/
CRITICAL_ENTER;
if (prio == SELF_PRIO) {
old_cprio = _current_prio;
prio = _tasks[old_cprio].prio.normal;
} else if (!__prio_if_normal(prio)) {
CRITICAL_EXIT;
return ENOTEXIST;
} else {
old_cprio = _tasks[prio].prio.current;
}
__nprio_lock(old_cprio);
CRITICAL_EXIT;
__dummy();
CRITICAL_ENTER;
if (_tasks[new_cprio].state == STATE_NONE ||
(_tasks[new_cprio].state == STATE_RESERVED &&
prio == new_cprio)) {
_tasks[new_cprio].state |= STATE_ZOMBIE;
} else {
old_cprio = _tasks[prio].prio.current;
__nprio_unlock(old_cprio);
CRITICAL_EXIT;
return EINVAL;
}
CRITICAL_EXIT;
__dummy();
CRITICAL_ENTER;
old_cprio = _tasks[prio].prio.current; /**/
if (!(_tasks[prio].state & STATE_ZOMBIE) ||
prio == new_cprio) {
__nprio_unlock(old_cprio);
__memcpy(&_tasks[new_cprio], &_tasks[old_cprio], sizeof(task_t));
/*free the old current tcb*/
__tcb_free(old_cprio);
if (prio != new_cprio) {
_tasks[prio].delay = 0;
_tasks[prio].state = STATE_RESERVED;
_tasks[prio].prio.current = new_cprio;
}
#if CFG_IPC_EN > 0
if (_tasks[new_cprio].pend_q != NULL) {
__queue_remove_f(_tasks[new_cprio].pend_q, old_cprio);
__queue_add_f(_tasks[new_cprio].pend_q, new_cprio);
} else
#endif
{ __ready_que_move(old_cprio, new_cprio); }
if (_current_prio == old_cprio) {
_current_prio = new_cprio;
}
C51 COMPILER V6.12 TASK 12/07/2004 17:58:47 PAGE 8
CRITICAL_EXIT;
__schedule();
return EOK;
} else {
__nprio_unlock(old_cprio);
_tasks[new_cprio].state &= ~STATE_ZOMBIE;
CRITICAL_EXIT;
return ENAVAIL;
}
}
#endif
439
440
441 void task_sleep(tick_t ticks)
442 {
443 1 register u8 current;
444 1
445 1 if (ticks > 0) {
446 2 CRITICAL_ENTER;
447 2 current = _current_prio;
448 2 _tasks[current].delay = ticks;
449 2 __ready_que_remove(current);
450 2 CRITICAL_EXIT;
451 2
452 2 __schedule();
453 2 }
454 1 }
455
456
457 #if CFG_PRIO_MODE < 2
458 err_t task_wake(u8 prio)
459 {
460 1 #if CFG_ARG_CHK > 1
461 1 if (prio >= TASK_IDLE_PRIO) {
462 2 return EOUTRANGE;
463 2 }
464 1 #else
__ASSERT(prio < TASK_IDLE_PRIO);
#endif
467 1
468 1 CRITICAL_ENTER;
469 1 if (_tasks[prio].delay != 0 &&
470 1 !(_tasks[prio].state & STATE_SUSPEND)) {
471 2 _tasks[prio].delay = 0;
472 2 __ready_que_add(prio);
473 2 CRITICAL_EXIT;
474 2
475 2 __schedule();
476 2 return EOK;
477 2 } else {
478 2 CRITICAL_EXIT;
479 2 return EUNKNOW;
480 2 }
481 1 }
482
483 #else
err_t task_wake(u8 prio)
{
register u8 cprio;
#if CFG_ARG_CHK > 1
C51 COMPILER V6.12 TASK 12/07/2004 17:58:47 PAGE 9
if (prio >= TASK_IDLE_PRIO) {
return EOUTRANGE;
}
#else
__ASSERT(prio < TASK_IDLE_PRIO);
#endif
CRITICAL_ENTER;
if (!__prio_if_normal(prio)) {
CRITICAL_EXIT;
return ENOTEXIST;
}
cprio = _tasks[prio].prio.current;
if (_tasks[cprio].delay != 0 &&
!(_tasks[cprio].state & STATE_SUSPEND)) {
_tasks[cprio].delay = 0;
__ready_que_add(cprio);
CRITICAL_EXIT;
__schedule();
return EOK;
} else {
CRITICAL_EXIT;
return EUNKNOW;
}
}
#endif
517
518
519 #if CFG_TASK_SUS_EN > 0 && CFG_PRIO_MODE < 2
err_t task_suspend(u8 prio)
{
#if CFG_ARG_CHK > 1
if (prio >= TASK_IDLE_PRIO && prio != SELF_PRIO) {
return EOUTRANGE;
}
#else
__ASSERT(prio < TASK_IDLE_PRIO || prio == SELF_PRIO);
#endif
CRITICAL_ENTER;
if (prio == SELF_PRIO) {
prio = _current_prio;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -