7749|5

2144

帖子

3

TA的资源

五彩晶圆(中级)

楼主
 

helper2416_lua5.2移植_效率测试 [复制链接]

好吧,这几天卡壳了,没什么进展,主要是ucos移植不稳定,问题多多,后面很多无法继续,lwip也不稳定,主要是ucos的问题吧。后面有时间在继续吧,先发点别的。目前是在这个不完善的ucos上面跑的,后面我会搞到raw-os上面去,比较简单的,不太复杂,玩玩很不错的。

给大家一点关于lua的参考网站,不了解的可以了解下,效率比较高的虚拟机,脚本语言,虚拟机也比较有特色,寄存器虚拟机/堆栈虚拟机两个典型分支。
主站:         
  1. http://www.lua.org/start.html
复制代码

嵌入式LUA:
  1. https://github.com/elua/elua
复制代码

测评:
  1. http://blog.csdn.net/tcpipstack/article/details/8259179
复制代码


好了,开始我的移植和测试,主要完成一个timer4用于统计执行效率,移植比较简单,下载源码添加到工程中将lua.c和luac.c屏蔽掉


在loslib.c中实现三个函数原型

  1. int system(const char *cmd){
  2.         return 1;
  3. }

  4. time_t time(time_t * data)
  5. {
  6.         time_t tm;
  7.         return tm;
  8. }

  9. void exit(int s)
  10. {
  11.         s++;
  12.         while(1);
  13. }
复制代码
大家可以自行实现,后面了解下elua在看需要完善哪些,我这里简单添加,不影响。

lua和c的循环加法效率测试
  1. /**
  2. *******************************************************************************
  3. * @file       Lua_Efficiency.c
  4. * @author     camel.shoko
  5. * @version    v1.1
  6. * @date       2013/9/27
  7. * @brief      Lua效率测试文件
  8. * @copyright  camel.shoko@gmail.com
  9. *******************************************************************************
  10. */

  11. /* Includes ------------------------------------------------------------------*/
  12. #include <stdio.h>
  13. #include "platform.h"
  14. #include "TIMER4.h"

  15. #include <math.h>
  16. #include "lua.h"
  17. #include "lauxlib.h"
  18. #include "lualib.h"

  19. #include "ucos_ii.h"
  20. #include "Lua_Efficiency.h"

  21. /* Local Variables -----------------------------------------------------------*/
  22. const char LUA_SCRIPT[] = {
  23.         "function loop_add(a, b,t)          "
  24.         "   local sum = 0                   "
  25.         "   for i = 1, t do          "
  26.         "       sum = sum + a + b           "
  27.         "   end                             "
  28.         "   return sum                      "
  29.         "end                                "
  30.         "                                   "
  31. };


  32. /* Global Functions ----------------------------------------------------------*/

  33. /**
  34. * @brief  c_loop_add
  35. * @note   C语言循环加
  36. * @param  none
  37. * @retval none
  38. */
  39. uint32_t c_loop_add(int a,int b,int t)
  40. {
  41.         uint32_t result=0,i=0;
  42.        
  43.         for (i=0;i<t;i++) {
  44.                 result = result + a + b;
  45.         }
  46.         return result;
  47. }

  48. /**
  49. * @brief  lua_loop_add
  50. * @note   Lua循环加
  51. * @param  none
  52. * @retval none
  53. */
  54. int lua_loop_add(lua_State *L, const char *func_name, int x, int y, int t)
  55. {
  56.         int sum;
  57.        
  58.         /*装载脚本*/
  59.         lua_getglobal(L, func_name);
  60.         /* 第一个参数 */
  61.         lua_pushnumber(L, x);
  62.         /* 第二个参数 */
  63.         lua_pushnumber(L, y);
  64.         /* 第三个参数 */
  65.         lua_pushnumber(L, t);
  66.        
  67.         /* 调用函数,告知有三个参数,一个返回值 */
  68.         lua_call(L, 3, 1);
  69.         /* 得到结果 */
  70.         sum = (int) lua_tointeger(L, -1);
  71.        
  72.         lua_pop(L, 1);
  73.         return sum;
  74. }


  75. /**
  76. * @brief  Lua_Efficiency_Test
  77. * @note   Lua效率测试
  78. * @param  none
  79. * @retval none
  80. */
  81. void Lua_Efficiency_Test(void)
  82. {
  83.         #define US_PERCENT                                15
  84.        
  85.         int sum, i;
  86.         uint32_t duration = 0;
  87.         lua_State *L = luaL_newstate();
  88.        
  89.         if (L == NULL) {
  90.                 DEBUG0("Cannot Create State: Not Enough Memory\r\n");
  91.         }
  92.        
  93.         //64kb内存紧张,用luaL_openlibs加载所有模块,会自动退出
  94.         luaopen_base(L);
  95.        
  96.         luaL_dostring(L, LUA_SCRIPT);
  97.         DEBUG0("LUA Module Init Success\r\n");
  98.         TIMER4_Init();
  99.        
  100.         for (i = 2000; i < 20000; i = i + 2000) {
  101.                
  102.                 //计算lua循环加运算的耗时
  103.                 TIMER4_Start();
  104.                 sum = lua_loop_add(L, "loop_add", 1, 1, i);
  105.                 duration = TCNTB4_CFG - TIMER4_Stop();
  106.                 DEBUG2("--Lua_Cnt %06d   Lua_Sum %06d", i, sum);
  107.                 DEBUG1(">>Frequency Duration(us): %06d\r\n", (duration*US_PERCENT));
  108.                
  109.                 //计算c循环加运算的耗时
  110.                 TIMER4_Start();
  111.                 sum = c_loop_add(1, 1, i);
  112.                 duration = TCNTB4_CFG - TIMER4_Stop();
  113.                 DEBUG2("--C_Cnt   %06d   C_Sum %06d", i, sum);
  114.                 DEBUG1(">>Frequency Duration(us): %04d\r\n", (duration*US_PERCENT));
  115.                
  116.         }
  117.         //关闭虚拟机
  118.         lua_close(L);
  119. }

  120. /****************** (C) COPYRIGHT 2013 Camle.shoko ***********END OF FILE******/
复制代码

测试结果如下



其实效率还是很不错的,虚拟机这个速度相当快了,恩我使用的luaopen_base,这个是基础库,如果想使用全部的可以使用luaL_openlibs加载所有模块。
之前在M3上面测试过,用的基础模块,RAM比较吃力,在helper2416上面当然没问题了,随便用,应用也是随便做,最好是在实现一个vi类似的交互编辑。我觉得raw-os确实缺少一个脚本语言的虚拟机,当然lua我认为是非常适合的,玩家也多。后面我会弄到raw-os中,也算是一个不错的组件吧。




最新回复

dingyuige~  详情 回复 发表于 2015-4-23 14:34

赞赏

2

查看全部赞赏

点赞 关注
个人签名电工

回复
举报

2144

帖子

3

TA的资源

五彩晶圆(中级)

沙发
 
分享我的timer4驱动程序,注意定时器是16位的,不要溢出了,大家在使用的时候

  1. /**
  2. *******************************************************************************
  3. * @file       TIMER4.c
  4. * @author     camel.shoko
  5. * @version    v1.1
  6. * @date       2014/05/26
  7. * @brief      S3C2416 TIMER4驱动
  8. * @copyright  camel.shoko@gmail.com
  9. *******************************************************************************
  10. */


  11. /* Includes ------------------------------------------------------------------*/
  12. #include "platform.h"
  13. #include "irq.h"
  14. #include "clk_get.h"
  15. #include "TIMER4.h"


  16. /* Local Variables -----------------------------------------------------------*/
  17. volatile int OneSec = 0;


  18. /* Local Functions -----------------------------------------------------------*/

  19. /**
  20. * @brief  TIMER4_ISR_Service
  21. * @note   TIMER4设置波特率
  22. * @param  none
  23. * @retval none
  24. */
  25. static void TIMER4_ISR_Service(void)
  26. {
  27.         /* 置位清除 */
  28.         SRCPND_REG |= (0x01<<14);       
  29.         /* 置位清除 */
  30.         INTPND_REG |= (0x01<<14);
  31.        
  32.         OneSec++;
  33.         DEBUG0("TIM4");
  34. }


  35. /**
  36. * @brief  TIMER4_ISR_Init
  37. * @note   TIMER4中断初始化
  38. * @param  none
  39. * @retval none
  40. */
  41. static void TIMER4_ISR_Init(void)
  42. {
  43.         INTMOD_REG                         = 0x00000000;
  44.         PRIORITY_MODE_REG         = 0x00000000;
  45.        
  46.         /* 使能TIMER4中断 */
  47.         INTMSK_REG &= ~(0x01<<14);               
  48. }


  49. /* Global Functions ----------------------------------------------------------*/

  50. /**
  51. * @brief  TIMER4_Init
  52. * @note   TIMER4初始化
  53. * @param  none
  54. * @retval none
  55. */
  56. void TIMER4_Init(void)
  57. {
  58.         /*
  59.          * TIMER INPUT_CLK = PCLK/{Precaler+1}/{Divider_Value}
  60.          *
  61.          * TIMER INPUT_CLK = PCLK/(15+1)/4 = PCLK/64
  62.          *
  63.          * TCNTB0_REG = INPUT_CLK/OS_TICKS_PER_SEC = get_PCLK()/(64*OS_TICKS_PER_SEC)
  64.          */
  65.        
  66.        
  67.         /* 使用TIMER4前,清除相关配置 */
  68.         TCON_REG  &= ~(0x07<<20);                       
  69.         TCFG0_REG &= ~(0xFF<<8);               
  70.         TCFG1_REG &= ~(0x0F<<16);

  71.         TIMER4_ISR_Init();

  72.         register_irq(14, TIMER4_ISR_Service);
  73.        
  74.         /* TIMER4_Prescaler=255*/
  75.         TCFG0_REG |= (0xFF<<8);       
  76.        
  77.         /* TIMER4_Divider_Value=1/4 */       
  78.         TCFG1_REG |= (0x01<<16);       

  79.         TCNTB4_REG = TCNTB4_CFG;

  80.         /* 更新TCNTB4 */
  81.         TCON_REG |= (0x02<<20);       
  82.        
  83.         /* 手动更新位必须在下次写前清除 */       
  84.         TCON_REG &= ~(0x02<<20);       
  85.        
  86.         /* 自动重装,启动定时器 */       
  87.         TCON_REG |= (0x05<<20);       
  88.        
  89. }

  90. /**
  91. * @brief  TIMER4_Start
  92. * @note   TIMER4启动
  93. * @param  none
  94. * @retval none
  95. */
  96. void TIMER4_Start(void)
  97. {
  98.         TIMER4_Init();
  99. }


  100. /**
  101. * @brief  TIMER4_Stop
  102. * @note   TIMER4停止
  103. * @param  none
  104. * @retval none
  105. */
  106. int TIMER4_Stop(void)
  107. {
  108.     TCON_REG &= ~(0x1 << 20); //定时器停止
  109.         return TCNTO4_REG;
  110. }

  111. /****************** (C) COPYRIGHT 2014 Camle.shoko ***********END OF FILE******/
复制代码


 
个人签名电工
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

板凳
 
有任何问题大家可以在帖子中提出,大家一起讨论
活跃一点 哈哈
 
个人签名电工
 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

4
 
继续贴一个图,在stm32上面运行的效率测试



 
个人签名电工
 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

5
 
注意此贴中未采用rtos,仅仅将lua移植到helper2416上,用于验证基础移植和效率测试
后面帖子中有整合到rawos下,代码跟新到oschina的git上面,大家可以下载
 
个人签名电工
 
 

回复

267

帖子

0

TA的资源

一粒金砂(高级)

6
 
dingyuige~
 
个人签名

gitee/casy

 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表