RTOS的稳定运行依赖于内核对资源的精准控制。本文聚焦任务调度与内存管理两大基础功能,解析抢占式调度如何保障高优先级任务及时响应,以及静态分配、动态内存池如何避免碎片化,确保系统长期运行的可靠性。

一、概述

rtos 库是 LuatOS 中用于管理底层操作系统资源、硬件信息及实时任务的系统级工具库,提供消息队列处理、定时器控制、设备信息查询、内存管理、固件标识及路径配置等功能。

二、核心示例

1、核心示例是指:使用本库文件提供的核心 API,开发的基础业务逻辑的演示代码;

2、核心示例的作用是:帮助开发者快速理解如何使用本库,所以核心示例的逻辑都比较简单;

三、常量详解

核心库常量,顾名思义是由 LuatOS 内核固件中定义的、不可重新赋值或修改的固定值,在脚本代码中不需要声明,可直接调用;

每个常量对应的常量取值仅做日志打印时查询使用,不要将这个常量取值用做具体的业务逻辑判断,因为LuatOS内核固件可能会变更每个常量对应的常量取值;

如果用做具体的业务逻辑判断,一旦常量取值发生改变,业务逻辑就会出错;

rtos 核心库没有常量。

四、函数详解

rtos.timer_start(id,timeout,repeat)

功能

启动一个定时器(这个 api 只给 sys 核心库使用,如果需要软件定时器功能,可以直接使用 sys 核心库中的 timer 接口)

参数

id

timeout

repeat

返回值

local result = rtos.timer_start(id,timeout,repeat)

result

示例

rtos.timer_stop(id)

功能

关闭并释放一个定时器(这个 api 只给 sys 核心库使用,如果需要定时器功能,可以直接使用 sys 核心库中的 timer 接口)

参数

id

返回值

nil

示例

rtos.reboot()

功能

设备重启

参数

nil

返回值

nil

示例

rtos.buildDate()

功能

获取内核固件编译日期

参数

nil

返回值

local result = rtos.buildDate()

result

示例

rtos.bsp()

功能

获取硬件 bsp

780E/EP/EPV, 固定返回 EC618

780EPM, 及衍生的EC718PM模组, 均为具体模组型号

780EHM, 及衍生的EC718PM模组, 均为具体模组型号, 除了Air8000

Air8000, 固定返回 Air8000

Air8101, 返回模组型号

Air1601, 当前固定返回Air1601,目前读不到模组型号

不要根据rtos.bsp()来判断具体的模组型号,如果需要判断模组的具体型号请使用hmeta.model()

参数

nil

返回值

local bsp = rtos.bsp()

bsp

示例


rtos.version(more)

功能

获取内核固件版本号

参数

more

返回值

若只需获取固件版本号,只有一个返回值version

local version = rtos.version()

若需要获取固件版本号以及固件数字版本号,有两个返回值version和version_num

local version, version_num = rtos.version(more)

version

version_num

示例

rtos.meminfo(type)

功能

获取内存信息

1.虚拟机内存内存直接关联 Lua 虚拟机的内存使用,包括 Lua 脚本中变量、函数、表、字符串等动态分配的内存,以及 Lua GC 管理的堆空间,用户可用来关注内存泄漏。 2.系统内存涵盖系统级内存资源,包括内核堆(Heap)、任务栈、中断栈、驱动缓冲区等,用户在 Lua 脚本底层硬件操作:如 GPIO、UART、I2C 等驱动程序的内存分配。 系统级任务:如任务调度、中断处理、消息队列等会用到系统内存。

3.psram 内存针对外接的伪静态随机存取存储器,Lua 脚本使用大容量数据缓存(如图像/音频处理)、网络通信(TCP/UDP/OTA)在接收大文件时会用到 psram 内存。

参数

type

返回值

local total_lua, used_lua, max_used_lua = rtos.meminfo(type)

total_lua

used_lua

max_used_lua

示例

rtos.firmware()

功能

返回内核固件名称,格式为 LuatOS_$VERSION_$BSP,可用于 OTA 升级判断底层信息

参数

nil

返回值

local result = rtos.firmware()

result

示例

rtos.setPaths(pathA, pathB, pathC, pathD)

功能

设置自定义 lua 脚本搜索路径,优先级高于内置路径,按 pathA → pathB → pathC → pathD 的顺序搜索脚本

可用于

多模块项目开发

当项目包含多个功能模块(如传感器驱动、网络通信、业务逻辑),且各模块的 Lua 脚本分散在不同目录时,可通过 rtos.setPaths 指定模块路径。

2.动态加载外部脚本

设备需从外部存储(如 SD 卡、SPI Flash)动态加载脚本时,通过路径配置实现灵活加载。

参数

pathA

pathB

pathC

pathD

返回值

nil

示例

rtos.nop()

功能

空函数,什么都不做

参数

nil

返回值

nil

示例

rtos.autoCollectMem(period, warning_level, force_level)

功能

内存自动收集配置,是 lua 本身内存收集机制的一种补充,不是必要的,而且只在 luavm 空闲时触发

通过设置自动回收周期定期触发内存收集,并在已用内存大于等于阈值时强制执行完整 GC,避免 Lua 原生 GC 因惰性触发导致的延迟。两者协同工作:RTOS 负责主动监控和紧急干预,Lua GC 处理常规清理。 主动回收触发条件(按优先级)

强制回收触发条件 :

内存使用率达到或超过 force_level 设定值

计算公式: (已使用内存 * 100) ≥ (总内存 * force_level)

触发时立即执行两次内存回收(因userdata需要第二次才能完全回收)

不受period参数限制,只要系统空闲就会检查并执行

周期性警戒回收触发条件 :

系统连续空闲达到 period 设定的消息接收次数

且内存使用率达到或超过 warning_level 设定值

计算公式: autogc_counter ≥ period 且 (已使用内存 * 100) ≥ (总内存 * warning_level)

触发时立即执行两次内存回收

执行后计数器重置为0,重新开始计数

参数

period

warning_level

force_level

返回值

nil

示例

五、模组支持说明

目前我们主流模组都支持 rtos 核心库。

今天的内容就分享到这里了~

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐