Lua简略介绍
Lua[1]是一个细巧的脚本言语。作者是巴西人。该言语的规划意图是为了嵌入应用程序中,从而为应用程序供给灵敏的扩展和定制功用。
Lua脚本可以十分easy的被C/C++代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。不只作为扩展脚本,也可以作为一般的装备文件,替代XML,Ini等文件格局,并且更easy了解和保护。
Lua的方针是成为一个十分easy嵌入其他言语中运用的言语。大多数程序猿也觉得它确实做到了这一点。
十分多应用程序运用LUA作为自己的嵌入式脚本言语,以此来完成可装备性、可扩展性。这傍边包含魔兽国际、博德之门、气愤的小鸟、VOCALOID3等。
单片机运用的脚本现状
佳能相机的CHDK外挂破解固件支撑ubasic与lua脚本。http://chdk.wikia.com/wiki/CHDK_User_Manual
(一)ubasic
uBASIC是与一般的BASIC言语极类似的解说型编程言语,在佳能相机的CHDK外挂破解固件中运用的仅是uBASIC言语的一个细小的子集,但用来操控相机的各种操作现已足够了。uBASIC是CHDK所包含的编程组件,经过编程来进一步高兴CHDK固件的功用。经过碑文uBASIC编写的脚本,可以使相机按预订的程序自己自动地碑文各种操作,比如运动检測(功用适当强壮),自己自动调整光圈、快门,围住曝光,乃至USB线控拍照等等。仅仅要有不论什么一种编程言语的根底,要学会uBASIC相机操控脚本言语都是十分easy的,仅仅要灵敏地运用它完成十分多特别而风趣的功用则需要必定时刻的操练与实践了。
外部材料链接
http://wenku.baidu.com/link?url=awzzzkvjPVuAM_17Fpw42U1r8JSOW-0RHf9GE6Sn2qAUP3SarZH-TPzVuIiCz7p8NhPz1iFeGmLJRHH-HcXYGKfh41X7pbtDCWbkYugzthK
(二)lua
也被佳能相机的CHDK外挂破解固件支撑,别的,有eluaproject支撑各种单片机,elua代表嵌入式LUA,该项意图意图是为嵌入式设备供给的Lua编程言语的全面支撑,给单片机供给可扩展、高效、便携式的软件特色。
Eluaproject
https://github.com/elua/elua
Lua硬件要求
l RAM >= 7.5Kb,主张16KB以上
l ROM >= 65kb,主张128kb以上
Lua在MDK下编译后的巨细约60kb,最小碑文内存约7.5kb。
MDK下lua移植到stm32
移植lua
l 参加�lua源代码到MDK,把lua.c 和luac.c删去。
l 改动仓库巨细:堆最小为5.5kb,栈最小是1.5kb。lua的空间分配在堆空间。16kb的内存主张分配是堆11Kb,栈4Kb,留1Kb给全局变量。
在startup_stm32f10x_md.s文件里
;stack size 0x1 == 4Kb
Stack_SizeEQU 0x01
;heap size 0x2c00 == 11Kb
Heap_Size EQU 0x02C00
l 重写规范库底层函数
typedef int FILEHANDLE;
#pragma import(__use_no_semihosting_swi)
#pragma import(_main_redirection)
const char __stdin_name[150];
const char __stdout_name[150];
const char __stderr_name[150];
FILEHANDLE _sys_open(const char *name, intopenmode)
{
return0;
}
int _sys_close(FILEHANDLE fh)
{
return 0;
}
int _sys_write(FILEHANDLE fh, constunsigned char *buf, unsigned len, int mode)
{
return0;
}
int _sys_read(FILEHANDLE fh, unsigned char*buf, unsigned len, int mode)
{
return0;
}
//查看句柄是否为终端
int _sys_istty(FILEHANDLE fh)
{
return0;
}
int _sys_seek(FILEHANDLE fh, long pos)
{
return0;
}
//改写句柄相关的缓冲区
int _sys_ensure(FILEHANDLE fh)
{
return0;
}
//回来文件当时长度
long _sys_flen(FILEHANDLE fh)
{
return0;
}
void _sys_exit(int status)
{
//while(1);
}
int _sys_tmpnam(char *name, int fileno, unsignedmaxlength)
{
return0;
}
//将一个字符写入操控台
void _ttywrch(int ch)
{
}
int remove(const char *filename)
{
return0;
}
char *_sys_command_string(char *cmd, intlen)
{
return NULL;
}
C言语与lua交互
static int lua_led_on(lua_State *L)
{
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
return1;
}
static int lua_led_off(lua_State *L)
{
GPIO_SetBits(GPIOC,GPIO_Pin_13);
return1;
}
static int lua_delay(lua_State *L)
{
intnum;
num= lua_tointeger(L, 1);
Delay(num);
return1;
}
static const struct luaL_Reg mylib[] =
{
{“led_on”,lua_led_on},
{“led_off”,lua_led_off},
{“delay”,lua_delay},
{NULL,NULL}
};
int luaopen_mylib(lua_State *L)
{
#if 1
//lua_newtable(L);
luaL_setfuncs(L,mylib, 0);
#else
luaL_newlib(L,mylib);
#endif
return1;
}
const char LUA_SCRIPT_GLOBAL[] =” \
off = 10 \
on = 10 \
while 1 do \
led_off() \
delay(off) \
led_on() \
delay(on) \
off= off * 1.02 \
on= on * 1.02 \
ifoff > 800 then off = 500 end \
ifon > 800 then on = 400 end \
end”;
/*************************************************
函数: int main(void)
功用: main主函数
參数: 无
回来: 无
**************************************************/
int main(void)
{
intret = 0;
lua_State *L = NULL;
system_init();
L =luaL_newstate();
if(L == NULL)
abort();
luaopen_base(L);
luaopen_mylib(L);
ret= luaL_dostring(L, LUA_SCRIPT_GLOBAL);
if (ret != 0)
abort();
lua_close(L);
abort();
for(;;)
{
}
}