时间概念太重要了,在鸿蒙内核又是如何管理和使用时间的呢?
时间管理以系统时钟 g_sysClock
为基础,给应用程序提供所有和时间有关的服务。
- 用户以秒、毫秒为单位计时.
- 操作系统以Tick为单位计时,这个认识很重要. 每秒的tick大小很大程度上决定了内核调度的次数多少.
- 当用户需要对系统进行操作时,例如任务挂起、延时等,此时需要时间管理模块对Tick和秒/毫秒进行转换。
熟悉两个概念:
- Cycle(周期):系统最小的计时单位。Cycle的时长由系统主时钟频率决定,系统主时钟频率就是每秒钟的Cycle数。
- Tick(节拍):Tick是操作系统的基本时间单位,由用户配置的每秒Tick数决定,可大可小.
怎么去理解他们之间的关系呢?看几个宏定义就清楚了.
#ifndef OS_SYS_CLOCK //HZ:是每秒中的周期性变动重复次数的计量
#define OS_SYS_CLOCK (get_bus_clk()) //系统主时钟频率 例如:50000000 即20纳秒震动一次
#endif
#ifndef LOSCFG_BASE_CORE_TICK_PER_SECOND
#define LOSCFG_BASE_CORE_TICK_PER_SECOND 100 //每秒Tick数,意味着正常情况下每秒100次检查
#endif
#define OS_CYCLE_PER_TICK (g_sysClock / LOSCFG_BASE_CORE_TICK_PER_SECOND) //每个tick多少机器周期
时钟周期(振荡周期)
在鸿蒙g_sysClock
表示时钟周期,是CPU的赫兹,也就是上面说的Cycle
,这是固定不变的,由硬件晶振的频率决定的.
OsMain
是内核运行的第一个C函数,首个子函数就是 osRegister
,完成对g_sysClock
的赋值
LITE_OS_SEC_TEXT_INIT VOID osRegister(VOID)
{
g_sysClock = OS_SYS_CLOCK; //获取CPU HZ
g_tickPerSecond = LOSCFG_BASE_CORE_TICK_PER_SECOND;//每秒节拍数 默认100 即一个tick = 10ms
return;
}
CPU周期也叫(机器周期)
在鸿蒙宏OS_CYCLE_PER_TICK表示机器周期,Tick由用户根据实际情况配置.
例如:主频为1G的CPU,其振荡周期为: 1吉赫 (GHz 109 Hz) = 1 000 000 000 Hz
当Tick为100时,则1 000 000 000/100 = 10000000 ,即一个tick内可产生1千万个CPU周期.CPU就是用这1千万个周期去执行指令的.
指令周期
指令周期是执行一条指令所需要的时间,一般由若干个机器周期组成。指令不同,所需的机器周期数也不同。
对于一些简单的的单字节指令,在取指令周期中,指令取出到指令寄存器后,立即译码执行,不再需要其它的机器周期。
对于一些比较复杂的指令,例如转移指令、乘法指令,则需要两个或者两个以上的机器周期。
通常含一个机器周期的指令称为单周期指令,包含两个机器周期的指令称为双周期指令。
Tick硬中断函数
LITE_OS_SEC_BSS volatile UINT64 g_tickCount[LOSCFG_KER