同步操作将从 合宙Luat/LuatOS-NDK 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
LuatOS NDK(Native Development Kit,以下简称为NDK)是一种本地化接口(芯片硬件提供的原始接口)开发工具集。可以简单的理解为 使用C/C++开发的接口,可以在lua上直接调用。 对于商用的LuatOS系统,Lua虚拟机部分是闭源的,用户无法直接集成C/C++代码。NDK正是针对这一场景提供的解决方案,开发简单,容易上手,无需过多关注本地化实现部分。
NDK主要针对LuatOS闭源版本(例如LuatOS-Air/LuatOS-HMI/LuatOS-iRTU等)的以下几种场景:
当然开源版本的LuatOS理论上也可以使用,不过针对开源版本,更建议直接将库源码放到LuatOS源码中构建编译。
用户使用NDK将C代码编译成lib库后,和lua脚本文件一起打包下载到硬件中。LuatOS系统将lib库动态加载到内存中运行,并将lib库中提供的API接口注册到系统中。这样lua脚本就可以通过dl模块进行加载,并使用这类接口。
LuatOS-NDK(Native Development Kit) (gitee.com)
通过 http://erp.openluat.com/firm_customized 服务器定制支持NDK功能的固件,版本号>=3209
根据core版本是否支持float功能,选择对应的编译方式。编译结束会在build目录下生成user.lib
float版本编译: build_float.bat
非float版本编译: build.bat
使用luatools将build\user.lib、user\src\demo\scripts\main.lua testJson.lua和LuatOS-Air_V3209_RDA8910_RND_0x150000_TMP.pac 一起下载到模块中
通过 http://erp.openluat.com/firm_customized 服务器定制支持NDK功能的固件,版本号>=3209
以RTT COREMARK为例 (RT-Thread上的 MCU/CPU 性能测试小工具)
链接:https://github.com/RT-Thread/rtthread-apps.git
在examples路径下创建coremark文件夹(参考demo创建对应的工程文件)。
将core_list_join.c core_main.c core_matrix.c core_portme.c core_state.c coremark.h移到example\coremark\c\src\目录下
运行build.bat.
运行结果如下所示,coremark代码已经参与编译了,但是还有很多错误
添加rttread.h文件,并解决编译错误:(注:下方截图右边都是修改后的)
core_list_join.c core_matrix.c core_state.c core_util.c不做任何修改
core_main.c 修改如下:
coremark.h 修改如下:
其余的所有适配都放到rttread.h. 结果如下所示
再次编译start.bat文件,生成了user.lib 结果如下:
在example\coremark\c\src目录下新建lua_coremark.c 将coremark接口封装成lua接口给脚本调用。代码如下所示:
#include "core_api.h"
int lua_coremask(void *L)
{
/*coremark入口函数*/
extern int core_mark(void);
core_mark();
return 0;
}
luaL_Reg rtt_lib[] = {
{"coremark",lua_coremask},
{NULL, NULL}
};
#include "core_api.h"
/*入口函数*/
int user_main(void *L)
{
/*rtt coremark*/
extern luaL_Reg rtt_lib[];
luaI_openlib(L, "rtt", rtt_lib, 0);
}
PROJECT = "COREMARK"
VERSION = "1.0.0"
--加载日志功能模块,并且设置日志输出等级
--如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可
require "log"
LOG_LEVEL = log.LOGLEVEL_TRACE
require "sys"
--加个延迟防止开机太快log丢失
rtos.sleep(1000)
--通过dl.open接口加载user.lib文件,并执行user_main入口函数
--user_main入口函数会注册rtt coremark,然后使用rtt.coremark()进行接口调用
local handle = dl.open("/lua/user.lib","user_main")
if handle then
rtt.coremark()
dl.close(handle)
end
--启动系统框架
sys.init(0, 0)
sys.run()
可以通过AT指令AT*EXINFO?
查询死机信息,根据死机信息可以判定死机位置,便于调试和解决问题;测试demo中有添加了该AT指令,如果死机过程中没有死机信息上报,可手动发指令查询。
NDK死机信息:
AT*EXINFO?
*EXINFO:poweron=4,assert=func=/lua/user.lib,pc=5ba-line=0-ra=0
*EXINFO:poweron=4,assert=func=/lua/user.lib,pc=5ba-line=0-ra=0
OK
AT*EXINFO? true OK nil
如上示assert=func=/lua/user.lib
信息表明,死机位置位于user.lib
文件中,可以根据pc=5ba-line=0-ra=0
信息,在out/user.map
文件中找到5ba
所指位置处,定位导致死机的代码。
CORE死机信息:
AT*EXINFO?
*EXINFO:poweron=4,assert=func=-line=0-ra=0
*EXINFO:poweron=4,assert=func=-line=0-ra=0
OK
AT*EXINFO? true OK nil
如上示未标明/lua/user.lib
类似信息,即为底层死机
导致的原因: user.lib中undefFun1接口未定义
可能是dl.open 库的路径传入不对
可能是dl.open 入口函数名传入不对
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。