liteos时间管理(九)
1. 时间管理
1.1 概述
1.1.1 概念
时间管理以系统时钟为基础。时间管理提供给应用程序所有和时间有关的服务。
系统时钟是由定时/计数器产生的输出脉冲触发中断而产生的,一般定义为整数或长整数。输出脉冲的周期叫做一个“时钟滴答”。系统时钟也称为时标或者Tick。一个Tick的时长可以静态配置。
用户是以秒、毫秒为单位计时,而芯片CPU的计时是以Tick为单位的,当用户需要对系统操作时,例如任务挂起、延时等,输入秒为单位的数值,此时需要时间管理模块对二者进行转换。
Tick与秒之间的对应关系可以配置。
Huawei LiteOS的时间管理模块提供时间转换、统计、延迟功能以满足用户对时间相关需求的实现。
1.1.2 相关概念
- Cycle
系统最小的计时单位。 Cycle的时长由系统主频决定,系统主频就是每秒钟的Cycle数。
- Tick
Tick是操作系统的基本时间单位,对应的时长由系统主频及每秒Tick数决定,由用户配置。
2. 开发指导
2.1 使用场景
用户需要了解当前系统运行的时间以及Tick与秒、毫秒之间的转换关系等。
2.2 功能
Huawei LiteOS系统中的时间管理主要提供以下两种功能:
- 时间转换:根据主频实现CPU Tick数到毫秒、微秒的转换。
- 时间统计:获取系统Tick数。
功能分类 | 接口名 | 描述 |
---|---|---|
时间转换 | LOS_MS2Tick | 毫秒转换成Tick |
- | LOS_Tick2MS | Tick转化为毫秒 |
时间统计 | LOS_CyclePerTickGet | 每个Tick多少Cycle数 |
- | LOS_TickCountGet | 获取当前的Tick数 |
2.3 时间管理错误码
时间转换存在出错的可能性,需要返回对应的错误码,以便快速定位错误原因。
序 号 | 定义 | 实际数值 | 描述 | 参考解决方案 |
---|---|---|---|---|
1 | LOS_ERRNO_SYS_PTR_NULL | 0x02000010 | 入参指针为空 | 检查入参,传入非空入参 |
2 | LOS_ERRNO_SYS_CLOCK_INVAILD | 0x02000011 | 无效的系统时钟配置 | 在los_config.h配置有效的时钟 |
3 | LOS_ERRNO_SYS_MAXNUMOFCORES_IS_INVAILD | 0x02000012 | 错误码暂时没有使用 | 错误码暂时没有使用 |
4 | LOS_ERRNO_SYS_PERIERRCOREID | 0x02000013 错误码暂时没有使用 | 错误码暂时没有使用 | |
5 | LOS_ERRNO_SYS_HOOK_IS_FULL | 0x02000014 | 错误码暂时没有使用 | 错误码暂时没有使用 |
2.4 开发流程
时间管理的典型开发流程:
- 确认配置项LOSCFG_BASE_CORE_TICK_HW_TIME为YES开启状态。
- 在los_config.h中配置每秒的Tick数LOSCFG_BASE_CORE_TICK_PER_SECOND;
- 调用时钟转换接口。
- 获取系统Tick数完成时间统计。
- 通过LOS_TickCountGet获取全局g_ullTickCount。
3. 注意事项
- 获取系统Tick数需要在系统时钟使能之后。
- 时间管理不是单独的功能模块,依赖于los_config.h中的OS_SYS_CLOCK和LOSCFG_BASE_CORE_TICK_PER_SECOND两个配置选项。
- 系统的Tick数在关中断的情况下不进行计数,故系统Tick数不能作为准确时间计算。
4. 编程实例
4.1 实例描述
在下面的例子中,介绍了时间管理的基本方法,包括:
- 时间转换:将毫秒数转换为Tick数,或将Tick数转换为毫秒数。
- 时间统计和时间延迟:统计每秒的Cycle数、 Tick数和延迟后的Tick数。
4.2 编程示例
前提条件:
- 配好LOSCFG_BASE_CORE_TICK_PER_SECOND每秒的Tick数。
- 配好OS_SYS_CLOCK 系统时钟,单位: Hz。
时间转换:
VOID Example_TransformTime(VOID)
{
UINT32 uwMs;
UINT32 uwTick;
uwTick = LOS_MS2Tick(10000);//10000 ms数转换为Tick数
printf("uwTick = %d \n",uwTick);
uwMs= LOS_Tick2MS(100);//100 Tick数转换为ms数
printf("uwMs = %d \n",uwMs);
}
时间统计和时间延迟:
VOID Example_GetTime(VOID)
{
UINT32 uwcyclePerTick;
UINT64 uwTickCount;
uwcyclePerTick = LOS_CyclePerTickGet();//每个Tick多少Cycle数
if(0 != uwcyclePerTick)
{
dprintf("LOS_CyclePerTickGet = %d \n", uwcyclePerTick);
}
uwTickCount = LOS_TickCountGet();//获取Tick数
if(0 != uwTickCount)
{
dprintf("LOS_TickCountGet = %d \n", (UINT32)uwTickCount);
}
LOS_TaskDelay(200);//延迟200 Tick
uwTickCount = LOS_TickCountGet();
if(0 != uwTickCount)
{
dprintf("LOS_TickCountGet after delay = %d \n", (UINT32)uwTickCount);
}
}
4.4 结果验证
编译运行得到的结果为:
时间转换:
tick = 1000
uwMs = 1000
时间统计和时间延迟:
LOS_CyclePerTickGet = 495000
LOS_TickCountGet = 1
LOS_TickCountGet after delay = 201
liteos时间管理(九)的更多相关文章
- PMP备考_第六章_项目时间管理
项目时间管理 前言 项目时间管理是项目管理中最难的一个环节,与个人时间管理类似,团体的效率如果管理不当,是低于个人效率的,为了管理好时间,从预估,执行到反馈均需要严格的分析和处理.如果制定的计划是无法 ...
- Google内部邮件:如何进行高效的时间管理能量波动图
Google内部邮件:如何进行高效的时间管理能量波动图 发布时间: 2015-12-16 22:16:50| 阅读数:462 views 最近,我给团队内部写了一封简单的邮件.主要内容是征询他们,如何 ...
- linux 时间管理——概念、注意点(一)【转】
转自:http://www.cnblogs.com/openix/p/3324243.html 参考:1.http://bbs.eyeler.com/thread-69-1-1.html ...
- μC/OS-Ⅲ系统的时间管理函数和定时器
一.时间管理函数 μC/OS-Ⅲ系统提供一些列时间管理服务函数: 1.OSTimeDly():任务延时n个时钟节拍. 2.OSTimeDlyHMSM():任务延时指定的时间,采用“时:分:秒:毫秒”方 ...
- 时间管理的若干Tips
时间管理的若干Tips 记下来 再好的记性也不如一支笔与一个本子. 买一支好点的笔于一个好点的本子,让自己有书写的欲望,将todo事项记下来. 小目标 太大太远的目标会使人气馁.通过将大目标分解再分解 ...
- 4D时间管理
时间管理的4D原则 时间矩阵:每个人,每天要做的事情大致分为四类:一类:必须做的,不做会产生不良后果的二类:需要做的,为将来或者今后阶段做准备工作的三类:可以不做,但又不得不做的,例如通过简约形式 ...
- 【uTenux实验】时间管理(系统时间/周期性处理/警报处理)
1.系统时间管理 系统时间管理函数用来对系统时间进行操作,是OS的一个基础性的东西.个人认为,设置系统时间和获取系统时间对OS来说基本是可有可无的. uTenux提供了三个系统时间相关API.分别用于 ...
- GTD时间管理---非行动性
一:行动性和非行动有什么区别? 1:非行动性:指的是收集箱中的信息,是先存储后使用,这些信息平时都处于冬眠状态,只是要用到的时候能够找到它就好了.(偏向于处理生活) 2:行动性: 指的是收集箱中的信息 ...
- (笔记)Linux内核学习(八)之定时器和时间管理
一 内核中的时间观念 内核在硬件的帮助下计算和管理时间.硬件为内核提供一个系统定时器用以计算流逝的时间.系 统定时器以某种频率自行触发,产生时钟中断,进入内核时钟中断处理程序中进行处理. 墙上时间和系 ...
随机推荐
- [PHP] 配置vscode的语法检测消除提示Cannot validate since no PHP executable is set
默认下载完vscode什么都不做,会提示一下信息Cannot validate since no PHP executable is set. Use the setting 'php.validat ...
- 【BZOJ1443】[JSOI2009]游戏Game(二分图+博弈)
BZOJ 题意: 给出一个\(n*m\)的网格,其中有一些障碍点. 现在两个人玩游戏,首先先手选定一个点,然后从后手开始轮流移动,不能移动者即输掉这次游戏. 规定不能移动到那些之前已经到过的格子上. ...
- logistic 回归(线性和非线性)
一:线性logistic 回归 代码如下: import numpy as np import pandas as pd import matplotlib.pyplot as plt import ...
- 201871010111-刘佳华《面向对象程序设计(java)》第十二周学习总结
201871010111-刘佳华<面向对象程序设计(java)>第十二周学习总结 实验十 集合与GUI初步 实验时间 2019-11-14 第一部分:基础知识总结 第九章知识总结 1. ...
- Python 协程 (Coroutine)
协程 (Coroutine) 什么是协程 协程(微线程)是比线程更轻量化的存在,像一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程 最重要的是,协程不是被操作系统内核所管理,而完全是由程序所控 ...
- Vue 变异方法splice删除评论功能
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【2019.7.25 NOIP模拟赛 T3】树(tree)(dfs序列上开线段树)
没有换根操作 考虑如果没有换根操作,我们该怎么做. 我们可以求出原树的\(dfs\)序列,然后开线段树维护. 对于修改操作,我们可以倍增求\(LCA\),然后在线段树上修改子树内的值. 对于询问操作, ...
- MySQL实战45讲学习笔记:第三十四讲
一.本节概述 在实际生产中,关于 join 语句使用的问题,一般会集中在以下两类: 1. 我们 DBA 不让使用 join,使用 join 有什么问题呢?2. 如果有两个大小不同的表做 join,应该 ...
- 小白专场-堆中的路径-python语言实现
目录 更新.更全的<数据结构与算法>的更新网站,更有python.go.人工智能教学等着你:https://www.cnblogs.com/nickchen121/p/11407287.h ...
- 第02组 Beta冲刺(3/5)
队名:無駄無駄 组长博客 作业博客 组员情况 张越洋 过去两天完成了哪些任务 数据库实践的报告 提交记录(全组共用) 接下来的计划 加快校园百科的进度 还剩下哪些任务 学习软工的理论课 学习代码评估. ...