新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 單片機腳本語言移植lua到stm32MDK

單片機腳本語言移植lua到stm32MDK

作者: 時間:2016-11-20 來源:網(wǎng)絡(luò) 收藏
Lua簡單介紹

Lua[1]是一個小巧的腳本語言。作者是巴西人。該語言的設(shè)計目的是為了嵌入應(yīng)用程序中,從而為應(yīng)用程序提供靈活的擴展和定制功能。

本文引用地址:http://butianyuan.cn/article/201611/318719.htm

Lua腳本能夠非常easy的被C/C++代碼調(diào)用,也能夠反過來調(diào)用C/C++的函數(shù),這使得Lua在應(yīng)用程序中能夠被廣泛應(yīng)用。不只作為擴展腳本,也能夠作為普通的配置文件,取代XML,Ini等文件格式,而且更easy理解和維護。

Lua的目標(biāo)是成為一個非常easy嵌入其他語言中使用的語言。大多數(shù)程序猿也覺得它的確做到了這一點。

非常多應(yīng)用程序使用LUA作為自己的嵌入式腳本語言,以此來實現(xiàn)可配置性、可擴展性。這當(dāng)中包含魔獸世界、博德之門、憤慨的小鳥、VOCALOID3等。

單片機使用的腳本現(xiàn)狀

佳能相機的CHDK外掛破解固件支持ubasic與lua腳本。http://chdk.wikia.com/wiki/CHDK_User_Manual

(一)ubasic

uBASIC是與普通的BASIC語言極相似的解釋型編程語言,在佳能相機的CHDK外掛破解固件中使用的僅是uBASIC語言的一個微小的子集,但用來控制相機的各種操作已經(jīng)足夠了。uBASIC是CHDK所包括的編程組件,通過編程來進一步拓展CHDK固件的功能。通過執(zhí)行uBASIC編寫的腳本,能夠使相機按預(yù)定的程序自己主動地執(zhí)行各種操作,比方運動檢測(功能相當(dāng)強大),自己主動調(diào)整光圈、快門,包圍曝光,甚至USB線控拍攝等等。僅僅要有不論什么一種編程語言的基礎(chǔ),要學(xué)會uBASIC相機控制腳本語言都是非常easy的,只是要靈活地運用它實現(xiàn)非常多特殊而有趣的功能則須要一定時間的練習(xí)與實踐了。

外部資料鏈接

http://wenku.baidu.com/link?url=awzzzkvjPVuAM_17Fpw42U1r8JSOW-0RHf9GE6Sn2qAUP3SarZH-TPzVuIiCz7p8NhPz1iFeGmLJRHH-HcXYGKfh41X7pbtDCWbkYugzthK

(二)lua

也被佳能相機的CHDK外掛破解固件支持,另外,有eluaproject支持各種單片機,elua代表嵌入式LUA,該項目的目的是為嵌入式設(shè)備提供的Lua編程語言的全面支持,給單片機提供可擴展、高效、便攜式的軟件特點。

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 改動堆棧大?。憾炎钚?.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)庫底層函數(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)前長度

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";

/*************************************************

函數(shù): int main(void)

功能: main主函數(shù)

參數(shù): 無

返回: 無

**************************************************/

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(;;)

{

}

}



評論


技術(shù)專區(qū)

關(guān)閉