干货 | LuatOS BSP移植教程,简单到复制粘贴!!!

Posted 合宙Luat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了干货 | LuatOS BSP移植教程,简单到复制粘贴!!!相关的知识,希望对你有一定的参考价值。


作者简介:

梦程——、B站科技区UP主,是一位思维敏捷而又热心分享的00后新生代科技爱好者和开发者,尤喜探索新事物。

目前小梦老师正在做ESP32的LuatOS分支,特别总结经验推出本篇LuatOS BSP移植教程,方便大家快速上手。



干货 | LuatOS BSP移植教程,简单到复制粘贴!!!

LuatOS本着自身的开源特性,可以很轻松的嵌入到很多微处理器和微控制器。今天简要讲下如何移植这套系统,上手比较简单,看完基本就会了。

要想做移植,就要先了解需要移植芯片的SDK,LuatOS依赖于FreeRTOS/RTT这类RTOS系统。如果要移植的芯片SDK中用的有RTOS,那么恭喜你,可以很轻松的将LuatOS移植到芯片上。

我给大家准备了配套的移植模板,请根据Github/Gitee上的模板看这篇移植教程:

https://github.com/dreamcmi/luatos-bsp-example

https://gitee.com/dreamcmi/luatos-bsp-example

本教程主体分为初探、进阶两个部分,下面开始正式讲解。


第一部分:初探

01 编译环境的集成






这是最开始的一步,就是将Lua虚拟机部分集成进芯片,我们要做的就是Ctrl+C、Ctrl+V。要想运行LuatOS,就要把核心的Lua虚拟机部分集成进去

下面就开始步骤讲解:

1)使用芯片的SDK建立一个空白的工程;

2)将LuatOS仓库里的lua文件夹和luat文件夹复制到新建好的工程里面。

干货 | LuatOS BSP移植教程,简单到复制粘贴!!!

这里根据上图再简要说明一下,lua文件夹里面的文件可以直接复制,luat文件夹里面要复制的有三个部分:

  • FreeRTOS或者RTT,这个是调用RTOS的接口,如果芯片使用的是这两种直接复制即可。

    如果是freertos, 使用现成的 luat/freertos 目录下的代码, 否则需要实现luat_msgbus.h 和 luat_timer.h;

  • include文件夹,这是头文件所在的地方;

  • modules文件夹,是和用户做交互用的源码所在(第一次集成不需要全部加入,只需加下图这些就够了)。

干货 | LuatOS BSP移植教程,简单到复制粘贴!!!


luat文件夹下的port文件夹,是做接口适配用的,后文会讲。

PS:packages里面的东西,不需要在第一次编译的时候加上,后续慢慢加功能的时候加上就行。(防止编译出错)

3)设置编译

其实就是写Makefile或者Cmake。

$LUATOS    

- lua                       # Lua虚拟机   

- luat/module         # lua库实现    

- luat/port              # 接口层实现


以上目录内的.h文件需要加入include配置, .c文件加入到编译路径。以静态库的方式编译进目标就好啦,本文就不详细解释了,相信看这篇文章的都会写。





02 核心功能的适配





这里分两部分做适配,设置主入口和base.c。

1)设置主入口

打开工程的main.c(不同芯片叫法可能不一样),加入以下代码。手机浏览建议横屏查看:

#include "bget.h"

#include "luat_base.h"

#define LUAT_HEAP_SIZE (64*1024)

uint8_t luavm_heap[LUAT_HEAP_SIZE] = {0};

void app_main(void)

{

   bpool(luavm_heap, LUAT_HEAP_SIZE);  

luat_main();      

   // luat_main是LuatOS的主入口, 该方法通常不会返回.

}



这里做一下批注:

#define LUAT_HEAP_SIZE () 这个定义是设置LuatOS可以使用的内存堆大小,要根据芯片可用的大小选择,单位是byte。

e.g. 

#define LUAT_HEAP_SIZE (16*1024) 

//代表分配16k 给LuatOS使用


2)设置base.c

这里可以根据本工程配套的示例仓库做。

在ports文件夹内新建一个名为luat_base_xxx.c的文件,所有基础的实现都会在这个文件内找到。

这里简单说以下几个部分吧:

● 设置加载的库(手机浏览建议横屏查看)

static const   luaL_Reg  loadedlibs[] = {
    {"_G", luaopen_base},               // _G
    {LUA_LOADLIBNAME, luaopen_package}, // require
    {LUA_COLIBNAME, luaopen_coroutine}, // coroutine协程库
    {LUA_TABLIBNAME, luaopen_table},    // table库,操作table类型的数据结构
    {LUA_IOLIBNAME, luaopen_io},        // io库,操作文件
    {LUA_OSLIBNAME, luaopen_os},        // os库,已精简
    {LUA_STRLIBNAME, luaopen_string},   // string库,字符串操作
    {LUA_MATHLIBNAME, luaopen_math},    // math 数值计算
                                        //  {LUA_UTF8LIBNAME, luaopen_utf8},
    {LUA_DBLIBNAME, luaopen_debug},     // debug库,已精简
#if defined(LUA_COMPAT_BITLIB)
    {LUA_BITLIBNAME, luaopen_bit32}, // 不太可能启用
#endif
    // 往下是RTT环境下加载的库
    {"rtos", luaopen_rtos},   // rtos底层库, 核心功能是队列和定时器
    {"log"luaopen_log},     // 日志库
    {"timer", luaopen_timer}, // 延时库
    {NULL, NULL}};



● 设置bsp的名称

const char *luat_os_bsp(void)

{  

     return "example"; //example改成芯片的名字

}


● 设置log打印函数

void luat_nprint(char *s, size_t l)

{  

      printf("%s", s); 

}


一般可以用printf()这个函数,如果芯片SDK不支持,请换成对应的或者自行实现。




03 FS的适配





单独把FS这一部分拿出来说一下,lua脚本是存放在FS里面的,所以说要实现luatos正常的运行,还需把FS做好适配。

这里需要在port文件夹内新建一个名为luat_fs_xxx.c的文件,把实现函数放在这个文件夹内。

根据芯片SDK,在芯片Flash中创建FS分区,常见的有spiffs、fatfs、littefs等等,关键函数是int luat_fs_init(void);

如果支持posix风格的,则自带实现;否则需要实现luat_fs.h。





04 开始编译





编译通过刷入芯片,打开串口就能看到LuatOS的log打印了。

ESP32成功编译示例:

干货 | LuatOS BSP移植教程,简单到复制粘贴!!!


如果编译失败,请根据报错查找原因。

本文将在DOC社区持续更新,文末【阅读原文】可直达,敬请关注:

https://doc.openluat.com/article/2973







第二部分:进阶

外设的的适配






外设通常指gpio/i2c/spi,实现对应的.h文件就可以了,然后在luat_openlibs加载。

加载示例 {“gpio”, luaopen_gpio};

 {"rtos", luaopen_rtos},   // rtos底层库, 核心功能是队列和定时器

    {"log", luaopen_log},     // 日志库

    {"timer", luaopen_timer}, // 延时库

    {"gpio", luaopen_gpio},   // GPIO脚的操作

    {"adc", luaopen_adc},     // ADC库

    {"i2c", luaopen_i2c},     // I2C操作

    {"spi", luaopen_spi},     // SPI操作

    {"uart",luaopen_uart},    // UART操作

    {NULL, NULL}};






LuatOS BSP的基础移植,以上这些就够用了。

基础移植成功之后,后面的就是各类外设的适配了,这个过程必定是漫长的,还请各位大佬耐心搞一搞,有问题可以来LuatOS大群1061642968探讨或者提issue。

干货 | LuatOS BSP移植教程,简单到复制粘贴!!!

欢迎入群共同探讨物联网开发应用

干货 | LuatOS BSP移植教程,简单到复制粘贴!!!

合宙Luat交流群18(LuatOS):1061642968

合宙Luat交流群03:1092305811

合宙Luat交流群04:877164555  

合宙Luat交流群17(iRTU):1027923658


每个建议都值得关注

每个技能都值得分享


干货 | LuatOS BSP移植教程,简单到复制粘贴!!!

- 更多精彩等你参与 -

了解更多相关内容





干货 | LuatOS BSP移植教程,简单到复制粘贴!!!


以上是关于干货 | LuatOS BSP移植教程,简单到复制粘贴!!!的主要内容,如果未能解决你的问题,请参考以下文章

必看!LuatOS自定义C库全新教程,一文极速上手

LuatOS | 体验全新BSP—基于Win32的LuatOS仿真器,悬赏活动火热来袭

BSP视频教程STM32H7视频教程第11期:STM32H7的GPIO实战,深化非阻塞编程思想,移植驱动到全新器件上,开启Event Recorder狂暴模式

必看!LuatOS自定义C库全新教程,一文极速上手

LuatOS | 全新在线模拟器,随时随地发挥创意

BSP视频教程BSP视频教程第25期:CAN/CANFD/CANopen专题,CAN知识点干货分享, 收发执行过程和错误帧处理(2023-01-03)