os_idle_task
所属模块:内核调度 | 类型:Idle任务核心函数
函数简介
:contentReference[oaicite:0]{index=0} 是系统空闲任务的核心入口函数,
在系统无可运行任务时执行,用于系统初始化收尾、资源清理以及空闲回调执行。
该函数在系统启动后由调度器进入,并长期驻留运行,是整个调度循环的“最低优先级执行单元”。
函数原型
void os_idle_task(void);
源码实现
/*------------------------------------------------------------------------
| FILE DESCRIPTION |
------------------------------------------------------------------------*/
/*------------------------------------------------------------------------
| - File name : idle_task.c
| - Author : 谭舒
| - Update date : 2026-09-19
| - Copyright(C) : 2026 HRTOS. All rights reserved.
------------------------------------------------------------------------*/
/*------------------------------------------------------------------------
| INCLUDES |
------------------------------------------------------------------------*/
#include"hrtos_internal.h"
#define OS_TASK_TOTAL (OS_PROCESS_MAX + OS_FAST_TASK_MAX)
/*------------------------------------------------------------------------
| IDLE HOOK |
------------------------------------------------------------------------*/
/**
* @brief Idle 任务钩子函数。
*
* @note 当系统处于空闲状态时,内核调用该函数。
* 用户可通过注册接口设置 Idle Hook。
*/
void (*g_idle_hook)(void);
/*------------------------------------------------------------------------
| API FUNCTIONS |
------------------------------------------------------------------------*/
/**
* @brief 初始化 HRTOS 运行环境并执行 Idle 任务。
*
* @param[in] None
*
* @return None。
*
* @note 函数启动时初始化任务、等待状态及系统资源,
* 并清除调度请求、配置锁和相关 Hook 状态。
* 初始化完成后调用 hrtos_main() 执行用户主程序初始化。
* hrtos_main() 执行完成后锁定系统配置,禁止继续注册配置项。
* 随后进入永久 Idle 循环,负责处理任务删除请求并执行 Idle Hook。
* 在系统启用中断前,必须完成 hrtos_main() 的执行。
*/
void os_idle_task(void)//
{
u8 i;
EA=0;
g_idle_hook = 0;
g_slab_overflow_hook = 0;
OS_SCHED_REASON = 0;
OS_CFG_LOCK = 0;//允许注册
for(i = 0; i < OS_PROCESS_MAX; i++)
{
OS_TASK[i].wait_type = WAIT_NONE;
OS_TASK[i].state = DEAD;
OS_TASK[i].wait_tick = 0;
}
OS_WAIT_DI2[0]=0;
OS_WAIT_DI2[1]=0;
for(i = 0; i < OS_RESOURCE_MAX; i++)
{
OS_RES[i].value = 0;
OS_RES[i].owner = OS_INVALID_ID;
OS_RES[i].wait_cnt = 0;
OS_RES[i].wait_mask = 0;
OS_RES[i].pending_signal=0;
}
hrtos_main();//必须有 中断前需进入
OS_CFG_LOCK = 1;//不允许注册
EA=1;
while(1)
{
EA=0;
for(i = 1; i < OS_TASK_TOTAL; i++)
{
if(OS_TASK_EVENT[i] & OS_EVENT_DELETE_REQ)
{
OS_TASK_EVENT[i] &= ~OS_EVENT_DELETE_REQ;
os_task_cleanup(i);
}
}
EA=1;
if (g_idle_hook)
{
g_idle_hook();
}
}
}
/*------------------------------------------------------------------------
| END OF FILE: idle_task.c |
------------------------------------------------------------------------*/
注意事项
Idle Task 为系统最低优先级执行单元,不应在其中执行阻塞操作或耗时逻辑。
同时资源清理操作发生在关中断区域,应确保数据一致性。