• 欢迎大家分享资料!前往留言板评论即可!

LuatOS BSP移植教程

合宙 模组资料网 3年前 (2021-05-15) 766次浏览 0个评论 扫描二维码
文章目录[隐藏]

@TOC

一、前言

大半年没写文字教程了,开始写这篇文章前还在犹豫要不要做,手生了,手放键盘上不知道该打啥字,本来计划做视频教程的,但因为经常嘴瓢,还是写文字吧。

LuatOS本着自身的开源特性,可以很轻松的嵌入到很多微处理器和微控制器,那就说说咋移植这套系统呗,其实并不难,看完基本就会了(大概)

目前我在做的是esp32的luatos分支,(只不过进度挺慢的,有空就写),依照我现有的经验,搞一下基础的移植教程吧。

二、初探

提要

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

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

Github

Gitee

废话少说,开始进入正题

准备

基本步骤

  1. 编译环境的集成
  2. 核心功能的适配
  3. 外设的适配

看到这可能还会一脸懵逼?莫慌,听我慢慢道来。

1、编译环境的集成

这一步是最开始的一步,就是将lua虚拟机部分集成进芯片,我们要做的就是Ctrl+C Ctrl+V。

要想运行luatos,就要把核心的lua虚拟机部分集成进去,下面就开始步骤讲解。

(1)使用芯片的sdk建立一个空白的工程(这肯定都会)

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

LuatOS BSP移植教程

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

  • (1)freertos或者rtt,这个是调用rtos的接口,如果芯片使用的是这两种直接复制就好啦,

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

  • (2)include文件夹,这是头文件所在的地方

  • (3)modules 这个是和用户做交互用的源码所在(第一次不需要全部加入)

LuatOS BSP移植教程

第一次集成加这些就够了

luat文件夹下的ports文件夹,是做接口适配用的,下面会讲

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

(3)设置编译

其实就是写Makefile或者cmake

$LUATOS
    - lua                       # Lua虚拟机
    - luat/module               # lua库实现
    - luat/ports                # 接口层实现

以上目录内的.h文件需要加入include配置, .c文件加入到编译路径.

以静态库的方式编译进目标就好啦,就不详细解释了,相信看这篇文章的都会写

2、核心功能是适配

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

(1)设置主入口

打开工程的main.c(不同芯片叫法可能不一样)

加入以下代码

#include "bget.h"
#include "luat_base.h"

#define LUAT_HEAP_SIZE ()
uint8_t luavm_heap[LUAT_HEAP_SIZE] = {0};

void app_main(void)
{
    bpool(luavm_heap, LUAT_HEAP_SIZE);  
    // lua vm需要一块内存用于内部分配, 给出首地址及大小.
    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的文件,所有基础的实现都会在这个文件内找到。

这里说几个部分吧

  • 设置加载的库

LuatOS BSP移植教程

  • 设置bsp的名称
    const char *luat_os_bsp(void)
    {
    return "example"; //example改成芯片的名字
    }
    
  • 设置log打印函数
    void luat_nprint(char *s, size_t l)
    {
    printf("%s", s);
    }
    

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

3、开始编译

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

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

4、FS的实现

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

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

  • (1)根据芯片sdk,在芯片flash中创建fs分区,常见的有spiffs、fatfs、littefs等等,关键函数是int luat_fs_init(void)
  • (2)如果支持posix风格的,则自带实现,否则需要实现 luat_fs.h

三、进阶

外设的适配

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

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

LuatOS BSP移植教程

四、小结

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

欢迎大家批评指正,本篇教程到此结束


转载请注明原文链接:LuatOS BSP移植教程
喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址