/* * Copyright (c) 2020 AIIT XUOS Lab * XiUOS is licensed under Mulan PSL v2. * You can use this software according to the terms and conditions of the Mulan PSL v2. * You may obtain a copy of Mulan PSL v2 at: * http://license.coscl.org.cn/MulanPSL2 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PSL v2 for more details. */ /** * @file: idle.c * @brief: idle file * @version: 1.0 * @author: AIIT XUOS Lab * @date: 2020/3/15 * */ #include #include #include #if defined (KERNEL_HOOK) #ifndef KERNEL_IDLE_HOOK #define KERNEL_IDLE_HOOK #endif #endif #ifndef IDLE_KTASK_STACKSIZE #define IDLE_KTASK_STACKSIZE 256 #endif #ifdef ARCH_SMP #define CORE_NUM CPU_NUMBERS #else #define CORE_NUM 1 #endif static int32 idle[CORE_NUM]; __attribute__((aligned(MEM_ALIGN_SIZE))) void RunningIntoLowPowerMode() { #ifdef ARCH_ARM __asm volatile("WFI"); #endif #ifdef ARCH_RISCV asm volatile ("wfi"); #endif } static void IdleKTaskEntry(void *arg) { while (1) { #ifdef KERNEL_IDLE_HOOK HOOK(hook.idle.hook_Idle,()); #endif RunningIntoLowPowerMode(); } } /** * * init system idle task,then startup the idle task * */ void InitIdleKTask(void) { uint8 coreid = 0; char ktaskidle[NAME_NUM_MAX] = {0}; for (coreid = 0; coreid < CORE_NUM; coreid++) { sprintf(ktaskidle, "ktaskidle%d", coreid); idle[coreid] = KTaskCreate(ktaskidle,IdleKTaskEntry,NONE,IDLE_KTASK_STACKSIZE,KTASK_LOWEST_PRIORITY); #ifdef ARCH_SMP KTaskCoreCombine(idle[coreid], coreid); #endif StartupKTask(idle[coreid]); } } /** * * This function will return the idle task descriptor * */ KTaskDescriptorType GetIdleKTaskDescripter(void) { KTaskDescriptorType idle_p = NONE; #ifdef ARCH_SMP register int id = GetCpuId(); #else register int id = 0; #endif idle_p = CONTAINER_OF(&idle[id], struct TaskDescriptor, id); return idle_p; }