2021-08-03 22:47:42 +08:00
2021-08-02 14:03:07 +08:00
2021-08-03 16:20:17 +08:00
2021-08-03 17:04:51 +08:00
2021-08-03 16:34:44 +08:00
2021-08-03 16:20:17 +08:00
2021-08-03 22:47:42 +08:00

简介

mimiscript可以为mcu裸机c开发提供面向对象的脚本绑定。

支持裸机运行可运行于内存40Kb以上的mcu中如stm32f103esp32。

支持跨平台可运行于linux环境。

仅使用C标准库尽可能的结构清晰尽我所能几乎不使用宏。

架构示意图

K9C)%CZO)X`8VFBKCE8(9@W

linux下运行demo

step1: 拉取项目

git clone https://github.com/mimilib/mimiscript
cd mimiscript
git submodule init && git submodule update

step2: 安装编译链

sudo apt update
sudo apt install -y clang llvm cmake zlib1g-dev

step3: 编译项目

cd mimiproject
sh init.sh # 第一次编译前运行,之后就不用运行了 
sh make.sh # 编译项目

step4: 运行demo

bin/demo01-led.bin

测试例:

#include "sysObj.h"

/* 
    被绑定的方法 
    self 是对象指针,指向执行方法的对象
    args 是参数列表,用于传入传出参数
    (所有被绑定的方法均使用此形参)
*/
void add(MimiObj *self, Args *args) 
{
    /* 
        参数传递 
        从参数列表中取出输入参数val1和val2
    */
    int val1 = args_getInt(args, "val1");
    int val2 = args_getInt(args, "val2");
    
    /* 实现方法的功能 */
    int res = val1 + val2;
    
    /* 将返回值传回参数列表 */
    method_returnInt(args, res);
}

/* 
    定义测试类的构造器,一个构造器对应一个类
    通过构造器即可新建对象
    args是构造器的初始化参数列表
    MimiObj*是新建对象的指针
    (所有构造器均使用此形参)
*/
MimiObj *New_MimiObj_test(Args *args)
{
    /* 
        继承sys类
        只需要直接调用父类的构造器即可
    */
    MimiObj *self = New_MimiObj_sys(args);
    
    /* 
        为test类绑定一个方法支持重载
        1.入口参数self对象指针指向当前对象
        2.传入的第二参数是被绑定方法的接口定义
        此处使用typescript语法简单的修改即可支持python格式
        3.传入的第三个参数是被绑定方法的函数指针
    */
    class_defineMethod(self, "add(val1:int, val2:int):int", add); 


    /* 返回对象 */
    return self;
}

void main()
{
    /* 
        新建根对象对象名为“sys”
        传入对象名和构造器的函数指针
    */
    MimiObj *sys = newRootObj("sys", New_MimiObj_sys);

    /* 
        新建test对象
        test对象作为子对象挂载在sys对象下对象树
    */
    obj_newObj(sys, "test", New_MimiObj_test);
    
    /*  
        运行单行脚本。
        因为test对象挂在在sys对象下
        因此可以通过test.add调用test对象的方法
        运行后会动态新建res属性该属性属于sys对象
    */
    obj_run(sys, "res = test.add(val1 = 1, val2 = 2)");
    /*
        (也支持 "res = test.add(1, 2)"的调用方式)
    */
    
    /* 从sys对象中取出属性值res */
    int res = obj_getInt(sys, "res");
    
    /* 
        析构对象
        所有挂载在sys对象下的子对象都会被自动析构
        本例中挂载了test对象因此在析构sys对象前
        test对象会被自动析构
    */
    obj_deinit(sys);
    
    /* 打印返回值 res = 3*/
    printf("%d\r\n", res);    
}
Description
No description provided
Readme MIT 277 MiB
Languages
C 97.9%
Assembly 0.9%
Python 0.6%
C++ 0.2%
Shell 0.1%
Other 0.1%