單片機(jī)腳本語(yǔ)言移植lua到stm32MDK
Lua[1]是一個(gè)小巧的腳本語(yǔ)言。作者是巴西人。該語(yǔ)言的設(shè)計(jì)目的是為了嵌入應(yīng)用程序中,從而為應(yīng)用程序提供靈活的擴(kuò)展和定制功能。
本文引用地址:http://butianyuan.cn/article/201611/318719.htmLua腳本能夠非常easy的被C/C++代碼調(diào)用,也能夠反過來(lái)調(diào)用C/C++的函數(shù),這使得Lua在應(yīng)用程序中能夠被廣泛應(yīng)用。不只作為擴(kuò)展腳本,也能夠作為普通的配置文件,取代XML,Ini等文件格式,而且更easy理解和維護(hù)。
Lua的目標(biāo)是成為一個(gè)非常easy嵌入其他語(yǔ)言中使用的語(yǔ)言。大多數(shù)程序猿也覺得它的確做到了這一點(diǎn)。
非常多應(yīng)用程序使用LUA作為自己的嵌入式腳本語(yǔ)言,以此來(lái)實(shí)現(xiàn)可配置性、可擴(kuò)展性。這當(dāng)中包含魔獸世界、博德之門、憤慨的小鳥、VOCALOID3等。
單片機(jī)使用的腳本現(xiàn)狀
佳能相機(jī)的CHDK外掛破解固件支持ubasic與lua腳本。http://chdk.wikia.com/wiki/CHDK_User_Manual
(一)ubasic
uBASIC是與普通的BASIC語(yǔ)言極相似的解釋型編程語(yǔ)言,在佳能相機(jī)的CHDK外掛破解固件中使用的僅是uBASIC語(yǔ)言的一個(gè)微小的子集,但用來(lái)控制相機(jī)的各種操作已經(jīng)足夠了。uBASIC是CHDK所包括的編程組件,通過編程來(lái)進(jìn)一步拓展CHDK固件的功能。通過執(zhí)行uBASIC編寫的腳本,能夠使相機(jī)按預(yù)定的程序自己主動(dòng)地執(zhí)行各種操作,比方運(yùn)動(dòng)檢測(cè)(功能相當(dāng)強(qiáng)大),自己主動(dòng)調(diào)整光圈、快門,包圍曝光,甚至USB線控拍攝等等。僅僅要有不論什么一種編程語(yǔ)言的基礎(chǔ),要學(xué)會(huì)uBASIC相機(jī)控制腳本語(yǔ)言都是非常easy的,只是要靈活地運(yùn)用它實(shí)現(xiàn)非常多特殊而有趣的功能則須要一定時(shí)間的練習(xí)與實(shí)踐了。
外部資料鏈接
http://wenku.baidu.com/link?url=awzzzkvjPVuAM_17Fpw42U1r8JSOW-0RHf9GE6Sn2qAUP3SarZH-TPzVuIiCz7p8NhPz1iFeGmLJRHH-HcXYGKfh41X7pbtDCWbkYugzthK
(二)lua
也被佳能相機(jī)的CHDK外掛破解固件支持,另外,有eluaproject支持各種單片機(jī),elua代表嵌入式LUA,該項(xiàng)目的目的是為嵌入式設(shè)備提供的Lua編程語(yǔ)言的全面支持,給單片機(jī)提供可擴(kuò)展、高效、便攜式的軟件特點(diǎn)。
Eluaproject
https://github.com/elua/elua
Lua硬件要求
l RAM >= 7.5Kb,建議16KB以上
l ROM >= 65kb,建議128kb以上
Lua在MDK下編譯后的大小約60kb,最小執(zhí)行內(nèi)存約7.5kb。
MDK下lua移植到stm32
移植lua
l 加入?lua源代碼到MDK,把lua.c 和luac.c刪除。
l 改動(dòng)堆棧大?。憾炎钚?.5kb,棧最小是1.5kb。lua的空間分配在堆空間。16kb的內(nèi)存建議分配是堆11Kb,棧4Kb,留1Kb給全局變量。
在startup_stm32f10x_md.s文件里
;stack size 0x1 == 4Kb
Stack_SizeEQU 0x01
;heap size 0x2c00 == 11Kb
Heap_Size EQU 0x02C00
l 重寫標(biāo)準(zhǔn)庫(kù)底層函數(shù)
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;
}
//刷新句柄關(guān)聯(lián)的緩沖區(qū)
int _sys_ensure(FILEHANDLE fh)
{
return0;
}
//返回文件當(dāng)前長(zhǎng)度
long _sys_flen(FILEHANDLE fh)
{
return0;
}
void _sys_exit(int status)
{
//while(1);
}
int _sys_tmpnam(char *name, int fileno, unsignedmaxlength)
{
return0;
}
//將一個(gè)字符寫入控制臺(tái)
void _ttywrch(int ch)
{
}
int remove(const char *filename)
{
return0;
}
char *_sys_command_string(char *cmd, intlen)
{
return NULL;
}
C語(yǔ)言與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";
/*************************************************
函數(shù): int main(void)
功能: main主函數(shù)
參數(shù): 無(wú)
返回: 無(wú)
**************************************************/
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(;;)
{
}
}
評(píng)論