|
说明:lua文件放在外部储存器(例如SD卡)才有项目意义,方便有户修改LUA代码,本次移植RL-FLASHFS。LUA精华是可以和其它语言(如C语言)相互调用起胶水作用
步骤:
1.修改luaconf.h,在其中增加宏定义#define LUA_32BITS;
2.重新实现print函数的底层,Lua的print函数的C语言实现部分是lbaselib.c文件的luaB_print()函数,修改lauxlib.h中宏定义lua_writestring,lua_writeline
/* print a string */
#if !defined(lua_writestring)
#define lua_writestring(s,l) printf(s)//fwrite((s), sizeof(char), (l), stdout)
#endif
/* print a newline and flush the output */
#if !defined(lua_writeline)
#define lua_writeline() printf("\n")//(lua_writestring("\n", 1), fflush(stdout))
#endif
3.移植RL-FLASHFS的SD卡文件系统
1)定义getc函数
int getc(FILE *stream)
{
char ch = 0;
int res;
res = fread(&ch, 1, 1, stream);
if(!res)
{
return EOF;
}
return ch;
}
2)修改luaconf.h默认路径
#define LUA_PATH_DEFAULT "M0:\\?.lua;"
#define LUA_CPATH_DEFAULT "M0:\\?.so;"
4.LUA调用C函数必须按LUA格式重新封装并注册
1)格式typedef int (*lua_CFunction) (lua_State *L);
2)封装
static int lua_led_on(lua_State *L)
{
bsp_LedOn(1);
return 1;
}
static int lua_led_off(lua_State *L)
{
bsp_LedOff(1);
return 1;
}
static int lua_delay(lua_State *L)
{
int num;
num= lua_tointeger(L, 1);
bsp_DelayMS(num);
return 1;
}
static const struct luaL_Reg mylib[]=
{
{"led_on",lua_led_on},
{"led_off",lua_led_off},
{"delay",lua_delay},
{NULL,NULL}
};
3)注册luaL_setfuncs(L, mylib, 0);
5.C调用LUA函数
lua_getglobal(L, "ledrun"); //LuaoˉêyÃû
if (lua_pcall(L, 0, 0, 0) != 0) //ÔËDDoˉêy
{
lua_tostring(L, -1);
}
6.LUA源码led.lua
function ledrun()
n = 1
while (n < 20)
do
led_on()
delay(500)
print("led ok")
led_off()
delay(500)
n = n + 1
end
end
7.C源码
int main(void)
{
lua_State *L;
bsp_Init(); /* ó2¼t3õê¼»ˉ */
L = luaL_newstate(); /* ½¨á¢LuaÔËDD»·¾3 */
luaopen_base(L);
// luaL_openlibs(L);
luaL_setfuncs(L, mylib, 0);
while (1)
{
luaL_dostring(L, "print(\"Hello,I am lua!\\n--this is newline printf\")\n");
if (luaL_dofile(L, "M0:\\led.lua"))//¼óÔØÎļt
{
lua_tostring(L, -1);
}
lua_getglobal(L, "ledrun"); //LuaoˉêyÃû
if (lua_pcall(L, 0, 0, 0) != 0) //ÔËDDoˉêy
{
lua_tostring(L, -1);
}
lua_close(L);
while (1);
}
}
|
评分
-
查看全部评分
|