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

Lua简介

Lua[1]  是一个小巧的脚本语言。作者是巴西人。该语言设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,Ini等文件格式,并且更容易理解和维护。

Lua的目标是成为一个很容易嵌入其它语言中使用的语言。大多数程序员也认为它的确做到了这一点。

很多应用程序使用LUA作为自己的嵌入式脚本语言,以此来实现可配置性、可扩展性。这其中包括魔兽世界博德之门愤怒的小鸟、VOCALOID3
等。

单片机使用的脚本现状

佳能相机的CHDK外挂破解固件支持ubasic与lua脚本。http://chdk.wikia.com/wiki/CHDK_User_Manual

(一)       ubasic

uBASIC是与普通的BASIC语言极相似的解释型编程语言,在佳能相机的CHDK外挂破解固件中使用的仅是uBASIC语言的一个微小的子集,但用来控制相机的各种操作已经足够了。uBASIC是CHDK所包含的编程组件,通过编程来进一步拓展CHDK固件的功能。通过运行uBASIC编写的脚本,可以使相机按预定的程序自动地执行各种操作,比如运动检测(功能相当强大),自动调整光圈、快门,包围曝光,甚至USB线控拍摄等等。只要有任何一种编程语言的基础,要学会uBASIC相机控制脚本语言都是非常容易的,不过要灵活地运用它实现很多特殊而有趣的功能则需要一定时间的练习与实践了。

外部资料链接

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

时间: 2024-10-11 06:01:44

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

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

纯属个人见解. 大致来说:c/c++执行效率高,游戏中一些性能敏感的复杂计算需要用c/c++来实现,防止游戏卡顿和低帧率.这些复杂计算包括战斗逻辑,复杂AI,骨骼动画蒙皮骨骼点的坐标计算等等.但c++是一种比较复杂的编程语言,开发效率较低.嘛,不过这不是主要问题,对于商业手游项目只用c++开发,是致命的.这一点在后边lua具体说明. lua是脚本语言,执行效率不及c/c++,往往用来实现性能不敏感的游戏逻辑,比如窗口界面等等.另外lua语法简单,开发效率高,没有编程背景的策划花精力后也可以掌握,

为 STM32 移植 Berry 脚本语言

Berry 是我为单片机设计的一款脚本语言,该语言具有资源占用小.平台无关.执行速度快和易于掌握等优点.在单片机上使用脚本语言可以提高单片机的二次开发能力以及调试效率,同时也是一种比较新颖的玩法.本教程将简要介绍在 STM32F103RBT6 单片机上移植 Berry 脚本语言的方法.教程的末尾给出了移植完成的示例工程,读者可以根据本教程的内容和示例工程完成自己的移植工作. 我使用 ST 推出的 CubeMX 软件进行单片机固件库的配置,选择用 CubeMX 生成 HAL 库工程而不用标准库是考

(一)Lua脚本语言入门

今天开始自己的Lua语言学习,Lua脚本语言,是介于应用程序和开发其应用程序的底层编程语言之间,,它很方便调用其它语言,它只是在载入时对其进行编译,而不像我们写的单片机程序是预编译的,先编译好然后写入单片机,它只是在调用时编译,所以脚本语言的灵活性很高,,,,,对于自己为什么又开始学习脚本语言了,,因为需要了 ........ 先打印个 hello world 一,变量 Lua有五种变量类型nil,Boolean,string,Number,table 看一个例子,,,,,,,,,先哄我外甥玩,

Basic脚本解释器移植到STM32

本文来自http://blog.csdn.net/hellogv/ .引用必须注明出处! 上次讲了LUA移植到STM32.这次讲讲Basic脚本解释器移植到STM32. 在STM32上跑Basic脚本,相同能够跟穿戴设备结合.也能够作为刚開始学习的人学习MCU的入门工具,当然前提是有人做好Basic的STM32交互实现.这里使用的是uBasic开源脚本解释器(http://dunkels.com/adam/ubasic/),只是uBasic不支持完整的Basic算法,所以用起来略费心,假设有好的

(五)Lua脚本语言入门

---恢复内容开始--- 写完这篇Lua脚本语言入门,自己就要尝试去用Lua脚本语言写esp8266了,,自己现在挺心急的,因为朋友使用esp8266本来说自己帮忙写好程序的,但是用的单片机不一样自己没有,没有办法测试,用AT指令就显得不方便,还要根据单片机改程序,,而且自己以前用感觉AT指令发信息那块,麻烦,,,,自己知道用脚本去操作8266要比AT指令灵活和稳定的多,真想赶紧学会用Lua脚本去操作8266,那样的话就可以很方便的帮到朋友了......本来答应了,,,,,,,竟然食言了....

Java中使用Lua脚本语言(转)

Lua是一个实用的脚本语言,相对于Python来说,比较小巧,但它功能并不逊色,特别是在游戏开发中非常实用(WoW采用的就是Lua作为脚本的).Lua在C\C++的实现我就不多说了,网上随便一搜,到处都是这方面的介绍,我想说的是如何在Java下使用Lua以提高编程效率.增强你的程序可扩展性. 首先,要在Java上使用Lua脚本,必须有关于Lua脚本解释器以及Java程序可以访问这些脚本的相关API,即相关类库.我使用的是一个叫做LuaJava的开源项目,可以在: http://www.keple

Cocos2d-x 脚本语言Lua中的面向对象

Cocos2d-x 脚本语言Lua中的面向对象 面向对象不是针对某一门语言,而是一种思想.在面向过程的语言也能够使用面向对象的思想来进行编程. 在Lua中,并没有面向对象的概念存在,没有类的定义和子类的定义.但相同在Lua中能够利用面向对象的思想来实现面向对象的类继承. 一.复制表的方式面向对象 --Lua中的面向对象 --[[ 复制表方式面向对象 參数为一张表.通过遍历这张表取值,赋给一张空表,最后返回新建的表.来达到克隆表 ]] function clone(tab) local ins =

Cocos2d-x 脚本语言Lua基本数据结构-表(table)

table是Lua中唯一的数据结构,其他语言所提供的数据结构,如:arrays.records.lists.queues.sets等,Lua都是通过table来实现,并且在lua中table很好的实现了这些数据结构.--摘自:<Programming in Lua> 看以下代码,可以很清晰的明白Lua中表的使用: -- Lua中的表,table Config = {hello="Hello Lua",world="World"} -- 赋值方式1,以键=

Lua脚本编程:Lua语言入门

Lua是一门简单而强大的语言,其本身强大的扩展性使得这门语言在游戏设计等领域发挥着重要的作用.博主曾在Unity3D中使用过这门语言,并且针对Lua和Unity.C++等方面的内容进行了学习和讨论.最近因为在[游戏脚本高级编程]这本书中详细介绍了Lua脚本的相关内容,因此在这里记录下博主的读书心得,方便以后在需要的时候查阅. Lua系统构成 Lua系统由Lua链接库.Luac编译器.Lua解释器三部分构成. * Lua链接库主要由lua.lib和lua.h这两个文件组成.Lua链接库主要负责对自