• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

单片机脚本语言-移植lua到stm32-MDK

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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 0x1000 == 4Kb

Stack_Size     EQU     0x00001000

; heap size 0x2c00 == 11Kb

Heap_Size       EQU     0x00002C00

 

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

  {

      

 }  

}


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Lua中实现队列(高效方式)发布时间:2022-07-22
下一篇:
通过Lua扩展NGINX实现的可伸缩的Web平台OpenResty®发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap