之前有一些关于裸机的帖子,主要是用ucosii,有一些相关的移植和小结,得益于一些瞎折腾,才有了这篇在rawos上的组件移植的帖子。lua相关的我就不做介绍了可以参考我前面的帖子(第一篇帖子主要是介绍和其他平台移植相关,第二篇主要在5、6楼中有初步移植问题讨论)。
helper2416_lua5.2移植_效率测试
helper2416_rawos_ping测试
我从rawos的git中fork了一份代码,后面会添加一些组件移植和现有组件的测试工作,需要的朋友可以直接从git获取代码地址如下
- https://git.oschina.net/camel.shoko/helper2416.git
复制代码
基础的移植参考第一篇帖子中的描述,不再重复了。说说raw-os中移植遇到的问题,最初我使用raw_malloc.c中的内存分配方案替换lua中的内存分配,测试发现问题出在下面这几个宏上面,是c的标准库用法,我仿真跟踪了会跳来跳去,没有规律,看来基于堆栈的虚拟机不能随便使用malloc分配方案了。索性用微型库的内存分配方法。
- #define LUAI_THROW(L,c) longjmp((c)->b, 1)
- #define LUAI_TRY(L,c,a) if (setjmp((c)->b) == 0) { a }
- #define luai_jmpbuf jmp_buf
复制代码
卡死了这里
好吧说说现在如何解决,相关内存分配的方案可以参考我之前的帖子,细节的也就不说了,大家自己看。
helper2416_内存分配实现_有分析
修改luaxlib.c中的下面的函数如下
- static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
- /* not used */
- (void)ud; (void)osize;
- if (nsize == 0) {
- free(ptr);
- //raw_free(ptr);
- return NULL;
- } else {
- return realloc(ptr, nsize);
- //return raw_realloc(ptr, nsize);
- }
- }
复制代码注意这里是内存分配函数指定,多看一些开源的代码,对搞c的很有帮助,人家的代码写的确实漂亮,羡慕不来的。
好了添加一个CLI用于测试lua,方法老样子的测试加法效率和c比较,结果还是很不错的。
- extern RAW_S32 cmd_lua_test(RAW_S8 *pcWriteBuffer, RAW_U32 xWriteBufferLen, const RAW_S8 * const pcCommandString);
复制代码
- RAW_S32 cmd_lua_test(RAW_S8 *pcWriteBuffer, RAW_U32 xWriteBufferLen, const RAW_S8 * const pcCommandString)
- {
- RAW_SR_ALLOC();
-
- RAW_CRITICAL_ENTER();
- Lua_Efficiency_Test();
- RAW_CRITICAL_EXIT();
-
- return 1;
- }
复制代码- rsh_register_command(&lua_shell_cmd,&lua_shell_item);
复制代码
注册这个命令就好了,等系统运行了就直接执行lua吧。
关于内存划分的一些简单说明
1)修改原始的内存池
- #define HEAP_ADDRESS_START 0x30200000
- #define HEAP_ADDRESS_END 0x30400000
复制代码 2)添加堆栈(分散加载描述文件)
- LR_ROM1 0x30800000 0x2800000 { ; load region size_region
- RW_ROM1 0x30800000 0x2800000 { ; load address = execution address
- *.o (RESET, +First)
- .ANY (+RO +RW)
-
- }
- RW_RAM1 0x33000000 0x1000000 {
- .ANY(+ZI)
- }
-
- ARM_LIB_HEAP 0x30400000 EMPTY 0x00200000 {
-
- }
- ARM_LIB_STACK 0x30800000 EMPTY -0x00200000 {
-
- }
-
- }
复制代码这里可以参考之前帖子的分析。
将0x30200000 - 0x30400000 作为RAW_MALLOC
将0x30400000 - 0x30600000 作为HEAP
将0x30600000 - 0x30800000 作为STACK
3)执行的结果
启动
执行
结果
好了,所有源码在前面的git中,可以直接编译执行,有问题欢迎大家讨论,后面会给大家一些lua的例子,展示他的魅力。当然了要做的事情有不少,需要实现文件系统的一些接口,还需要实现一些cli的命令,大家可以加入进来。
大家可以实现CLI如:ls 、 mdkir 、vi等,其实我一直想给这种RTOS移植一个vi编辑器。
好吧,当然了c解释器也很不错,我也想移植。可惜分身乏术,最近公司事情也不少。