0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

超时逻辑在OpenHarmony中的实现

OpenAtom OpenHarmony 来源:OpenAtom OpenHarmony 作者:冷钦街 2022-07-06 09:52 次阅读

前言

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

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

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

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

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

应用

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

LITE_OS_SEC_TEXT UINT32 LOS_TaskDelay(UINT32 tick)

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

LITE_OS_SEC_TEXT UINT32 LOS_SemPend(UINT32 semHandle, UINT32 timeout)

//从空的消息队列读取消息,或者向满的消息队列写消息时,如果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)

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

LITE_OS_SEC_TEXT UINT32 LOS_MuxPend(UINT32 muxHandle, UINT32 timeout)

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

LITE_OS_SEC_TEXT UINT32 LOS_EventRead(PEVENT_CB_S eventCB, UINT32 eventMask, UINT32 mode, UINT32 timeOut)

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

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

原理

e249022e-fc63-11ec-ba43-dac502259ad0.png

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

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

代码实现


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

e25d21be-fc63-11ec-ba43-dac502259ad0.png

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

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

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

总结

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

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4556

    浏览量

    66776
  • 超时
    +关注

    关注

    0

    文章

    2

    浏览量

    6753
  • OpenHarmony
    +关注

    关注

    23

    文章

    3301

    浏览量

    15159

原文标题:对OpenHarmony中LiteOS的内核分析——超时原理和应用

文章出处:【微信号:gh_e4f28cfa3159,微信公众号:OpenAtom OpenHarmony】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何利用OpenHarmony实现智能控设备面板的设计

    。如何实现多种家庭设备的集中管理和远程控制,是智能家居功能的体现。基于以上背景,本文提出了一种基于OpenHarmony设计实现智能控设备,目的是使开发者了解集成设备进行统一管理控制
    发表于 03-21 09:20

    OpenHarmony3.1Beta喂狗资料合集

    1、openharmony3.1Beta启动喂狗服务解读watchdog的实现用于监视系统的运行,包括内核态watchdog模块和用户态watchdog服务程序。内核态watchdog 模块通过
    发表于 03-21 09:58

    OpenHarmonyAT命令模块的理解与注册资料分享

    最早接触 AT 命令是使用通信模块的时候,那时的 AT 命令的打包和解析都是自己写的函数实现,代码逻辑和框架也都不成熟,通用性也不强。现在的 RTOS 操作系统也都包含了这部分的内
    发表于 03-24 14:37

    OpenHarmony标准设备应用开发笔记汇总

    (以下简称“OpenHarmony”),相关控件布局如何使用,以及 OpenHarmony
    发表于 03-28 14:19

    深度剖析OpenHarmony应用/服务的逻辑结构

    OpenHarmony APP工程结构进行OpenHarmony应用/服务开发前,应该掌握OpenHarmony应用/服务的逻辑结构。
    发表于 04-12 11:11

    app图标动效openharmony的源码上哪里实现的?

    openharmony点击一个app图标的之后,应用会从左上角一点点放大直至铺满屏幕;我想问一下这个动效是openharmony的源码上的哪里实现的?
    发表于 06-10 11:01

    三步就能在OpenHarmony实现车牌识别

    如下所示:运行程序后按下 1 拍照、按 2 输出识别结果如下所示:开发流程本车牌识别项目使用 OpenHarmony 的媒体子系统实现。代码基于停车场景下的本地车牌识别。进行讲解,其代码结构如下
    发表于 06-28 10:15

    三步就能在OpenHarmony实现车牌识别

    识别结果如下所示:开发流程本车牌识别项目使用 OpenHarmony 的媒体子系统实现。代码基于停车场景下的本地车牌识别。进行讲解,其代码结构如下:三方库移植EasyPR 实现是基于
    发表于 07-06 11:20

    OpenHarmonyLiteOS的内核分析——超时原理和应用

    )。使用swtmr线程来处理若干超时的机制,可以有效减少系统需要的线程数目,从而节省系统资源的占用。总结本文描述了超时逻辑OpenHarmony
    发表于 07-11 17:47

    每日推荐 | 单片机毕业设计实例汇总,OpenHarmony 智能家居项目分享

    :本文描述了超时逻辑OpenHarmony实现,从原理,使用以及具体
    发表于 07-12 10:26

    OpenHarmony轻量系统内核资源主要管理方式

    空闲的状态,这样可以增加空闲状态判断的健壮性;另外,通过直接判断状态也比判断是否链表中性能更高。如下(los_mux.c):2.中断上下文保护由于中断上下文中不允许有睡眠操作,而互斥锁获取
    发表于 10-21 11:34

    Android实现屏幕关闭超时的正确方法是什么?

    CUSTOM IMX8MPlus 板上使用 Android 11.2.6。我想在 10 秒后实现屏幕超时,然后双击再次打开屏幕。 如果我 Settings.System
    发表于 04-14 07:15

    Qt For OpenHarmony

    OpenHarmony本身触屏的输入、鼠标/键盘的输入怎么能够把它映射到Qt本身的应用程序框架里去。需要了解Qt的QPA实现及系统接口调用的相关逻辑,就能实现Qt应用程序
    发表于 09-15 15:39

    如何实现事件结构中存在多个超时的功能

    实现事件结构中存在多个超时的功能
    发表于 04-03 14:57 2次下载

    写芯片超时该如何解决啊?

    写芯片超时该如何解决啊? 芯片在现代电子设备中扮演着至关重要的角色。它们是设备内部运行的核心,控制着所有的操作。然而,由于各种原因,芯片可能会发生超时问题。超时问题一旦发生,可能会导致芯片停止正常
    的头像 发表于 09-13 10:43 2549次阅读