色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

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

          單片機(jī)腳本語言移植lua到stm32MDK

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

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

          本文引用地址:http://cafeforensic.com/article/201611/318719.htm

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

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

          非常多應(yīng)用程序使用LUA作為自己的嵌入式腳本語言,以此來實(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語言極相似的解釋型編程語言,在佳能相機(jī)的CHDK外掛破解固件中使用的僅是uBASIC語言的一個(gè)微小的子集,但用來控制相機(jī)的各種操作已經(jīng)足夠了。uBASIC是CHDK所包括的編程組件,通過編程來進(jìn)一步拓展CHDK固件的功能。通過執(zhí)行uBASIC編寫的腳本,能夠使相機(jī)按預(yù)定的程序自己主動(dòng)地執(zhí)行各種操作,比方運(yùn)動(dòng)檢測(功能相當(dāng)強(qiáng)大),自己主動(dòng)調(diào)整光圈、快門,包圍曝光,甚至USB線控拍攝等等。僅僅要有不論什么一種編程語言的基礎(chǔ),要學(xué)會(huì)uBASIC相機(jī)控制腳本語言都是非常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編程語言的全面支持,給單片機(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)庫底層函數(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;

          }

          //將一個(gè)字符寫入控制臺(tái)

          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)閉