前言

在软件世界里面,超时是一个非常重要的概念。比如

● 当前线程暂时休眠1秒钟,休眠结束后继续执行

● 每5秒钟采集一下CPU利用率

● 数据发送失败,2秒钟以后再试一试

● 等待某种数据,但最多等待50毫秒

应用

//将当前任务休眠若干tick数,tick为时间单位,常见值为10毫秒

LITE_OS_SEC_TEXT UINT32 LOS_TaskDelay(UINT32 tick)
  • 1.

//获取信号量semHandle, 如果当前信号量不可用且timeout不为0,则最多等待timeout所指定的时间,在这段时间内如果信号量可用,则获取成功,否则获取失败。

LITE_OS_SEC_TEXT UINT32 LOS_SemPend(UINT32 semHandle, UINT32 timeout)
  • 1.

//从空的消息队列读取消息,或者向满的消息队列写消息时,如果timeout不为0,则最多等待timeout指定的时间,在这段时间内消息队列可读或可写,则进行对应的读写并返回成功,否则返回失败。

LITE_OS_SEC_TEXT UINT32 LOS_QueueRead(UINT32 queueID, VOID *bufferAddr, UINT32 bufferSize, UINT32 timeOut)

LITE_OS_SEC_TEXT UINT32 LOS_QueueWrite(UINT32 queueID, VOID *bufferAddr, UINT32 bufferSize, UINT32 timeOut)
  • 1.
  • 2.
  • 3.

//获取互斥锁,如果当前互斥锁被其它线程占用,则最多等待timeout指定的时间,此时间内其它线程释放了互斥锁并被本线程抢到则返回成功,否则返回失败。

LITE_OS_SEC_TEXT UINT32 LOS_MuxPend(UINT32 muxHandle, UINT32 timeout)
  • 1.

//等待其它线程向本线程发送事件,最多等待timout指定的时间

LITE_OS_SEC_TEXT UINT32 LOS_EventRead(PEVENT_CB_S eventCB, UINT32 eventMask, UINT32 mode, UINT32 timeOut)
  • 1.

上述这些函数都是超时概念在OpenHarmony中liteos_m内核里的具体应用。

具体而言,liteos_m内核如何实现这个超时逻辑的呢,我们接着看下一个章节

原理

对OpenHarmony中LiteOS的内核分析——超时原理和应用_鸿蒙内核

如上图所示。在时间轴上,黄色圆点代表需要进行某种操作的时间点,而绿色圆点为检查系统是否有超时事件需要处理的检查时间点。系统周期性的进行检查(周期单位为tick)。在2个检查点之间可能有超时事件,也可能无超时事件。

例如,根据上图展示的情况。当前在第一个检查点,发现了2个超时事件,那么这次处理这2个超时事件;随着时间流逝,箭头来到第2个检查点,又发现2个超时事件,继续处理;在第3个检查点时,本段时间内无超时事件,所以是空操作。后续的检查以此类推。

代码实现

为了准确性以及时效性,本文选取了最新的版本的代码来描述。上述检查点和时间点由链表结构进行定义。具体在kernel/liteos_m/include/los_sortlink.h文件中。

对OpenHarmony中LiteOS的内核分析——超时原理和应用_鸿蒙源码_02

由于原理图中的超时事件发生是非均匀的,且存在有序依次发生的逻辑,所以,这些信息被维护在双向链表中(对删除操作更友好)。

SortLinkList代表了链表中的每一个需要处理事件的时间点,responseTime代表具体的时间值(从启机开始的cpu cycle数目)。SortLinkAttribute代表链表的头部(哑头)。从名称也能看出,这个是一个排序的双向链表,排序的依据即responseTime这个数值。

需要注意的一个细节是:系统支持2个链表,其中一个是TASK链表,另一个是SWTMR链表。这2个链表实现方式一致,主要区别是,SWTMR链表超时处理是唤醒swtmr线程来处理超时事件,而task链表唤醒的是每个具体的task(sleep,ipc超时等场景)。使用swtmr线程来处理若干超时的机制,可以有效减少系统需要的线程数目,从而节省系统资源的占用。

总结

本文描述了超时逻辑在OpenHarmony中的实现,从原理,使用以及具体实现细节上进行了详尽讨论,并归纳整理了当前这种实现方式所带来的益处。

经常有很多小伙伴抱怨说:不知道学习鸿蒙开发哪些技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?

为了能够帮助到大家能够有规划的学习,这里特别整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、WebGL、元服务、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植等等)鸿蒙(HarmonyOS NEXT)技术知识点。

对OpenHarmony中LiteOS的内核分析——超时原理和应用_openharmony_03

《鸿蒙 (Harmony OS)开发学习手册》(共计892页)
如何快速入门?

1.基本概念
2.构建第一个ArkTS应用
3.……

对OpenHarmony中LiteOS的内核分析——超时原理和应用_linux_04

开发基础知识:

1.应用基础知识
2.配置文件
3.应用数据管理
4.应用安全管理
5.应用隐私保护
6.三方应用调用管控机制
7.资源分类与访问
8.学习ArkTS语言
9.……

对OpenHarmony中LiteOS的内核分析——超时原理和应用_openharmony_05

基于ArkTS 开发

1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.……

对OpenHarmony中LiteOS的内核分析——超时原理和应用_鸿蒙开发_06

鸿蒙开发面试真题(含参考答案)

对OpenHarmony中LiteOS的内核分析——超时原理和应用_鸿蒙源码_07

OpenHarmony 开发环境搭建

对OpenHarmony中LiteOS的内核分析——超时原理和应用_openharmony_08

《OpenHarmony源码解析》
  • 搭建开发环境
  • Windows 开发环境的搭建
  • Ubuntu 开发环境搭建
  • Linux 与 Windows 之间的文件共享
  • ……
  • 系统架构分析
  • 构建子系统
  • 启动流程
  • 子系统
  • 分布式任务调度子系统
  • 分布式通信子系统
  • 驱动子系统
  • ……

对OpenHarmony中LiteOS的内核分析——超时原理和应用_鸿蒙内核_09

OpenHarmony 设备开发学习手册

对OpenHarmony中LiteOS的内核分析——超时原理和应用_鸿蒙开发_10