<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

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

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

          本文引用地址:http://www.ex-cimer.com/article/201611/318719.htm

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

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

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

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

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

          (一)ubasic

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

          外部資料鏈接

          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,最小執(zhí)行內存約7.5kb。

          MDK下lua移植到stm32

          移植lua

          l 加入?lua源代碼到MDK,把lua.c 和luac.c刪除。

          l 改動堆棧大?。憾炎钚?.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 重寫標準庫底層函數(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;

          }

          //刷新句柄關聯(lián)的緩沖區(qū)

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

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

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

          {

          }

          }



          評論


          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();