单片机脚本语言-移植lua到stm32-MDK
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的,只是要灵活地运用它实现非常多特殊而有趣的功能则须要一定时间的练习与实践了。
(二) lua
也被佳能相机的CHDK外挂破解固件支持,另外,有eluaproject支持各种单片机,elua代表嵌入式LUA,该项目的目的是为嵌入式设备提供的Lua编程语言的全面支持,给单片机提供可扩展、高效、便携式的软件特点。
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的更多相关文章
- 题外话:Lua脚本语言存在的意义
纯属个人见解. 大致来说:c/c++执行效率高,游戏中一些性能敏感的复杂计算需要用c/c++来实现,防止游戏卡顿和低帧率.这些复杂计算包括战斗逻辑,复杂AI,骨骼动画蒙皮骨骼点的坐标计算等等.但c++ ...
- 为 STM32 移植 Berry 脚本语言
Berry 是我为单片机设计的一款脚本语言,该语言具有资源占用小.平台无关.执行速度快和易于掌握等优点.在单片机上使用脚本语言可以提高单片机的二次开发能力以及调试效率,同时也是一种比较新颖的玩法.本教 ...
- Basic脚本解释器移植到STM32
本文来自http://blog.csdn.net/hellogv/ .引用必须注明出处! 上次讲了LUA移植到STM32.这次讲讲Basic脚本解释器移植到STM32. 在STM32上跑Basic脚本 ...
- (一)Lua脚本语言入门
今天开始自己的Lua语言学习,Lua脚本语言,是介于应用程序和开发其应用程序的底层编程语言之间,,它很方便调用其它语言,它只是在载入时对其进行编译,而不像我们写的单片机程序是预编译的,先编译好然后写入 ...
- (五)Lua脚本语言入门
---恢复内容开始--- 写完这篇Lua脚本语言入门,自己就要尝试去用Lua脚本语言写esp8266了,,自己现在挺心急的,因为朋友使用esp8266本来说自己帮忙写好程序的,但是用的单片机不一样自己 ...
- ESP8266使用详解--基于Lua脚本语言
这些天,,,,今天终于看到了希望,,,天道酬勤 先说实现的功能...让ESP8266连接无线网,然后让它建立服务器,,我的客户端连接上以后,发给客户端发数据模块打印到串口,,往ESP8266串口里发数 ...
- Lua脚本语言快速入门手册
学了两天Lua语言,感叹其短小精悍,上手极快,语法还很舒服,不错!整理下学习过程中经常用到的基础知识,共勉! Lua用法简述 Lua语言是在1993年由巴西一个大学研究小组发明,其设计目标是作为嵌入式 ...
- Lua 是一个小巧的脚本语言
Redis进阶实践之七Redis和Lua初步整合使用 一.引言 Redis学了一段时间了,基本的东西都没问题了.从今天开始讲写一些redis和lua脚本的相关的东西,lua这个脚本是一个好东西,可以运 ...
- ESP8266 LUA脚本语言开发: 准备工作-LUA开发是怎么来的
前言 当前8266有各种开发 1.在官方已经封装好的C库上开发(SDK开发) 2.官方在SDK的基础上封装的AT指令程序(AT指令开发) 3.在SDK的基础上嵌入脚本语言(Lua,Python等开发方 ...
随机推荐
- Dubbo亮点总结
Dubbo是阿里巴巴的一个开源RPC项目,可在http://dubbo.io进行訪问 类似的产品有Hessian.spring httpinvoke 等. Dubbo的亮点总结例如以下: 1.服务注冊 ...
- LDAP 后缀操作
创建目录服务器实例之后,必须为服务器的目录信息树(Directory Information Tree,DIT)创建一个或多个后缀.DIT由服务器中的所有条目组成,这些条目使用各自的标识名(Disti ...
- window成员和document成员
输出浏览器成员和DOM成员(以下为safari浏览器测试)(浏览器不同对象成员有差异) window成员 <script type="text/javascript"> ...
- 【iOS开发之C语言】sprintf,strncpy,strcmp三个函数的区别
strncpy 这个函数用于将源字符串的内容拷贝到目标字符串,会覆盖掉目标字符串的之前内容 ] = "love"; char str2[] = "cool"; ...
- 使用F#开发量化模型都缺什么?
量化模型多数是基于统计的,因此,统计运算库应该是必备的.在Matlab.R中包含了大量的统计和概率运算,可以说拿来就用,非常方便,相比之下,F#的资源就很少了,这里给大家提供几个链接,可以解决一部分问 ...
- div+css不间断滚动字幕
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- uva 11038 - How Many O's?
想法: 將問題簡化為求1~m 0的總數,以及1~n 0的總數,然後最後再相減. 求1~n 0的總數,要將n分別算每個位數0的個數,舉例如30324: 先從右邊第一位'4'開始,其左邊為3032,表示1 ...
- uva 296 - Safebreaker
枚举法 #include <cstdio> using namespace std; int main() { int t, n, i, j, k; scanf("%d" ...
- MySql中查询表中的列名
例如我的数据库名为"example",使用 USE example; 确定使用example数据库.使用 show tables; 显示数据库中的所有表.使用 DESC perso ...
- 校门外的树 - Grids2808
校门外的树 问题描述: 某校大门外长度为 L 的马路上有一排树,每两棵相邻的树之间的间隔都是1 米.我们 可以把马路看成一个数轴,马路的一端在数轴0 的位置,另一端在L 的位置:数轴上的每 个整数点, ...