【LuatOS】修改LuatOS源码为PC模拟器添加高精度时间戳库timeplus

0x00 缘起

LuatOS以及Lua能够提供微秒或者毫秒的时间戳获取工具,但并没有提供获取纳秒的工具。通过编辑LuatOS源码以及相关BSP源码,添加能够获取纳秒的timeplus库并重新编译,以解决在64位Windows操作系统中LuatOS模拟器获取纳秒的问题,其运行效果如下所示:

  • getunixtime:获取时间戳字符串
  • getmillisecond:获取毫秒时间戳字符串
  • getmicrosecond:获取微秒时间戳字符串
  • getnanosecond:获取纳秒时间戳字符串

0x01 方法

参照LuatOS官方文档,对timeplus进行开发,其步骤如下:

  1. Git拉取LuatOS和PC模拟器源代码;
  2. 新增一个通用库的实例;
  3. 注册库函数;
  4. 验证库函数;

1 Git拉取LuatOS和PC模拟器源代码

使用Git命令拉取“LuatOS”项目和“LuatOS跑在PC上”两个项目到本地同级目录下,拉取命令如下:

git clone https://gitee.com/openLuat/LuatOS.git
git clone https://gitee.com/openLuat/luatos-soc-pc.git

2 新增一个通用库的实例

进入LuatOS源码文件夹lua/src/目录下,添加名为:luat_lib_timeplus.c的文件,文件内容如下:

#include <lauxlib.h>
#include <lua.h>
#include <stdio.h>
#include <windows.h>#include "luat_base.h"// 获取当前时间的 Unix 时间戳(秒)
static int l_timeplus_getunixtime(lua_State *L) {FILETIME ft;ULARGE_INTEGER ull;GetSystemTimeAsFileTime(&ft);ull.LowPart = ft.dwLowDateTime;ull.HighPart = ft.dwHighDateTime;// 将 FILETIME 转换为 Unix 时间戳(秒)time_t unixTime = (ull.QuadPart / 10000000ULL) - 11644473600ULL;lua_pushinteger(L, unixTime);return 1;
}// 获取当前时间的 Unix 时间戳(毫秒)
static int l_timeplus_getmillisecond(lua_State *L) {FILETIME ft;ULARGE_INTEGER ull;GetSystemTimeAsFileTime(&ft);ull.LowPart = ft.dwLowDateTime;ull.HighPart = ft.dwHighDateTime;// 将 FILETIME 转换为 Unix 时间戳(毫秒)uint64_t milliseconds = (ull.QuadPart / 10000ULL) - 11644473600000ULL;lua_pushinteger(L, milliseconds);return 1;
}// 获取当前时间的 Unix 时间戳(微秒)
static int l_timeplus_getmicrosecond(lua_State *L) {FILETIME ft;ULARGE_INTEGER ull;GetSystemTimeAsFileTime(&ft);ull.LowPart = ft.dwLowDateTime;ull.HighPart = ft.dwHighDateTime;// 将 FILETIME 转换为 Unix 时间戳(微秒)uint64_t microseconds = (ull.QuadPart / 10ULL) - 11644473600000000ULL;lua_pushinteger(L, microseconds);return 1;
}// 获取当前时间的 Unix 时间戳(纳秒)
static int l_timeplus_getnanosecond(lua_State *L) {FILETIME ft;ULARGE_INTEGER ull;GetSystemTimeAsFileTime(&ft);ull.LowPart = ft.dwLowDateTime;ull.HighPart = ft.dwHighDateTime;// 将 FILETIME 转换为 Unix 时间戳(纳秒)// 乘以100将100纳秒单位转换为纳秒uint64_t nanoseconds_since_epoch =(ull.QuadPart - 116444736000000000ULL) * 100ULL;lua_pushinteger(L, nanoseconds_since_epoch);return 1;
}// 库函数注册表
#include "rotable2.h"
static const rotable_Reg_t reg_timeplus[] = {{"getunixtime", ROREG_FUNC(l_timeplus_getunixtime)},{"getmillisecond", ROREG_FUNC(l_timeplus_getmillisecond)},{"getmicrosecond", ROREG_FUNC(l_timeplus_getmicrosecond)},{"getnanosecond", ROREG_FUNC(l_timeplus_getnanosecond)},{NULL, ROREG_INT(0)}};// 库的声明
LUAMOD_API int luaopen_timeplus(lua_State *L) {luat_newlib2(L, reg_timeplus);return 1;
}

3 注册库函数

修改LuatOS代码库的 luat/include/luat_libs.h, 新增一行:

// TimePlus 能够取微秒
LUAMOD_API int luaopen_timeplus(lua_State *L);

修改luatos-soc-pc代码库的port\luat_base_mini.c, 在static const luaL_Reg loadedlibs[]{NULL, NULL}};之上添加一行代码:

{"timeplus", luaopen_timeplus},

4 验证库函数

luatos-soc-pc代码库中,运行文件:build_windows_64bit_msvc.bat进行编译,输出文件在build文件夹下,编译之前请确保编译工具已经配置可用。运行所编译的文件luatos-lua.exe,在命令行中执行以下代码,并验证输出:

timeplus.getunixtime()
timeplus.getmillisecond()
timeplus.getmicrosecond()
timeplus.getnanosecond()

0x02 总结

针对LuatOS Windows模拟器不能提供纳秒时间戳的工具问题,通过添加自定义库timeplus并重新编译以使得模拟器具有输出纳秒时间戳的能力。值得注意的是,当前纳秒的获取方法仅适用与Windows,对于Linux以及其他操作系统,需要修改luat_lib_timeplus.c的实现过程,以提供该功能。

0x03 资源

  • LuatOS 添加自定义库和函数 官方文档

0x04 后记

  • 己欲立而立人,己欲达而达人。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/58290.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

7.2 设计模式

设计模式 7.3.1 设计模式的要素7.3.2 创建型设计模式7.3.3 结构性设计模式1. Adapter (适配器)2. Bridge(桥接)3.Composite(组合)4.Decorator(装饰)5.Facade(外观)6.Flyweight(享元)7.Proxy(代理)8. 结构型模式比较 7.3.4 行为型设计模式1 Chain of Responsibility [ &#xff…

FP独立站收款攻略:AB站映射策略深度解析

在当今全球化的商业环境下&#xff0c;跨境电商已成为众多企业寻求发展的重要途径。其中&#xff0c;独立站模式因其独特的优势&#xff0c;如品牌自主性强、客户数据掌控度高、运营灵活性大等&#xff0c;吸引了越来越多商家的目光。然而&#xff0c;对于涉及FP交易的独立站商…

数字信号处理Python示例(6)使用指数衰减函数建模放射性衰变过程

文章目录 前言一、放射性衰变方程二、放射性衰变过程的Python仿真三、仿真结果分析写在后面的话 前言 使用指数衰减函数对放射性衰变进行了建模仿真&#xff0c;给出完整的Python仿真代码&#xff0c;并对仿真结果进行了分析。 一、放射性衰变方程 放射性衰变是一种自然现象&…

自动化生成和发送报告的Python脚本

自动化生成和发送报告的Python脚本 在现代企业和组织中,报告的生成和发送是日常工作中不可或缺的一部分。无论是财务报告、销售数据分析,还是项目进展汇报,手动编写和发送报告不仅耗时,而且容易出错。为了提高工作效率,本文将介绍如何使用Python编写一个自动化生成和发送…

大数据新视界 -- 大数据大厂之 Impala 与内存管理:如何避免资源瓶颈(上)(5/30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

Vue开发实战——Vue标签根据宽度按比例实现高度

VUE标签根据宽度按比例实现高度 1、安装指令 “vue-proportion-directive”: “^1.1.0”, npm install vue-proportion-directive --save2、在main.js中引入指令 // 控制标签宽高成比例的指令 import proportion from vue-proportion-directive; Vue.use(proportion);3、示例…

AntFlow一款开源免费且自主可控的仿钉钉工作流引擎

在现代企业管理中&#xff0c;流程审批的高效性直接影响到工作的流畅度与生产力。最近&#xff0c;我发现了一个非常有趣的项目——AntFlow。这个项目不仅提供了一个灵活且可定制的工作流平台&#xff0c;还能让用户以可视化的方式创建和管理审批流程。 如果你寻找一个快速集成…

理解 WordPress | 第二篇:结构化分析

WordPress 专题致力于从 0 到 1 搞懂、用熟这种可视化建站工具。 第一阶段主要是理解。 第二阶段开始实践个人博客、企业官网、独立站的建设。 如果感兴趣&#xff0c;点个关注吧&#xff0c;防止迷路。 WordPress 的内容和功能结构可以按照层级来划分&#xff0c;这种层次化的…

Jest进阶:测试 Vue 组件

在 Vue 项目中&#xff0c;测试组件是确保应用质量和稳定性的关键步骤。Vue Test Utils 是一个专门为 Vue.js 应用程序编写的单元测试和集成测试工具库。它提供了丰富的 API&#xff0c;帮助开发者模拟用户操作、查询组件和断言测试结果&#xff0c;从而在不需要手动操作应用程…

省级-社会保障水平数据(2007-2022年)

社会保障水平是一个综合性的概念&#xff0c;它不仅涉及到一个国家或地区的社会保障制度覆盖范围&#xff0c;还包括了提供的保障种类与水平&#xff0c;以及这些制度在满足公民基本生活需求方面的能力。 2007-2022年省级-社会保障水平数据.zip资源-CSDN文库https://download.…

【毫米波雷达(三)】汽车控制器启动流程——BootLoader

汽车控制器启动流程——BootLoader 一、什么是Bootloader(BT)&#xff1f;二、FBL、PBL、SBL、ESS的区别三、MCU的 A/B分区的实现 一、什么是Bootloader(BT)&#xff1f; BT就是一段程序&#xff0c;一段引导程序。它包含了启动代码、中断、主程序等。 雷达启动需要由BT跳转到…

计算机网络——网络层导论

转发是局部功能——数据平面 路由是全局的功能——控制平面 网卡 网卡&#xff0c;也称为网络适配器&#xff0c;是计算机硬件中的一种设备&#xff0c;主要负责在计算机和网络之间进行数据传输。 一、主要功能 1、数据传输&#xff1a; 发送数据时&#xff0c;网卡将计算机…

C++算法练习-day37——112.路径总和

题目来源&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目思路分析 题目要求判断一棵二叉树中是否存在一条从根节点到叶子节点的路径&#xff0c;使得路径上所有节点的值相加等于一个给定的目标和&#xff08;targetSum&#xff09;。为了解决这个问题&#xff0c…

使用 Python 调用云 API 实现批量共享自定义镜像

本文介绍如何通过 Python SDK 调用 API 接口&#xff0c;通过子用户批量共享云服务器自定义镜像。若您具备类似需求&#xff0c;或想了解如何使用 SDK&#xff0c;可参考本文进行操作。 前提条件 已创建子用户&#xff0c;并已具备云服务器及云 API 所有权限。 创建子用户请…

[mysql]修改表和课后练习

目录 DDL数据定义语言 添加一个字段 添加一个字段到最后一个 添加到表中的第一个一个字段 选择其中一个位置: 修改一个字段:数据类型,长度,默认值(略) 重命名一个字段 删除一个字段 重命名表 删除表 清空表 DCL中事务相关内容 DCL中COMMIT和ROLLBACK的讲解 对比TR…

苍穹外卖 商家接单、拒单

OrderController /*** 接单** param ordersConfirmDTO* return*/PutMapping("/confirm")ApiOperation("接单")public Result confirm(RequestBody OrdersConfirmDTO ordersConfirmDTO) {orderService.confirm(ordersConfirmDTO);return Result.success();…

对于IIC的理解

IIC是一种通信协议 具体特点&#xff1a; 1&#xff1a;同步传输&#xff08;不会因为中断而影响数据传输&#xff0c;但是会多一根传输线&#xff09; 2&#xff1a;半双工 &#xff08;少一根线&#xff0c;但是一次只能收或者发送数据&#xff09; 对于IIC有两种模式&am…

Python异常检测 - LSTM(长短期记忆网络)

系列文章目录 Python异常检测- Isolation Forest&#xff08;孤立森林&#xff09; python异常检测 - 随机离群选择Stochastic Outlier Selection (SOS) python异常检测-局部异常因子&#xff08;LOF&#xff09;算法 Python异常检测- DBSCAN Python异常检测- 单类支持向量机(…

常见Transformer位置编码

文章目录 概述绝对位置编码相对位置编码T5 BiasALiBiRoPE 参考资料 概述 相对于RNN这样的序列模型来说&#xff0c;Transformer可并行是一个很大的优势&#xff0c;但可并行性带来一个问题&#xff0c;由于不是从前到后&#xff0c;所以模型对于位置信息是不敏感的。于是在Tra…

【IEEE出版 | EI稳定检索】2024智能机器人与自动控制国际学术会议 (IRAC 2024,11月29-12月1日)

2024智能机器人与自动控制国际学术会议 &#xff08;IRAC 2024&#xff09; 2024 International Conference on Intelligent Robotics and Automatic Control 官方信息 会议官网&#xff1a;www.icirac.org 2024 International Conference on Intelligent Robotics and Autom…