os_idle.c
2026/7/20大约 2 分钟附录源码附录
os_idle.c
路径: kernel\source\os_idle.c
功能: 空闲任务实现。空闲任务是系统中优先级最低的任务(OS_TASK_PRIORITY_MAX - 1),当没有其他任务就绪时,调度器会切换到空闲任务执行。空闲任务的主要职责是进入低功耗模式,在 OS_USING_TICKLESS_LPMGR 开启时调用 os_low_power_manager() 实现 tickless 低功耗管理。
核心数据结构:
gs_os_idle_stack: 空闲任务栈(SMP 模式下为每个 CPU 分配独立栈)gs_os_idle_task: 空闲任务控制块(SMP 模式下为每个 CPU 分配独立任务)
关键 API:
| 函数 | 说明 |
|---|---|
k_idle_task_init | 初始化空闲任务:设置最低优先级,启动任务 |
_k_idle_task_entry | 空闲任务入口:死循环中调用低功耗管理器 |
关键设计点:
- 最低优先级: 空闲任务优先级为
OS_TASK_PRIORITY_MAX - 1,确保只在无其他任务就绪时运行 - SMP 支持: 多核模式下为每个 CPU 创建独立空闲任务,并设置 CPU 亲和性 (
os_task_set_cpu_affinity) - Tickless 低功耗: 在空闲任务中调用
os_low_power_manager(),在系统空闲时进入深度睡眠模式,由定时器唤醒
/**
***********************************************************************************************************************
* Copyright (c) 2020, China Mobile Communications Group Co.,Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*
* @file os_idle.c
*
* @brief This file implements the idle task.
*
* @revision
* Date Author Notes
* 2020-12-24 OneOS team First Version
***********************************************************************************************************************
*/
#include <oneos_config.h>
#include <os_types.h>
#include <os_stddef.h>
#include <os_errno.h>
#include <stdio.h>
#include <os_task.h>
#include "os_kernel_internal.h"
#define IDLE_TAG "IDLE"
#ifdef OS_USING_SMP
/* SMP 模式:每个 CPU 独立空闲任务栈和控制块 */
OS_ALIGN(OS_ARCH_STACK_ALIGN_SIZE)
uint8_t gs_os_idle_stack[OS_SMP_MAX_CPUS][OS_ALIGN_UP(OS_IDLE_TASK_STACK_SIZE, OS_ARCH_STACK_ALIGN_SIZE)];
static os_task_dummy_t gs_os_idle_task[OS_SMP_MAX_CPUS];
#else
/* 单核模式:单个空闲任务 */
static OS_TASK_STACK_DEFINE(gs_os_idle_stack, OS_IDLE_TASK_STACK_SIZE);
static os_task_dummy_t gs_os_idle_task;
#endif
#ifdef OS_USING_TICKLESS_LPMGR
extern void os_low_power_manager(void);
#endif
/* 空闲任务入口:死循环中调用低功耗管理器 */
static void _k_idle_task_entry(void *arg)
{
OS_UNREFERENCE(arg);
while (1)
{
/* TODO: */
;
#ifdef OS_USING_TICKLESS_LPMGR
os_low_power_manager();
#endif
}
}
/* 初始化空闲任务 */
void k_idle_task_init(void)
{
os_err_t ret;
os_task_id tid;
#ifdef OS_USING_SMP
/* SMP 模式:为每个 CPU 创建独立空闲任务,设置 CPU 亲和性 */
char task_name[OS_NAME_MAX + 1];
int32_t i;
task_name[OS_NAME_MAX] = '\0';
for (i = 0; i < OS_SMP_MAX_CPUS; i++)
{
snprintf(task_name, OS_NAME_MAX, "idle%d", i);
tid = os_task_create(&gs_os_idle_task[i],
&gs_os_idle_stack[i],
OS_IDLE_TASK_STACK_SIZE,
task_name,
_k_idle_task_entry,
OS_NULL,
OS_TASK_PRIORITY_MAX - 1);
if (!tid)
{
OS_ASSERT_EX(0, "Why initialize idle task failed?");
}
os_task_set_cpu_affinity(tid, i);
/* Startup */
ret = os_task_startup(tid);
if (OS_SUCCESS != ret)
{
OS_ASSERT_EX(0, "Why startup idle task failed?");
}
}
#else
/* 单核模式:创建单个空闲任务 */
tid = os_task_create(&gs_os_idle_task,
OS_TASK_STACK_BEGIN_ADDR(gs_os_idle_stack),
OS_TASK_STACK_SIZE(gs_os_idle_stack),
OS_IDLE_TASK_NAME,
_k_idle_task_entry,
OS_NULL,
OS_TASK_PRIORITY_MAX - 1);
if (!tid)
{
OS_ASSERT_EX(0, "Why initialize idle task failed?");
}
/* Startup */
ret = os_task_startup(tid);
if (OS_SUCCESS != ret)
{
OS_ASSERT_EX(0, "Why startup idle task failed?");
}