三.嵌入式中的lua调用C


1.简单说明

文中针对的嵌入式,并不包括带mmu的cpu。所以,使用lua调用so库在本文中也就不说明了。

2.简单的lua调用c

这一节说明的是简单的在lua源码中添加c函数,然后调用即可。这里面体现的就是lua调用了指定的c函数。

步骤如下:

1.在lua.c下,找到pmain函数,在luaL_openlibs()后添加如下代码块:

  lua_register(L, "myadd", l_add);
  const char* testfunc = "print(myadd(1.1,2.0445))";
  if(luaL_dostring(L, testfunc))    
        printf("Failed to execute.\n");

2.在lua.c下,添加函数:

static int l_add(lua_State* L) 
{
    double op1 = luaL_checknumber(L,1);
    double op2 = luaL_checknumber(L,2);
    lua_pushnumber(L,op1 + op2);
    return 1;
}

3.编译整个lua源码,并执行:

$ make c89 test
$ ./lua
3.1445

3.符合工程化的lua调用c

符合工程化的lua调用c,是指上层使用lua,而在lua的源码框架中已经包含了基本的c函数。这样能做到lua工程师与驱动工程师的分离。

具体的使用方法是参照luaL_openlibs()的实现。

例如在lua源码中添加的内容为:

int l_myaddfun(lua_State * L)
{
  #if 1
   double op1 = luaL_checknumber(L,1);
    double op2 = luaL_checknumber(L,2);
    lua_pushnumber(L,op1 + op2);
    return 1;
  #endif
}


static const luaL_Reg l_addfun_array[] = {
    {"myaddfun",        l_myaddfun},
    {NULL,  NULL}
};

 
int luaopen_addfun(lua_State * L)
{
  luaL_newlib(L, l_addfun_array);
  return 1;
}


static void  lua_testlibs (lua_State *L) {
    const luaL_Reg prelibs[] = {
        { "test.addfun",            luaopen_addfun },
        { NULL, NULL },
    };
    const luaL_Reg * lib;

    for(lib = prelibs; lib->func; lib++)
    {
    lua_getglobal(L, "package");
    lua_getfield(L, -1, "preload");
    lua_pushcfunction(L, lib->func);
    lua_setfield(L, -2, lib->name);
    lua_pop(L, 2);
    }
}

lua应用层源码为:

--在调用时,必须是package.function
local myfun = require("test.addfun")
--print(mytestlib.add(1.0,2.0))
print("hello world......................")
print(myfun.myaddfun(20.1,19))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容