简介
近期在阅读鸿蒙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_sys.c)
#define OS_MAX_VALUE 0xFFFFFFFFUL
//获取自系统启动以来的Tick数
LITE_OS_SEC_TEXT_MINOR UINT64 LOS_TickCountGet(VOID)
{ /*
计数器呗,没啥好说的,数数并且保存的方法。
*/
return OsGetCurrSchedTimeCycle() / OS_CYCLE_PER_TICK;
}
//每个Tick多少Cycle数
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_CyclePerTickGet(VOID)
{
/*
每个滴答有个多少个循环。
*/
return g_sysClock / LOSCFG_BASE_CORE_TICK_PER_SECOND;
}
//毫秒转换成Tick
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MS2Tick(UINT32 millisec)
{
/*
时间转换器,每毫米能转换成多少滴答。
*/
if (millisec == OS_MAX_VALUE) {
return OS_MAX_VALUE;
}
return ((UINT64)millisec * LOSCFG_BASE_CORE_TICK_PER_SECOND) / OS_SYS_MS_PER_SECOND;
}
//Tick转化为毫秒
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_Tick2MS(UINT32 tick)
{
/*
时间转换器每个滴答能够转换多少个毫秒。
*/
return ((UINT64)tick * OS_SYS_MS_PER_SECOND) / LOSCFG_BASE_CORE_TICK_PER_SECOND; //los_config.h 配置每秒的Tick数
}
LITE_OS_SEC_TEXT_MINOR UINT32 OsNS2Tick(UINT64 nanoseconds)
{
const UINT32 nsPerTick = OS_SYS_NS_PER_SECOND / LOSCFG_BASE_CORE_TICK_PER_SECOND; // 1000000000/1000
UINT64 ticks = (nanoseconds + nsPerTick - 1) / nsPerTick;
if (ticks > OS_MAX_VALUE) {
/*
判断最大值 避免越界。
*/
ticks = OS_MAX_VALUE;
}
return (UINT32)ticks;
}