鸿蒙内核阅读笔记-任务管理(los_task.c)

简介

近期在阅读鸿蒙liteOS_a,由于是初次探索内核的奥秘。将一些阅读的心得进行分享。希望能在作为笔记的同时,也能帮助更多人学习。
感谢图灵大佬的注释项目,使我能够更加快速的理解。
https://weharmony.github.io/

核心模块

核心模块位于:kernel -> base -> core
其中包括:
los_bitmap.c 用于位操作,改变标志位。
los_process.c 用于控制并发、并行、单核多进程、多核多线程的管理
los_sortlik.c 用于排序
los_swtmr.c 用于定时器
los_sys.c 用于时间管理,转换秒与毫秒,了解当前系统运行时间
los_task.c 用于任务状态管理,一个任务代表一个线程,管理其运行状态。
los_tick.c 用于系统时钟、节拍器。

任务管理(los_task.c)

#include "los_task_pri.h" //定义任务信号类型。
#include "los_base_pri.h". //定义基础类型。
#include "los_event_pri.h" //定义事件类型。
#include "los_exc.h" //内核的异常处理文件。
#include "los_hw_pri.h" //文件是中断模块,但是我没有找到源码,不清楚原因。
#include "los_init.h" //初始化模块。
#include "los_memstat_pri.h" //内存统计模块。
#include "los_mp.h" //核间中断 CPU唤醒和调度和停止
#include "los_mux_pri.h" //进程配置和内存管理
#include "los_sched_pri.h" //调度周期
#include "los_sem_pri.h" //信号控制结构
#include "los_spinlock.h" //自旋锁结构
#include "los_strncpy_from_user.h" //看着像是宏拷贝,没找到源码
#include "los_percpu_pri.h" //对接CPU的结构

#include "los_process_pri.h" // 进程的结构
#include "los_vm_map.h" //虚拟化映射管理
#include "los_vm_syscall.h" //定义虚拟化系统调用
#include "los_signal.h" //软中断信号
#include "los_hook.h" //钩子池,下HOOK在这里。

#ifdef LOSCFG_KERNEL_CPUP
#include "los_cpup_pri.h" // CPU控制块结构体
#endif
#ifdef LOSCFG_BASE_CORE_SWTMR_ENABLE
#include "los_swtmr_pri.h" //定时器配置
#endif
#ifdef LOSCFG_KERNEL_LITEIPC
#include "hm_liteipc.h" // 控制内核空间输入输出
#endif
#ifdef LOSCFG_ENABLE_OOM_LOOP_TASK
#include "los_oom.h" //oom结构体
#endif


#if (LOSCFG_BASE_CORE_TSK_LIMIT <= 0)
#error "task maxnum cannot be zero"
#endif  /* LOSCFG_BASE_CORE_TSK_LIMIT <= 0 */

LITE_OS_SEC_BSS LosTaskCB    *g_taskCBArray;//任务池 128个
LITE_OS_SEC_BSS LOS_DL_LIST  g_losFreeTask;//空闲任务链表
LITE_OS_SEC_BSS LOS_DL_LIST  g_taskRecycleList;//回收任务链表
LITE_OS_SEC_BSS UINT32       g_taskMaxNum;//任务最大个数
LITE_OS_SEC_BSS UINT32       g_taskScheduled; /* one bit for each cores *///任务调度器,每个CPU都有对应位 
LITE_OS_SEC_BSS EVENT_CB_S   g_resourceEvent;//资源的事件
/* spinlock for task module, only available on SMP mode */
LITE_OS_SEC_BSS SPIN_LOCK_INIT(g_taskSpin); //自旋锁初始化

STATIC VOID OsConsoleIDSetHook(UINT32 param1,
                               UINT32 param2) __attribute__((weakref("OsSetConsoleID")));//系统控制台ID设置HOOK

#define OS_CHECK_TASK_BLOCK (OS_TASK_STATUS_DELAY |    \
                             OS_TASK_STATUS_PENDING |  \
                             OS_TASK_STATUS_SUSPENDED)

/* temp task blocks for booting procedure */
LITE_OS_SEC_BSS STATIC LosTaskCB                g_mainTask[LOSCFG_KERNEL_CORE_NUM];//启动引导过程中使用的临时任务

LosTaskCB *OsGetMainTask()//系统获取主任务
{
    
    
    return (LosTaskCB *)(g_mainTask + ArchCurrCpuid()); //ArchCurrCpuid当前CPUID
}

VOID OsSetMainTask() //系统设置主任务
{
    
    
    UINT32 i;
    CHAR *name = "osMain";//任务名称

	//为每个CPU core 设置mainTask
    for (i = 0; i < LOSCFG_KERNEL_CORE_NUM; i++) {
    
    
        g_mainTask[i].taskStatus = OS_TASK_STATUS_UNUSED;
        g_mainTask[i].taskID = LOSCFG_BASE_CORE_TSK_LIMIT;//128
        g_mainTask[i].priority = OS_TASK_PRIORITY_LOWEST;//31
#ifdef LOSCFG_KERNEL_SMP_LOCKDEP
        g_mainTask[i].lockDep.lockDepth = 0;
        g_mainTask[i].lockDep.waitLock = NULL;
#endif
        (VOID)strncpy_s(g_mainTask[i].taskName, OS_TCB_NAME_LEN, name, OS_TCB_NAME_LEN - 1);
        LOS_ListInit(&g_mainTask[i].lockList);//初始化任务锁链表,上面挂的是任务已申请到的互斥锁
    }
}
//空闲任务,每个CPU都有自己的空闲任务
LITE_OS_SEC_TEXT WEAK VOID OsIdleTask(VOID)
{
    
    
    while (1) {
    
    //只有一个死循环
        WFI;
    }
}

未完待续。。。

猜你喜欢

转载自blog.csdn.net/qq_35476650/article/details/120281721