wake_task
所属模块:内核调度 | 类型:任务唤醒函数
函数简介
wake_task 用于唤醒处于等待状态的任务,
将任务从 WAIT 状态恢复为 READY 状态,并重新参与系统调度。
该函数同时负责清理任务的等待上下文信息,
并解除资源对象中的等待标记。
函数原型
void wake_task(u8 tid, u8 flag);
参数说明
| 参数 |
说明 |
| tid |
任务ID |
| flag |
唤醒原因标志(WAIT_SIGNAL / WAIT_TIMEOUT等) |
源码实现
/*------------------------------------------------------------------------
| FILE DESCRIPTION |
------------------------------------------------------------------------*/
/*------------------------------------------------------------------------
| - File name : wake_task.c
| - Author : 谭舒
| - Update date : 2026-09-19
| - Copyright(C) : 2026 HRTOS. All rights reserved.
------------------------------------------------------------------------*/
/*------------------------------------------------------------------------
| INCLUDES |
------------------------------------------------------------------------*/
#include "hrtos_internal.h"
/*------------------------------------------------------------------------
| API FUNCTIONS |
------------------------------------------------------------------------*/
/**
* @brief 唤醒指定任务并恢复其调度资格。
*
* @param[in] tid 待唤醒的任务编号。
* @param[in] flag 任务唤醒原因标志。
*
* @return None。
*
* @note 清理指定任务的等待状态及等待对象,
* 设置任务唤醒结果并恢复任务就绪状态。
* 当任务已删除或处于删除准备状态时,不执行唤醒操作。
* 任务唤醒后请求系统重新进行任务调度。
*/
void wake_task(u8 tid, u8 flag)
{
u8 obj;
/* 保存等待对象 */
EA=0;
obj = OS_TASK[tid].wait_obj;
/* -------------------------
* 清理等待位图
* ------------------------- */
if(obj != OS_INVALID_ID)
{
OS_RES[obj].wait_mask &= ~((u16)1 << tid);
if(OS_RES[obj].wait_cnt)
{
OS_RES[obj].wait_cnt--;
}
}
if(OS_PROCESS_OK[tid] == 0)//已删除
{
EA=1;
return ;
}
if(OS_TASK_EVENT[tid] & OS_EVENT_DELETE_REQ)//准备删除
{
EA=1;
return ;
}
/* -------------------------
* 设置唤醒结果
* ------------------------- */
OS_TASK[tid].wait_flag = flag;
/* -------------------------
* 清理等待上下文
* ------------------------- */
OS_TASK[tid].wait_type = WAIT_NONE;
OS_TASK[tid].wait_obj = OS_INVALID_ID;
OS_TASK[tid].wait_tick = 0;
/* -------------------------
* 设置就绪态
* ------------------------- */
OS_TASK[tid].state = READY;
/* -------------------------
* 允许调度
* ------------------------- */
OS_PROCESS_OK[tid] |= 1;
OS_SCHED_REASON=1;//调度触发位
EA=1;
TF0=1;//T0中断
}
/*------------------------------------------------------------------------
| END OF FILE: wake_task.c |
------------------------------------------------------------------------*/
使用示例
wake_task(1, WAIT_SIGNAL);
注意事项
wake_task 是系统级核心函数,仅用于内核内部调用。
直接错误使用可能破坏任务状态一致性。