Lua 5.1.4 在DSP上的移植

Lua 是 1993年由Waldemar、Luiz和Robero开始开发的一门轻量级的嵌入式语言。相比于其它脚本语言,Lua小巧精致,没有庞大的功能库,有的只是几个最基本的标准库以及唯一的一个数据结构table,然而基于这些基本的特性,我们可以很方便的实现面向对象,函数式编程等特点。不记得是什么时候第一次听说Lua,但是刚开始有印象好像是在玩Angry Birds的时候发现这个游戏的场景文件的扩展名为.lua。曾经一直在猜测魔兽世界的插件是用什么写的,看见Angry Birds应用了Lua,并且听说Lua在游戏行业很受欢迎后,我猜测魔兽世界的插件应该也是用Lua写的,后来证实果然如此。我用了一段时间的Linux了,但是对Linux的命令,Shell脚本编程知之甚少,于是下定决心好好学习Linux,学习脚本编程。我起初瞄准了Perl,因为这门语言的强大的文字处理能力,可以很方便的用于Linux的系统管理。但是Perl很难像SHELL一样交互式的运行,因此我又改为学习Python。Python是一门很优美的语言,我之前也尝试学习过。当时是在windows平台,想学习一些网络编程的知识,不过由于我很懒,没学会什么。比较喜欢Python的matplotlib以及pynum等库,感觉这些库加起来姑且可以代替MATLAB完成一些绘图的任务。但是第一次是用Python的时候,对Python还没有任何的概念。当时是初次接触Linux,喜欢玩弄各种有意思的小程序,当时发现screenlets里的一个花盆的小插件里的花长得实在是太慢了,经过折腾我发现可以看这个插件的源码,当时真的还不知道Python,以为是JavaScript什么的,反正不管怎样,我发现能够看懂这些代码是什么意思,并且我成功的修改了几个参数使的花生长的很快了。这足见Python语言的强悍之处,不用会Python也能够读懂并且修改他的代码,这个“只写”语言Perl就不敢想象了。说了这么多还是没有扯到Lua上,只是交代一下我与脚本语言纠结的短暂的历史。话说在研究Syslinux,想自己做一个U盘mini Linux系统,(至于为什么选择Syslinux而不是Grub2是因为我发现OpenSUSE的GOME3 LiveCD的启动画面很漂亮,后来发现好像是用Syslinux与Gfxboot技术实现的),下载了Syslinux的源码发现里面有Lua模块,这时意识到Lua的小巧与精致。当然我可不会用Lua。之后感兴趣的简单学习了一下Lua,本以为这门语言这么小,应该能够很好学。。。

言归正传,话说Lua是一门嵌入式语言,具有优良的可移植性。与其它语言、项目的可移植性不同的是Lua不是通过条件编译来指定不同的平台的,Lua是基于ANSI C 层面的可移植。也就是说整个Lua都是是用ANSI C写的,所有提供ANSI C运行时环境的平台都可以编译Lua。(当然Lua中确实有些平台相关的东西,我还不会,暂且不提)。由于最近在实验室学习DSP,而TI公司为DSP提供了近乎整个的C运行时环境,所以好奇的我就这么把风马牛不相及的Lua编程语言与DSP联系起来了,(其实我还打算 Lua on AVR 来着)。

我的最基本目的就是把Lua放到DSP上跑起来,哪怕只是简单的交互一下(下一步打算真真正正的开发一些底层的库来供Lua调用,使用Lua胶水语言的特性来开发DSP程序,但是目前还没有开始)。在CCS中新建一个工程,写一个cmd文件,并且添加Lua源码目录src下的全部.c文件到工程中,编译。。。基本上所有的文件都能编译过去,但是还是有错误说找不到,好吧,其实我觉得这些应该没什么用。很奇怪的是TI的TMS320C6000 Optimizing Compiler v 6.1 User's Guide上说支持整个的C标准库,于是乎我下载了一个较心的cgtools,这回的确就好使了。之后没有出现过编译错误。只是最后在连接的时候说找不到_system,这就怪了,明明支持整个的C标准库,并且头文件中真的就有system的声明,怎么就没有了_system呢? 这时由于对Lua还只是Hello World的认识,我也不知道如何的修改Lua的源码。于是乎回图书馆借了本Lua的书,在电子工艺实习的时候偷摸看了看,发现OS等都是Lua的库,这个就应该可以选择性的取出,于是乎继续回到实验室,将loslib从工程中移除,并且修改了启动时加载模块的顺序,将loslib移除,于是乎一切编译成功,运行之。。。虽然是可以运行了,但是打印了一行出错信息说是Block too big 云云。。 借助CCS的调试功能以及source insight(好吧,到这我得声明虽然在寝室自己的电脑上是用Ubuntu,但是在实验室还是要用windows的),很快发现出错的原因是在DSP环境下,main函数的参数argc=0,argv=0x00000000,而Lua千算万算没有算到当移植到DSP上的时候会出现argc<0的BUG。。Lua的代码中为了确定参数的数量handle_script..getargs,特意使用了

int argc = 0; while (argv[argc]) argc++; 

就这个。。无语,DSP中主函数的参数argv相当于指向NULL:0x00000000,并没有赋值,于是乎以上代码的结果变得不可预期,在我的实际情况中argc编程一个很大的数,因此出现了block too big的问题。。好吧,既然系统没有给我argc,以及argv那我就自己伪造一个吧,

 

int margc=1; char *margv[]={"Lua",NULL}; ... s.argc = margc; s.argv = margv; ...


这回Lua真的可以运行了,得到上面的截图。因为CCS中的C lib的I/O函数都是映射到PC机端的,况且我的DSP开发板还没有键盘,姑且使用这个来验证Lua的极具为威力的可移植性吧。。。

之后我将继续研究如何真正的是用Lua来开发DSP程序。。

你可能感兴趣的:(Lua,on,DSP)