Lua简单介绍

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

{

}

}

单片机脚本语言-移植lua到stm32-MDK的更多相关文章

  1. 题外话:Lua脚本语言存在的意义

    纯属个人见解. 大致来说:c/c++执行效率高,游戏中一些性能敏感的复杂计算需要用c/c++来实现,防止游戏卡顿和低帧率.这些复杂计算包括战斗逻辑,复杂AI,骨骼动画蒙皮骨骼点的坐标计算等等.但c++ ...

  2. 为 STM32 移植 Berry 脚本语言

    Berry 是我为单片机设计的一款脚本语言,该语言具有资源占用小.平台无关.执行速度快和易于掌握等优点.在单片机上使用脚本语言可以提高单片机的二次开发能力以及调试效率,同时也是一种比较新颖的玩法.本教 ...

  3. Basic脚本解释器移植到STM32

    本文来自http://blog.csdn.net/hellogv/ .引用必须注明出处! 上次讲了LUA移植到STM32.这次讲讲Basic脚本解释器移植到STM32. 在STM32上跑Basic脚本 ...

  4. (一)Lua脚本语言入门

    今天开始自己的Lua语言学习,Lua脚本语言,是介于应用程序和开发其应用程序的底层编程语言之间,,它很方便调用其它语言,它只是在载入时对其进行编译,而不像我们写的单片机程序是预编译的,先编译好然后写入 ...

  5. (五)Lua脚本语言入门

    ---恢复内容开始--- 写完这篇Lua脚本语言入门,自己就要尝试去用Lua脚本语言写esp8266了,,自己现在挺心急的,因为朋友使用esp8266本来说自己帮忙写好程序的,但是用的单片机不一样自己 ...

  6. ESP8266使用详解--基于Lua脚本语言

    这些天,,,,今天终于看到了希望,,,天道酬勤 先说实现的功能...让ESP8266连接无线网,然后让它建立服务器,,我的客户端连接上以后,发给客户端发数据模块打印到串口,,往ESP8266串口里发数 ...

  7. Lua脚本语言快速入门手册

    学了两天Lua语言,感叹其短小精悍,上手极快,语法还很舒服,不错!整理下学习过程中经常用到的基础知识,共勉! Lua用法简述 Lua语言是在1993年由巴西一个大学研究小组发明,其设计目标是作为嵌入式 ...

  8. Lua 是一个小巧的脚本语言

    Redis进阶实践之七Redis和Lua初步整合使用 一.引言 Redis学了一段时间了,基本的东西都没问题了.从今天开始讲写一些redis和lua脚本的相关的东西,lua这个脚本是一个好东西,可以运 ...

  9. ESP8266 LUA脚本语言开发: 准备工作-LUA开发是怎么来的

    前言 当前8266有各种开发 1.在官方已经封装好的C库上开发(SDK开发) 2.官方在SDK的基础上封装的AT指令程序(AT指令开发) 3.在SDK的基础上嵌入脚本语言(Lua,Python等开发方 ...

随机推荐

  1. java中的变量

    变量就是命名的内存空间 1.声明和赋值方式:数据类型   变量名 = 值: 数据类型即划分的内存空间,变量名即划分出的内存空间的名 2.变量必须先声明才能使用,不能使用一个没有经过预先声明的变量:没有 ...

  2. github 预览html

    在网址前加 http://htmlpreview.github.io/?

  3. sql中视图视图的作用

    视图是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据.但是,视图并不在数据库中以存储的数据值集形式存在.行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态 ...

  4. Android -------- 序列化器生成xml文件

  5. 修改Sharepoint 文档库列表点击Excel文件默认跳转到Excel Service服务 xlviewer.aspx页面

    在Sharepoint 文档库中,当点击库中的一个Excel文件时,Sharepoint默认为转跳到Excel Services上,无论是Sharepoint 的是否开启了Excel Service, ...

  6. String.PadLeft - 格式对齐

    语法:public string PadLeft( int totalWidth, char paddingChar ) 概述,实现的效果是右对齐,返回一个总长度为 totalWidth,如果实际长度 ...

  7. pch文件出现no such file or directory错误

    一般出现这种情况是由于项目直接拷贝到其他电脑上运行... clang: error: no such file or directory: '/demo2/控件代码/13/Recorder/Recor ...

  8. POJ 1151 - Atlantis 线段树+扫描线..

    离散化: 将所有的x轴坐标存在一个数组里..排序.当进入一条线段时..通过二分的方式确定其左右点对应的离散值... 扫描线..可以看成一根平行于x轴的直线..至y=0开始往上扫..直到扫出最后一条平行 ...

  9. n阶行列式计算----c语言实现(完结)

    花了半天时间,写了这个n阶行列式计算的程序,应该算是比较优美吧,有很多地方多次做了优化,程序占用内存不是很大,要是说小吧,也不合适,因为里边有一个递归,而且递归的深度还比较深.时间复杂度具体没有细看, ...

  10. DEDE栏目内容调用

    {dede:sql sql='Select content from dede_arctype where id=1'} [field:content/] {/dede:sql},