添加新库#
总的开发分成若干部分:
lua虚拟机的开发/优化
lua模块的开发
配套工具/功能的开发
本章主要描述如何开发一个lua模块
Lua 模块开发的组成部分#
分成几个必要的部分
模块的设计文档
模块的Lua API实现
模块的C API实现(平台抽象层)
产出物
文档若干
luat_lib_xxx.c 一份/多份
luat_xxx.h 一份/多份
luat_xxx_rtt.c/luat_xxx_freertos.c 一份
luat_demo_xxx.lua 可选
模块的设计文档#
文档的基本模板
# 标题
## 基本信息
## 为什么写这个功能 -- 实现什么功能
## 设计边界有哪些 -- 做什么, 不做什么
## Lua API -- 暴露给lua代码的api设计成怎样, 最好提供设想的代码
## C API -- 抽象平台层, 封装一下
Lua API 设计与实现#
Lua API, 是暴露给用户lua代码调用的API, 负责读取用户参数, 校验参数, 整理返回值.
通常分3种: 纯lua, 部分lua部分c, 纯c
当前我们设计和实现, 一般是纯C的实现, 它类似这样
int luat_lib_sys_run(Lua_State *L) {
luaL_checkXXX ; // 取参数
lua_sys_xxx ; // 调用C API
luaL_pushXXXX ; // 把返回值压入堆栈
return 2; // 返回值的个数
}
然后配套一个注册函数, 这个可以参考lua内置库, 例如 lmathlib.c
要求:
一般情况下只能调用luat_xxx 开头及系统函数
不要直接调用freertos/rt-thread/私有库的函数, 特殊情况特殊分析.
使用luat_heap_mallac分配内存为主,注意防范内存泄漏
可以不提供头文件
C API 设计与实现#
要求:
必须提供头文件,供Lua API/其他C API调用.
使用luat_heap_mallac分配内存为主,注意防范内存泄漏
设计的API应尽量屏蔽平台差异, 提供对外一致的观感
通过不需要传递
Lua_State *L
, 而是传递一个参数列表或数据结构
int luat_gpio_setup(luat_gpio_t conf) {
//平台相关的实现...
return 0; // ok or not
}