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

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

3天内不再提示

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

合宙LuatOS 来源:合宙LuatOS 作者:合宙LuatOS 2026-02-03 15:57 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

LuatOS 重新定义了嵌入式系统的开发范式——将 Lua 脚本作为主程序语言,构建起完整的系统架构。其设计原理围绕“脚本主导、C 层支撑”展开,通过在固件中嵌入 Lua 解释器,将硬件操作抽象为 API 接口,使开发者能用高级语言快速实现底层控制。这一设计显著提升了开发效率,同时保持了良好的运行性能。

一、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,和大家一起分析下源码设计;

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

审核编辑 黄宇

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

    关注

    5212

    文章

    20763

    浏览量

    338740
  • LuatOS
    +关注

    关注

    0

    文章

    179

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

    裁剪功能,适应不同规模的嵌入式项目需求。 一、LuatOS框架中的概念   在LuatOS中,有三个核心概念和一个调度器: 1、三个核心概念:任务(task),消息(message),
    的头像 发表于 02-03 15:56 370次阅读
    <b class='flag-5'>LuatOS</b> <b class='flag-5'>系统</b><b class='flag-5'>框架</b>的模块化设计原理

    LuatOS框架的使用(上)

    在资源受限的物联网终端设备中,如何实现快速开发与稳定运行是关键挑战。LuatOS框架通过将Lua语言与底层硬件抽象层深度融合,提供了一套简洁高效的开发范式。本文将围绕LuatOS框架
    的头像 发表于 01-27 19:38 475次阅读
    <b class='flag-5'>LuatOS</b><b class='flag-5'>框架</b>的使用(上)

    arm嵌入式主板优缺点

    Windows CE、Linux等主流的嵌入式操作系统。   ARM的优点   一、高可靠性、高稳定性:在工业控制领域,性能稳定可靠是自动控制基本的要求,ARM嵌入式主板有着很特殊的优势。第一
    发表于 01-08 07:08

    分享一个嵌入式开发学习路线

    技术,实现设备联网上传数据。 系统架构思维:理解企业级嵌入式开发的架构设计,如分层架构、模块化设计等。 实践建议:在STM32上移植Free
    发表于 12-04 11:01

    嵌入式系统软件架构通常划分

    嵌入式系统的软件架构通常划分如下分层设计: 应用层:环境温度监测、报警触发逻辑。 中间件层:支持MQTT协议的网络通信模块,用于将温度数据上传至云端。 操作系统层:基于FreeRTOS
    发表于 12-01 07:20

    CW32嵌入式软件开发的必备知识

    合适的数据结构和算法。 3 、计算机体系结构 了解处理器架构,如ARM、x86等,以及指令集和内存管理。 熟悉嵌入式系统的硬件组成,如微控制器、FPGA、DSP等。 可以很熟练地根据CW32
    发表于 11-28 07:48

    嵌入式软件分层架构设计原则

    嵌入式软件分层架构的设计原则如下: 模块化和可扩展性:每一层应当保持松耦合,这样当硬件变化或某些功能扩展时,只需要修改对应的层次,而不影响整体架构。 硬件无关性:上层代码应当尽量避免直接依赖硬件
    发表于 11-28 07:05

    嵌入式需要掌握哪些核心技能?

    : 1)C语言与底层编程 核心地位:C语言是嵌入式开发的基石,需精通指针操作、内存管理、位运算,直接操控硬件资源。 延伸技能:C++用于复杂项目架构设计,汇编语言优化底层性能(如启动代码、中断处理
    发表于 10-21 16:25

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

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

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

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

    海绵泡沫切割机嵌入式数控系统的硬件架构设计与核心

    嵌入式数控系统的硬件架构是海绵泡沫切割机稳定运行、精准控制的物理基础,其设计需围绕切割工艺需求,实现数据处理、指令执行、状态感知与外部交互的高效协同。整体架构以核心控制模块为中枢,联动
    的头像 发表于 09-11 09:12 951次阅读
    海绵泡沫切割机<b class='flag-5'>嵌入式</b>数控<b class='flag-5'>系统</b>的硬件<b class='flag-5'>架构设</b>计与核心

    油介质损耗及电阻率测试仪的嵌入式系统架构与抗干扰设计

    油介质损耗及电阻率测试仪的精准检测能力,不仅依赖于核心的电气测量模块与温控系统,更离不开稳定可靠的嵌入式系统作为“中枢神经”。嵌入式系统承担
    的头像 发表于 09-02 13:57 787次阅读
    油介质损耗及电阻率测试仪的<b class='flag-5'>嵌入式</b><b class='flag-5'>系统</b><b class='flag-5'>架构</b>与抗干扰设计

    BitsButton嵌入式按键处理框架

    配备了完整的按键测试用例,专为嵌入式C项目设计: 详情见:按键测试用例 ?️ 分层架构设计 核心层(core/): 测试框架基础设施和运行器 工具层(utils/): 模拟工具、时间控制、断言增强 测试
    发表于 08-02 11:24

    Linux嵌入式和单片机嵌入式的区别?

    Linux嵌入式与单片机嵌入式在多个方面存在显著的区别,以下是详细的比较和归纳: 一、基本概念 1. Linux嵌入式: 定义:将Linux操作系统运行在
    发表于 06-20 09:46

    聚徽解码——从嵌入式到模块化:国内工控平板的柔性技术架构设

    在工业 4.0 与智能制造蓬勃发展的浪潮下,国内工控平板作为工业自动化与智能化的关键设备,其技术架构设计正经历着从嵌入式到模块化的深刻变革。这一转变旨在赋予工控平板更强的柔性,使其能够更高效、灵活
    的头像 发表于 06-13 16:24 828次阅读