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

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

3天内不再提示

LuatOS 系统框架的模块化设计原理

青山老竹农 来源:jf_82863998 作者:jf_82863998 2026-02-03 15:56 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

LuatOS 的设计核心在于高度模块化与松耦合架构。系统将硬件驱动、通信协议、定时任务等封装为独立模块,通过统一的注册与回调机制接入主事件循环。这种设计不仅提升了代码复用率,也使得开发者可以按需裁剪功能,适应不同规模的嵌入式项目需求。

一、LuatOS框架中的概念

在LuatOS中,有三个核心概念和一个调度器:

1、三个核心概念:任务(task),消息(message),定时器timer)

2、一个调度器:sys.run()函数;

1.1 LuatOS任务(task)

1.1.1 FreeRTOS task和LuatOS task

wKgZPGmBiY-ARabLAAJsLrutcjQ621.png

从上面这张图中我们可以看到,有两种任务:

1、第一种是LuatOS内核固件中的任务,也就是FreeRTOS创建的任务;这种任务我们把它命名为FreeRTOS task;

2、第二种是LuatOS项目应用脚本中的任务,也就是用户脚本代码中调用sys.taskInit和sys.taskInitEx两个API创建的任务,这种任务我们把它命名为LuatOS task;严格意义上说,LuatOS task并不是真正的task,而是利用了Lua中的协程(coroutine)概念,来等价实现的一种task效果,因为task的受众面比协程的受众面要广的很多,所以我们在LuatOS中,将协程(coroutine)包装成了task的概念,这样更容易理解和使用;关于协程(coroutine)的知识,在本文接下来的内容中,我们会接触到。

在这里我使用一个形象的比喻,争取可以让大家更加直观的理解这两种任务的联系和区别:

1、有一个森林,这个森林就是FreeRTOS;

2、森林里生长了很多棵大树,每一棵大树都是FreeRTOS创建的一个任务,就是FreeRTOS task;

这些大树分成了两种:

a. 一种是长出了树干,树干上还有很多树枝,这一种大树只有一棵,就是Lua虚拟机任务

b. 一种是只长了光秃秃的树干,树干上没有树枝,这种大树有很多,除Lua虚拟机之外,其余所有任务都是这种大树

Lua虚拟机任务这棵大树的树干上长出的所有树枝,就是一个个的LuatOS task

根据以上描述画一张简图如下:

wKgZPGmBijyAfUsMAAKeBnk7oEw013.pngwKgZO2mBineAQjPcAAEZAMSbVeY517.png

1.1.2 两种LuatOS task(基础task和高级task)

怎么创建一个task,在sys核心库中提供了两个api:

sys.taskInit(task_func, ...)

sys.taskInitEx(task_func, task_name, non_targeted_msg_cbfunc, ...)

这两个api分别创建两种task,首先我们给这两种task起个名字,一种叫基础task,一种叫高级task;

sys.taskInit(task_func, ...)创建的task是基础task;

sys.taskInitEx(task_func, task_name, non_targeted_msg_cbfunc, ...)创建的task是高级task;

从设计原理的角度来看,基础task和高级task的区别是:

(1) 所有的基础task共享一个全局消息队列;

(2) 每个高级task都有自己独立的定向消息队列,同时又能使用全局消息队列;

wKgZO2mBirOADzFKAAK3Q-jfHMk965.png

1.1.3 LuatOS task内部运行环境和外部运行环境

在LuatOS应用脚本开发过程中,我们所编写的应用脚本代码,存在两种业务运行的逻辑环境:

1、一种是在task的任务处理函数内部的业务逻辑环境中运行,我们简称为:在task内部运行;

2、一种是在task的任务处理函数外部的业务逻辑环境中运行,我们简称为:在task外部运行;

怎么理解这两种业务逻辑运行环境?我们看下面这张图

看右边生长出分支的这棵大树,这棵大树就是FreeRTOS创建的Lua虚拟机task,是一个FreeRTOS task;

在这个Lua虚拟机FreeRTOS task上,这棵大树再分为两部分:

1、树干部分:树干部分运行的业务逻辑环境就是LuatOS task外部运行环境;

2、树枝部分:每个树枝都是一个独立的LuatOS task,树枝部分运行的业务逻辑环境就是LuatOS task内部运行环境;

在这里,大家只要知道有task内部运行和task外部运行两种环境即可,接下来我们下面讲解内部设计原理时,会进一步去学习理解;

1.1.4 LuatOS task状态切换

wKgZO2mBiyKAZm_cAAFMuQgvdCs338.png

1.2 LuatOS消息(message)

LuatOS 的消息机制是LuatOS task协作和事件驱动编程的核心部分,消息机制包括消息的发布和订阅处理、消息的发送和接收处理;

1.2.1 三种消息队列

消息需要存储到消息队列中,消息队列中的消息遵循先进先出(FIFO)原则;

wKgZPGmBi16AUu_RAAK8X7n7vys045.png

内核消息队列

FreeRTOS创建的每一个task都有一个消息队列,这种消息队列就叫做内核消息队列;

内核消息队列是FreeRTOS直接管理的,存储每个FreeRTOS task内核消息的队列;

LuatOS应用全局消息队列

所有LuatOS task应用共享一个消息队列,这个消息队列就叫做LuatOS应用全局消息队列;

LuatOS应用全局消息队列是LuatOS虚拟机直接管理的;

LuatOS基础task可以接收处理这个消息队列中的消息,LuatOS高级task可以接收处理这个消息队列中的消息;

LuatOS外部运行环境中的业务也可以接收处理这个消息队列中的消息;

LuatOS应用定向消息队列

每个LuatOS 高级task都有一个消息队列,这个消息队列就叫做LuatOS应用定向消息队列;

LuatOS应用定向消息队列是LuatOS虚拟机直接管理的;

每个定向消息队列和一个LuatOS高级task存在唯一的绑定关系;

只有绑定的LuatOS高级task才可以接收处理这个消息队列中的消息;(虽然从源码设计上看,所有的LuatOS高级task都可以接收处理定向消息队列中的消息,但是这样使用的话,理解起来会比较混乱)

1.2.2 六种消息

根据消息存储使用的消息队列类型以及消息发送方的不同,可以把消息划分为以下六类:

wKgZO2mBi7aAC-gHAAQWqQSKpEQ989.png

1.3 LuatOS定时器(timer)

对于LuatOS应用程序来说,定时器本质上也算是一种特殊的消息,因为定时器太常用了,所以把他单独拎出来,单独的一个章节进行讲解;

定时器分类如下图所示:

wKgZO2mBi_iASzZZAAO4VMTsOBA005.png

1.4 LuatOS调度器(sys.run())

sys核心库是LuatOS应用程序运行的核心大脑,sys.run()是sys核心库的大脑,负责整个LuatOS应用脚本程序的调度和管理,是LuatOS应用程序的调度器;

sys.run()非常重要,但是sys.run()使用起来非常简单,仅仅在main.lua的最后一行调用sys.run()即可。

虽然sys.run()使用起来非常简单,但是如果大家对sys.run()的运行原理有一个总体性的理解和认识,对开发LuatOS应用项目来说,帮助很大。

所以在这里,我先对sys.run()内部的工作原理做一个简化后的总体介绍,至于更详细的原理介绍,我们会在下面进行详细讲解;

wKgZO2mBjNCARrPYAAH-Ou866mU468.png

我们看上面这张图:

1、LuatOS内核固件中的FreeRTOS会创建一个Lua虚拟机任务;

2、Lua虚拟机任务的处理函数中,首先进行初始化:

在内核固件的C代码中,加载Lua标准库和LuatOS核心库;

从LuatOS的脚本分区找到main.lua

开始逐行嵌套解析执行main.lua中的脚本代码(加载必要的扩展库脚本文件和自己开发的应用脚本文件,并且运行这些脚本文件的初始化代码)

3、运行main.lua的最后一行代码sys.run()

4、sys.run()中的实现是一个while true循环,在这个循环内,不断地从内核消息队列和LuatOS应用消息队列中读取消息,并且分发消息给接收者进行处理。

wKgZPGmBjRaAZ1vUAAK8eZtwn8U761.png

二、sys.lua源码分析方法

通过本文前三部分的描述,我们对LuatOS运行框架的基础理论知识做了简单的回顾;

接下来我们进入本讲的重点内容:学习理解LuatOS运行框架的内部设计源码;

sys核心库是LuatOS运行框架库,是LuatOS应用程序运行的核心大脑;

我们要深入学习LuatOS框架的内部设计原理,就是要深入学习sys核心库的内部设计实现原理;

sys.lua源文件是sys核心库的代码实现,点击这里可以看到sys.lua源码;

所以本讲课程中,我们接下来会重点分析sys.lua的源码实现;通过分析sys.lua源码,从而来学习理解LuatOS框架的设计原理;

sys.lua是sys核心库的内部实现;

说到核心库,我们再来回顾一下LuatOS软件架构,如下图所示:

wKgZO2mBjaWASeQEAAJXLPzmRyg030.png

之前我们讲述LuatOS软件架构时,当时有说,LuatOS核心库是用C语言开发的,这个描述并不准确,在核心库中,有一个特例,就是sys核心库,这个核心库是用Lua语言开发的,并且源码也开放了;

虽然sys核心库是用Lua语言开发的,但是它还是一个核心库,在编译内核固件的时候,会把sys.lua源文件集成到编译好的内核固件中对外发布;

我们今天采用以下方式来学习sys.lua源码设计:

1、在目前的sys.lua源文件中增加详细的注释和运行日志,分析代码设计

2、使用LuatOS PC模拟器,运行demo代码+第1步增加运行日志的sys.lua,通过分析运行日志,进一步理解sys.lua的设计原理

在模拟器上运行demo代码的方法,

本讲中使用的demo代码参考luatos_framework;模拟器运行时的命令如下:

wKgZPGmBjhqAWcEDAAA6oomrQzc968.png

要深入理解LuatOS框架的设计原理,其实就是深入学习sys.lua中的以下几个概念:

1、一个调度器:sys.run()

2、三个概念:任务(task),消息(message),定时器(timer)

3、五张表:

高级task任务列表(taskList)

全局消息订阅表(subscribers),全局消息队列(messageQueue)

定时器处理表(timerPool),定时器回调函数参数表(para)

三、LuatOS 调度器(sys.run())内部设计

LuatOS调度器sys.run函数的主体处理逻辑参考下图中黄色背景部分

wKgZO2mBjpWAJZQxAAIq4SJaDGg666.png

从这张图可以看出,在LuatOS内核固件中有一个FreeRTOS,FreeRTOS运行起来之后,创建了很多任务,有软件定时器任务,TCP/IP协议栈任务,文件系统任务,Lua虚拟机任务等。

其中Lua虚拟机任务和LuatOS项目的应用软件关系最为密切;

Lua虚拟机任务运行起来之后,经过必要的初始化动作,就会去寻找main.lua脚本文件,找到之后,从main.lua的第一行代码开始解析执行,main.lua会执行必要的初始化动作并且加载运行其他的Lua脚本应用功能模块,main.lua的最后一行代码为sys.run(),sys.run()是一个while true的循环函数,实际上也是Lua虚拟机任务的处理函数;

在这个while循环里面,不断的分发处理各种消息,调度LuatOS项目应用软件的正常运行。

现在,我们一起看下刚才描述的这个过程的源码,在阅读源码之前,我们先看下面这张框图,描述了主要源码函数和代码段的调用过程:

wKgZPGmBjtWAdysXAAGFC8OY5Ec033.png

四、LuatOS 任务(task)内部设计

4.1 sys.taskInit(创建并且运行基础task)

wKgZO2mBjxCAWb4MAAAm8ho_JDE448.png

4.1.1 源码分析

wKgZO2mBj2iAZStyAAEIT2Js2KY315.png


我们接下来再看sys.coresume(co, ...)的源码

wKgZPGmBj5eAML1cAAbom9P6ocs010.png

通过分析sys.taskInit这个api的源码,我们可以看出,LuatOS的task概念,实际上是对Lua语言的协程(coroutine)概念的一层封装,因为task的受众面比协程的受众面要广的很多,所以我们在LuatOS中,将协程(coroutine)包装成了task的概念,这样更容易理解和使用;

4.1.2 Lua语言中协程(coroutine)概念的理解

在LuatOS的sys.lua中,把Lua中的协程概念包装成了task概念,来实现多任务的编程效果;

所以我们要想深入理解sys.lua中的内部设计,势必要对Lua语言中的协程概念有一个基本的认识;

在 Lua 语言中,协程(coroutine)是一种用户态的轻量级线程,它允许程序在执行过程中暂停和恢复,从而实现协作式的多任务处理。与操作系统的线程不同,协程的调度完全由程序自身控制,而非由操作系统内核调度;

1、在LuatOS的sys.lua中,仅仅关注协程的三种状态:

挂起(suspended)状态,以下两种情况,协程处于挂起状态:

coroutine.create(f)创建协程后,未主动运行这个协程;

协程运行过程中,被本协程内部调用coroutine.yield(...)暂停;

运行(running)状态

处于挂起状态的协程co,在此协程外执行coroutine.resume(co[, ...])则恢复为运行状态;

死亡(dead)状态:以下两种情况,协程处于死亡状态:

协程正常运行结束;

协程运行过程中出现异常结束;

2、协程的核心特点

协作式:协程必须主动让出执行权(通过调用coroutine.yield(...)),其他协程才有机会运行。

状态保留:协程暂停挂起时会保存当前执行状态(如变量、栈),恢复时从暂停处继续。

wKgZO2mBkLKAMXdtAAD-5bYOZ6o893.png


4.1.3 应用示例

针对刚才对sys.taskInit源码的分析,接下来我们一起在模拟上运行一个demo示例,加深一下对sys.taskInitapi内部设计的理解;

核心代码片段如下(重点关注黄色背景的代码):

main.lua

wKgZO2mBkPKATbizAABuEHPPQxE635.png

scheduling.lua

wKgZPGmBkRSARY5PAAFPmMVhx-A820.png

首先我们分析一下,在这个demo示例中,使用sys.taskInit(task1_func)创建的任务,任务处理函数的task1_func()的源码+sys.lua源码,分析下代码是如何调度运行的;

接下来我们使用模拟器,针对以下几种场景,实际跑一下这个demo示例看看运行效果:

模拟器运行指令如下:

wKgZPGmBjhqAWcEDAAA6oomrQzc968.png

1、打开 scheduling.lua中的count = count + "hdjks"

最终运行的核心日志为

wKgZPGmBkYiAdgddAALI81AixbA234.png

2、打开 scheduling.lua中的count = count + "hdjks"

sys.lua中的return wrapper(arg[1], coroutine.resume(...))修改为return coroutine.resume(...)

最终运行的核心日志为

wKgZO2mBkceABLB2AAKA9VzUS4M612.png

3、打开 scheduling.lua中的count = count + "hdjks"

打开main.lua中的

_G.COROUTINE_ERROR_ROLL_BACK = false

_G.COROUTINE_ERROR_RESTART = false

最终运行的核心日志为

wKgZPGmBkguAYiUYAAQGJk-9I50412.png

4.2 sys.taskInitEx(创建并且运行高级task)

wKgZO2mBknaABM2PAAA2NscA1nI447.png


4.2.1 数据结构(taskList)

wKgZO2mBkpCAR_0uAAJC3io3w5M264.png


4.2.2 源码分析

wKgZO2mBlkWALZvSAAIgTzymLu8480.png


从上面这段代码可以看到,使用sys.taskInitEx创建一个高级task,和使用sys.taskInit创建一个基础task相比,最核心的区别是多申请了一个高级task全局信息表{msgQueue={}, To=false, cb=cbFun},这个全局信息表是高级task处理定时器消息和定向消息的关键;下图中高级task指向的定向消息队列,对应的就是高级task全局表中的msgQueue={}

wKgZO2mBlmyAadW3AAIvynXarPg150.png

4.2.3 应用示例

使用sys.taskInitEx创建一个高级task,和使用sys.taskInit创建一个基础task相比,最核心的区别是多申请了一个高级task全局信息表{msgQueue={}, To=false, cb=cbFun},其余实现原理和sys.taskInit完全相同,所以此处不再对sys.taskInitEx结合实际的demo示例来进一步理解了;

在后续的消息和定时器章节会进一步深入演示学习。

4.3 sys.taskDel(清除高级task的内存资源)

wKgZPGmBlraAGWKRAAAl2l2B6EQ538.png


4.3.1 源码分析

wKgZO2mBlwqAM1NHAAPwQAdAMMc936.png


4.3.2 应用示例

针对刚才对sys.taskDel源码的分析,接下来我们一起在模拟上运行一个demo示例,加深一下对sys.taskDelapi内部设计的理解;

核心代码片段如下(重点关注黄色背景的代码):

main.lua

wKgZO2mBkPKATbizAABuEHPPQxE635.png

memory_task_delete.lua

wKgZPGmBl3SAZE41AAEnneGfehk404.png

接下来我们使用模拟器,针对以下三种场景,实际跑一下这个demo示例看看运行效果:

1、打开 memory_task_delete.lua中的sys.taskDel("led_task")

关闭 memory_task_delete.lua中的dhjsk = las + 2

关闭main.lua中的

_G.COROUTINE_ERROR_ROLL_BACK = false

_G.COROUTINE_ERROR_RESTART = false

最终运行的核心日志为

wKgZPGmBl8WAZ8vcAAGpw_JfXvs640.png

2、关闭 memory_task_delete.lua中的sys.taskDel("led_task")

关闭 memory_task_delete.lua中的dhjsk = las + 2

关闭main.lua中的

_G.COROUTINE_ERROR_ROLL_BACK = false

_G.COROUTINE_ERROR_RESTART = false

最终运行的核心日志为

wKgZO2mBl_WAJxDiAAITTmMYS6k902.png

3、打开 memory_task_delete.lua中的sys.taskDel("led_task")

打开 memory_task_delete.lua中的dhjsk = las + 2

打开main.lua中的

_G.COROUTINE_ERROR_ROLL_BACK = false

_G.COROUTINE_ERROR_RESTART = false

最终运行的核心日志为

wKgZPGmBmCmAXw2xAAKKolUdnKQ152.png

4、打开 memory_task_delete.lua中的sys.taskDel("led_task")

打开 memory_task_delete.lua中的dhjsk = las + 2

关闭main.lua中的

_G.COROUTINE_ERROR_ROLL_BACK = false

_G.COROUTINE_ERROR_RESTART = false

最终运行的核心日志为

wKgZO2mBmFaAJ0heAAJJhuP9CGM925.png

通过这个demo示例,我们可以看出sys.taskDel函数对于内存释放的作用,目前的LuatOS设计,只需要记住一点就行了:

高级task的任务处理函数中,在调用return语句返回前,或者任务处理函数的最后一行代码,调用sys.taskDel即可;


五、LuatOS 定时器(timer)内部设计

5.1 数据结构(timerPool和para)

wKgZO2mBmJiAGCdVAAMXX8wzXUk076.png

5.2 api源码分析

现在,我在vscode上打开已经添加了详细注释的sys.lua,对以下每个api的源码进行分析(仅分析和定时器有关的源码部分),为了让大家对定时器的使用有一个更全局的认识,所以也会分析一部分LuatOS仓库中开源的内核C代码:

wKgZO2mBmPKAVr8IAAFoYufKDvI474.png

下面列举的函数调用栈,供分析源码时参考使用:

Lua->C:sys.timerStart,sys.timerLoopStart,sys.wait,sys.waitUntil,sys.waitMsg->rtos.timer_start

C: l_rtos_timer_start->luat_timer_start->xTimer接口

C:luat_timer_callback->luat_msgbus_put

Lua->C->Lua:sys.run->rtos.receive->luat_msgbus_get->l_timer_handler(返回rtos.MSG_TIMER,timer_id, repeat三个参数)

5.3 完整业务处理过程

wKgZO2mBmS6AVzjCAAKikooDprs543.png

5.4 应用示例

刚才我们已经分析了和定时器操作有关的sys.lua源码,在本讲的最后一章,我会基于一个实际的MQTT demo项目,逐行分析项目中应用脚本源码和sys.lua源码,让大家在实际的项目中深刻理解LuatOS运行框架中的消息设计原理;

六、LuatOS 消息(message)内部设计

6.1 数据结构(subscribers和messageQueue)

wKgZO2mBmZiAaaB9AAHhhLWS8i8240.png

下图中的全局消息队列,对应的就是messageQueue ={}

wKgZO2mBmdyALdtmAAIvpsP02x0833.png

6.2 api源码分析

现在,我在vscode上打开已经添加了详细注释的sys.lua,对以下每个api的源码进行分析(仅分析和消息处理有关的源码部分),为了让大家对消息的使用有一个更全局的认识,所以也会分析一部分LuatOS仓库中开源的内核C代码:

wKgZPGmBmgqAQyrDAAFsKWPZEhw103.png

在这些api中,消息的发送和接收api容易混用,组合使用关系参考下表(每一行的两个单元格所表示的api必须组合使用):

wKgZPGmBmjGAQhP1AABI_NHIh38701.png

下面列举五种消息应用场景的完整业务处理过程:

6.3 内核非定时器消息完整业务处理过程(以 串口接收到新数据消息 为例)

wKgZO2mBml2AXuMAAAFj4ybhZWM578.png

1、uart.on(1, "receive", recv_cb)->l_uart_on

2、luat_irq_uart_cb->luat_msgbus_put

3、sys.run()->rtos.receive->luat_msgbus_get->l_uart_handler(在这里执行执行uart.on注册的回调函数recv_cb,然后返回空数据,sys.lua中的rtos.receive返回值为nil)

6.4 系统应用全局消息完整处理过程(以"IP_READY"为例)

wKgZPGmBmpaAb6enAAHDW_dWS24284.png


在用户脚本代码中,根据具体的业务逻辑,订阅全局消息"IP_READY"

当某一种网卡网络环境准备就绪时,在内核固件的netif_ip_event_cb中,主动调用sys.lua中定义的_G.sys_pub = sys.publish,实际上就是调用sys.publish发布一条全局消息"IP_READY",存储到sys.lua中的全局消息表messageQueue中

在sys.lua中,消息分发处理:sys.run->dispatch

6.5 用户应用全局消息完整处理过程

wKgZO2mBmtyAWh1bAAGlWb1GrBg662.png


在用户脚本代码中,根据具体的业务逻辑,订阅全局消息

在用户脚本的代码,调用sys.publish发布全局消息

在sys.lua中,通过sys.run调度器,执行dispatch分发处理全局消息

6.6 系统应用定向消息完整处理过程(以socket.EVENT为例)

wKgZO2mBmweAbfK9AAGwYqfehME736.png


l_socket_callback,当内核固件中的某一个socket产生异步事件时(例如socke接收到新数据),主动调用sys.lua中定义的_G.sys_send = sys.sendMsg,实际上就是调用sys.sendMsg给指定Lua脚本中的高级task发送一条定向消息,存储到此高级task对应的定向消息队列taskList[task_name].msgQueue中

在用户脚本代码中,通过sys.waitMsg去处理定向消息

6.7 用户应用定向消息完整处理过程

wKgZO2mBmzuAQHguAAHiIkfImGQ786.png

1、在用户脚本代码中,调用sys.sendMsg发送定向消息

2、在用户脚本代码中,调用sys.waitMsg处理定向消息

6.8 应用示例

刚才我们已经分析了和消息操作有关的sys.lua源码,在本讲的最后一章,我会基于一个实际的MQTT demo项目,逐行分析项目中应用脚本源码和sys.lua源码,让大家在实际的项目中深刻理解LuatOS运行框架中的消息设计原理;

七、基于MQTT demo项目,再次全面理解LuatOS框架的内部设计运行原理

讲到最后,我会基于一个实际的MQTT demo项目,逐行分析项目中应用脚本源码和sys.lua源码,让大家在实际的项目中深刻理解LuatOS运行框架的内部设计原理;

7.1 demo项目总体设计框图

demo项目的总体设计框图如下:

wKgZPGmBm4aAcVzIAAIzRml1dvs627.png

7.2 demo项目源码+sys.lua源码综合分析

这个mqtt demo代码中的注释比较详细,sys.lua代码注释也比较详细,接下来我用vscode直接打开这份demo项目和sys.lua,和大家一起分析下源码设计;

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

审核编辑 黄宇

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

    关注

    0

    文章

    360

    浏览量

    22857
  • LuatOS
    +关注

    关注

    0

    文章

    179

    浏览量

    2767
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    美的与吉宝携手推出AI智能模块化制冷解决方案,覆盖亚洲市场

    。   Signing Ceremony 本次合作为非排他性合作。美的楼宇科技在暖通空调制造及智能楼宇系统领域的技术能力,将与吉宝在"制冷即服务"(Cooling-as-a-Service, CaaS)及数字优化方面的优势深度融合,共同推动标准
    的头像 发表于 04-15 16:39 237次阅读
    美的与吉宝携手推出AI智能<b class='flag-5'>模块化</b>制冷解决方案,覆盖亚洲市场

    即插即用 DAQ 设备与模块化 DAQ 系统的概念解析

    数据采集(DAQ)技术在科研教育、工业制造、环境监测、生命科学、能源和通讯等领域,扮演着至关重要的角色。即插即用的DAQ设备和模块化DAQ系统因其各自独特的优势而备受青睐。本文将探讨即插即用DAQ
    的头像 发表于 03-30 17:31 253次阅读
    即插即用 DAQ 设备与<b class='flag-5'>模块化</b> DAQ <b class='flag-5'>系统</b>的概念解析

    Energy Vault与Crusoe宣布达成战略框架协议,部署Crusoe Spark模块化AI工厂机组以交付Crusoe Cloud云服务

    Crusoe今日宣布达成战略框架协议,将在Energy Vault位于德州斯奈德的技术中心分阶段部署Crusoe Spark模块化数据中心。
    的头像 发表于 02-14 16:06 1.6w次阅读

    LuatOS 框架的嵌入式系统架构设计原理

    LuatOS 重新定义了嵌入式系统的开发范式——将 Lua 脚本作为主程序语言,构建起完整的系统架构。其设计原理围绕“脚本主导、C 层支撑”展开,通过在固件中嵌入 Lua 解释器,将硬件操作抽象为
    的头像 发表于 02-03 15:57 321次阅读
    <b class='flag-5'>LuatOS</b> <b class='flag-5'>框架</b>的嵌入式<b class='flag-5'>系统</b>架构设计原理

    解锁:LuatOS框架的使用(下篇)

    接上一篇 2.3 LuatOS 的定时器(timer) 对于 LuatOS 应用程序来说,定时器本质上也算是一种特殊的消息,因为定时器太常用了,所以把他单独拎出来,单独的一个章节进行讲解
    的头像 发表于 01-28 13:18 353次阅读
    解锁:<b class='flag-5'>LuatOS</b><b class='flag-5'>框架</b>的使用(下篇)

    LuatOS框架的使用(上)

    环境搭建、模块调用到任务调度,全面解析其开发流程与最佳实践。 本篇文章主要讲LuatOS 框架LuatOS 框架是整个
    的头像 发表于 01-27 19:38 475次阅读
    <b class='flag-5'>LuatOS</b><b class='flag-5'>框架</b>的使用(上)

    模块化高精度铷原子钟存在的意义

    ”到“可重构系统”的跨越,为现代高精度时频应用提供了全新模式。 一、模块化设计的本质突破:从“整机”到“模块” 一般铷原子钟的功能集成度高且采用整机形式,而SYN3306的模块化架构可
    的头像 发表于 01-21 19:09 314次阅读

    鼎阳科技推PXIe模块化示波器、PXIe模块化矢量网络分析仪产品组合,构建新一代模块化、软件定义的测试平台

    、卓越性能与灵活的系统集成能力,这三款产品进一步丰富了公司的产品矩阵,为通信、新能源、半导体等领域的研发与生产测试提供更灵活高效的解决方案。 模块化数字示波器 高分辨率模块化示波器 鼎阳MS高分辨率
    的头像 发表于 01-14 10:35 6.6w次阅读
    鼎阳科技推PXIe<b class='flag-5'>模块化</b>示波器、PXIe<b class='flag-5'>模块化</b>矢量网络分析仪产品组合,构建新一代<b class='flag-5'>模块化</b>、软件定义的测试平台

    掌握LuatOS系统消息:新手也能看懂的列表详解

    视角出发,用通俗语言解析其工作原理与配置方法。此处列举了LuatOS框架中自带的系统消息列表。   一、sys   文档链接:https://docs.openluat.com/osapi/core
    的头像 发表于 01-13 18:12 287次阅读
    掌握<b class='flag-5'>LuatOS</b><b class='flag-5'>系统</b>消息:新手也能看懂的列表详解

    新品发布|LRM模块化高速连接器

    认证发明专利。该款连接器是一种模块化、高性能高速率的系统连接器产品,多腔体模块化设计可以支持多种信号类型,射频、高频高速、光信号及电源的混合传输,不同的腔体可以灵
    的头像 发表于 10-20 17:02 2486次阅读
    新品发布|LRM<b class='flag-5'>模块化</b>高速连接器

    LuatOS脚本开发入门:嵌入式运行框架全解析!

    想搞懂LuatOS如何运行Lua脚本?本文深入剖析其嵌入式运行框架,涵盖虚拟机加载、任务协程、系统初始等关键环节,适合初学者。 一、LuatOS
    的头像 发表于 09-26 17:45 721次阅读
    <b class='flag-5'>LuatOS</b>脚本开发入门:嵌入式运行<b class='flag-5'>框架</b>全解析!

    嵌入式开发新选择:LuatOS脚本框架入门教程

    LuatOS正成为嵌入式开发的新趋势!本教程带你从基础入手,全面了解其基于Lua的脚本开发模式与轻量级运行框架。 一、LuatOS 编程起步 1.1 底层固件怎么启动 LuatOS
    的头像 发表于 09-26 17:34 856次阅读
    嵌入式开发新选择:<b class='flag-5'>LuatOS</b>脚本<b class='flag-5'>框架</b>入门教程

    新品推荐|模块化集成式高速连接器

    是一种模块化、高性能高速率的系统连接器产品,多腔体模块化设计可以支持多种信号类型,射频、高频高速、光信号及电源的混合传输,不同的腔体可以灵活配置不同功能模块。01
    的头像 发表于 07-07 18:15 1840次阅读
    新品推荐|<b class='flag-5'>模块化</b>集成式高速连接器

    鸿蒙5开发宝藏案例分享---模块化设计案例分享

    鸿蒙模块化开发大揭秘!官方隐藏案例实战指南 大家好呀! 最近在HarmonyOS文档里挖到一个宝藏——官方其实藏了大量模块化设计案例!很多小伙伴可能没注意到,今天我就带大家手把手拆解这些黄金实践,附
    发表于 06-12 16:17

    原理图模块化,BOM 物料位号处理

    原理图模块化,把常用的模块保存成一个PART(在TOOL 菜单下 选择 Generate Part)。保存成OLB格式。使用的时候,就像使用元器件一样,从库里面拖出来直接放到原理图上即可。 问题是
    发表于 06-09 19:27