鸿蒙反震时间怎么计算,鸿蒙内核源码分析(时间管理篇) | Tick是操作系统的基本时间单位...

本文主要是介绍鸿蒙反震时间怎么计算,鸿蒙内核源码分析(时间管理篇) | Tick是操作系统的基本时间单位...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

dc095eb1cc5e14f82e0c354b2f86ccd5.png

本篇说清楚时间概念

读本篇之前建议先读鸿蒙内核源码分析(总目录)其他篇.

时间概念太重要了,在鸿蒙内核又是如何管理和使用时间的呢?

时间管理以系统时钟 g_sysClock 为基础,给应用程序提供所有和时间有关的服务。

bd99237cfb0d0bcb952fdc556cbde4d7.png

● 用户以秒、毫秒为单位计时.

● 操作系统以Tick为单位计时,这个认识很重要. 每秒的tick大小很大程度上决定了内核调度的次数多少.

● 当用户需要对系统进行操作时,例如任务挂起、延时等,此时需要时间管理模块对Tick和秒/毫秒进行转换。

熟悉两个概念:

● Cycle(周期):系统最小的计时单位。Cycle的时长由系统主时钟频率决定,系统主时钟频率就是每秒钟的Cycle数。

● Tick(节拍):Tick是操作系统的基本时间单位,由用户配置的每秒Tick数决定,可大可小.

怎么去理解他们之间的关系呢?看几个宏定义就清楚了.

4e2da22c3a0f9cf24634e227b02ca9d5.png

时钟周期(振荡周期)

在鸿蒙g_sysClock表示时钟周期,是CPU的赫兹,也就是上面说的Cycle,这是固定不变的,由硬件晶振的频率决定的. OsMain是内核运行的第一个C函数,首个子函数就是 osRegister,完成对g_sysClock的赋值

0ee4539454a16da9fce87e1142001d25.png

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 ,即一秒内可产生1千万个CPU周期.CPU就是用这1千万个周期去执行指令的.

指令周期

指令周期是执行一条指令所需要的时间,一般由若干个机器周期组成。指令不同,所需的机器周期数也不同。 对于一些简单的的单字节指令,在取指令周期中,指令取出到指令寄存器后,立即译码执行,不再需要其它的机器周期。 对于一些比较复杂的指令,例如转移指令、乘法指令,则需要两个或者两个以上的机器周期。 通常含一个机器周期的指令称为单周期指令,包含两个机器周期的指令称为双周期指令。

Tick硬中断函数

LITE_OS_SEC_BSS volatile UINT64 g_tickCount[LOSCFG_KERNEL_CORE_NUM] = {0};//tick计数器,系统一旦启动,一直在++, 为防止溢出,这是一个 UINT64 的变量

LITE_OS_SEC_DATA_INIT UINT32 g_sysClock;//系统时钟,是绝大部分部件工作的时钟源,也是其他所有外设的时钟的来源

LITE_OS_SEC_DATA_INIT UINT32 g_tickPerSecond;//每秒Tick数,鸿蒙默认是每秒100次,即:10ms

LITE_OS_SEC_BSS DOUBLEg_cycle2NsScale; //周期转纳秒级

/* spinlock fortask module */

LITE_OS_SEC_BSS SPIN_LOCK_INIT(g_tickSpin); //节拍器自旋锁

#define TICK_LOCK(state)                       LOS_SpinLockSave(&g_tickSpin, &(state))

/*

* Description : Tick interruption handler

*///节拍中断处理函数 ,鸿蒙默认10ms触发一次

LITE_OS_SEC_TEXT VOID OsTickHandler(VOID)

{

UINT32 intSave;

TICK_LOCK(intSave);

g_tickCount[ArchCurrCpuid()]++;//当前CPU核计数器

TICK_UNLOCK(intSave);

#ifdef LOSCFG_KERNEL_VDSO

OsUpdateVdsoTimeval();

#endif

#ifdef LOSCFG_KERNEL_TICKLESS

OsTickIrqFlagSet(OsTicklessFlagGet());

#endif

#if (LOSCFG_BASE_CORE_TICK_HW_TIME == YES)

HalClockIrqClear(); /* diff fromevery platform */

#endif

OsTimesliceCheck();//时间片检查

OsTaskScan(); /* task timeout scan *///任务扫描

#if (LOSCFG_BASE_CORE_SWTMR == YES)

OsSwtmrScan();//定时器扫描,看是否有超时的定时器

#endif

}

#ifdef __cplusplus

#if __cplusplus

}

解读

● g_tickCount记录每个CPU核tick的数组,每次硬中断都触发 OsTickHandler,每个CPU核单独计数.

● OsTickHandler是内核调度的动力,其中会检查任务时间片是否用完,定时器是否超时.主动delay的任务是否需要被唤醒,其本质是个硬中断,在HalClockInit硬时钟初始化时创建的,具体在硬中断篇中会详细讲解.

● TICK_LOCK是tick操作的自旋锁,宏原型LOS_SpinLockSave在自旋锁篇中已详细介绍.

功能函数

#define OS_SYS_MS_PER_SECOND   1000         //一秒多少毫秒

//获取自系统启动以来的Tick数

LITE_OS_SEC_TEXT_MINOR UINT64 LOS_TickCountGet(VOID)

{

UINT32 intSave;

UINT64 tick;

/*

* use core0's tick as system's timeline,

* the tick needs tobe atomic.

*/

TICK_LOCK(intSave);

tick = g_tickCount[0];//使用CPU core0作为系统的 tick数

TICK_UNLOCK(intSave);

returntick;

}

//每个Tick多少Cycle数

LITE_OS_SEC_TEXT_MINOR UINT32 LOS_CyclePerTickGet(VOID)

{

returng_sysClock / LOSCFG_BASE_CORE_TICK_PER_SECOND;

}

//毫秒转换成Tick

LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MS2Tick(UINT32 millisec)

{

if (millisec == OS_MAX_VALUE) {

returnOS_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;

}

说明

● 在CPU篇中讲过,0号CPU核默认为主核,默认获取自系统启动以来的Tick数使用的是g_tickCount[0]

● 因每个CPU核的tick是独立计数的,所以g_tickCount中各值是不一样的.

● 系统的Tick数在关中断的情况下不进行计数,因为OsTickHandler本质是由硬中断触发的,屏蔽硬中断的情况下就不会触发OsTickHandler,自然也就不会有g_tickCount[ArchCurrCpuid()]++的计数,所以系统Tick数不能作为准确时间使用.

● 追问下,什么情况下硬中断会被屏蔽?

编程示例

前提条件:

● 使用每秒的Tick数LOSCFG_BASE_CORE_TICK_PER_SECOND的默认值100。

● 配好OS_SYS_CLOCK系统主时钟频率。

时间转换

VOID Example_TransformTime(VOID)

{

UINT32 ms;

UINT32 tick;

tick = LOS_MS2Tick(10000);    // 10000ms转换为tick

dprintf("tick = %d \n",tick);

ms = LOS_Tick2MS(100);        // 100tick转换为ms

dprintf("ms = %d \n",ms);

}

时间转换结果

tick = 1000

ms = 1000

时间统计和时间延迟

LITE_OS_SEC_TEXT UINT32 LOS_TaskDelay(UINT32 tick);

VOID Example_GetTime(VOID)

{

UINT32 cyclePerTick;

UINT64 tickCount;

cyclePerTick  = LOS_CyclePerTickGet();

if(0 != cyclePerTick) {

dprintf("LOS_CyclePerTickGet = %d \n", cyclePerTick);

}

tickCount = LOS_TickCountGet();

if(0 != tickCount) {

dprintf("LOS_TickCountGet = %d \n", (UINT32)tickCount);

}

LOS_TaskDelay(200);//延迟200个tick

tickCount = LOS_TickCountGet();

if(0 != tickCount) {

dprintf("LOS_TickCountGet after delay = %d \n", (UINT32)tickCount);

}

}

时间统计和时间延迟结果

LOS_CyclePerTickGet = 495000 //取决于CPU的频率

LOS_TickCountGet = 1 //实际情况不一定是1的

LOS_TickCountGet afterdelay = 201 //实际情况不一定是201,但二者的差距会是200

【编辑推荐】

【责任编辑:jianghua TEL:(010)68476606】

点赞 0

这篇关于鸿蒙反震时间怎么计算,鸿蒙内核源码分析(时间管理篇) | Tick是操作系统的基本时间单位...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/237997

相关文章

AI绘图怎么变现?想做点副业的小白必看!

在科技飞速发展的今天,AI绘图作为一种新兴技术,不仅改变了艺术创作的方式,也为创作者提供了多种变现途径。本文将详细探讨几种常见的AI绘图变现方式,帮助创作者更好地利用这一技术实现经济收益。 更多实操教程和AI绘画工具,可以扫描下方,免费获取 定制服务:个性化的创意商机 个性化定制 AI绘图技术能够根据用户需求生成个性化的头像、壁纸、插画等作品。例如,姓氏头像在电商平台上非常受欢迎,

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

W外链微信推广短连接怎么做?

制作微信推广链接的难点分析 一、内容创作难度 制作微信推广链接时,首先需要创作有吸引力的内容。这不仅要求内容本身有趣、有价值,还要能够激起人们的分享欲望。对于许多企业和个人来说,尤其是那些缺乏创意和写作能力的人来说,这是制作微信推广链接的一大难点。 二、精准定位难度 微信用户群体庞大,不同用户的需求和兴趣各异。因此,制作推广链接时需要精准定位目标受众,以便更有效地吸引他们点击并分享链接

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

基本知识点

1、c++的输入加上ios::sync_with_stdio(false);  等价于 c的输入,读取速度会加快(但是在字符串的题里面和容易出现问题) 2、lower_bound()和upper_bound() iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。 iterator upper_bou

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

电脑桌面文件删除了怎么找回来?别急,快速恢复攻略在此

在日常使用电脑的过程中,我们经常会遇到这样的情况:一不小心,桌面上的某个重要文件被删除了。这时,大多数人可能会感到惊慌失措,不知所措。 其实,不必过于担心,因为有很多方法可以帮助我们找回被删除的桌面文件。下面,就让我们一起来了解一下这些恢复桌面文件的方法吧。 一、使用撤销操作 如果我们刚刚删除了桌面上的文件,并且还没有进行其他操作,那么可以尝试使用撤销操作来恢复文件。在键盘上同时按下“C

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听