弱性能穿戴设备App化之Lua For STM32

弱性能穿戴设备App化之Lua For STM32,第1张

概述今年穿戴设备突然火起来......穿戴设备与概念未爆发前的电子产品不同于“可联网”和“支持app”,使得一个封闭的小玩意可以加入多人的想象,屌丝的想象力很丰富的说.... 穿戴设备目前分为"屌丝“和”高富帅“两档配置,所谓”屌丝”配置也就是弱得装不上android,未来一段时间内,手表和手环都以“屌丝”配置为主,例如pebble和sony手表以arm cortex m3芯,不过"高富帅"geek

今年穿戴设备突然火起来......穿戴设备与概念未爆发前的电子产品不同于“可联网”和“支持app”,使得一个封闭的小玩意可以加入多人的想象,屌丝的想象力很丰富的说....

穿戴设备目前分为"屌丝“和”高富帅“两档配置,所谓”屌丝”配置也就是弱得装不上androID,未来一段时间内,手表和手环都以“屌丝”配置为主,例如pebble和sony手表以arm cortex m3芯,不过"高富帅"geek watch用上androID....

吹完水,就说本文的重点,如何让弱性能设备支持app,也就是把lua移植到stm32.....本文代码可以到这里(http://download.csdn.net/detail/hellogv/5721915)下载。

手上的板子是STM32F103RCT6 FLASH 256K RAM 48K,配置低得勉强跑得动Lua。开发环境是IAR For ARM 6.4,以后也方便使用eclipse cdt,移植重点:


1.下载lua:http://www.lua.org/download.html,本文用Lua 5.2.2;


2.把/lua/src里的文件全部copy到IAR for STM32 工程;


3.在IAR for STM32 模版工程,workspace下面新建lua文件夹,添加所有源文件:


4. 修改工程配置





5.把lua.c和luac.c 从工程中删除,否则编译过程中会提示 Error[li006]: duplicate deFinitions for "main";


6.修改stm32f10x_flash.icf,否则编译通过,运行会提示内存不足:
define symbol __ICFEDIT_size_cstack__   = 0x00008000;
define symbol __ICFEDIT_size_heap__     = 0x00002000;


除了移植之后,本文程序还通过计算运算耗时,通过循环加法运算对比luc跟c在运算效率上的对比,源码如下:

[cpp] view plain copy print ? #include "stm32f10x_conf.h"   #include "stm32f10x_lib.h"   #include "stm32f10x_systick.h"   #include <math.h>   #include "lua.h"   #include "lauxlib.h"   #include "lualib.h"      voID RCC_Init(voID) {       /* 定义枚举类型变量 HSEStartUpStatus */       ErrorStatus HSEStartUpStatus;          /* 复位系统时钟设置 */       RCC_DeInit();       /* 开启 HSE */       RCC_HSEConfig (RCC_HSE_ON);       /* 等待 HSE 起振并稳定 */       HSEStartUpStatus = RCC_WaitForHSEStartUp();       /* 判断 HSE 起是否振成功,是则进入if()内部 */       if (HSEStartUpStatus == SUCCESS) {           /* 选择 HCLK(AHB)时钟源为SYSCLK 1分频 */           RCC_HCLKConfig (RCC_SYSCLK_div1);           /* 选择 PCLK2 时钟源为 HCLK(AHB)1分频 */           RCC_PCLK2Config (RCC_HCLK_div1);           /* 选择 PCLK1 时钟源为 HCLK(AHB)2分频 */           RCC_PCLK1Config (RCC_HCLK_div2);           /* 设置 FLASH 延时周期数为2 */           FLASH_SetLatency (FLASH_Latency_2);           /* 使能 FLASH 预取缓存 */           FLASH_PrefetchBufferCmd (FLASH_PrefetchBuffer_Enable);           /* 选择锁相环(PLL)时钟源为 HSE 1分频,倍频数为9,则PLL输出频率为 8MHz * 9 = 72MHz */           RCC_PLLConfig(RCC_PLLSource_HSE_div1, RCC_PLLMul_9);           /* 使能 PLL */           RCC_PLLCmd (ENABLE);           /* 等待 PLL 输出稳定 */           while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == reset)               ;           /* 选择 SYSCLK 时钟源为 PLL */           RCC_SYSCLKConfig (RCC_SYSCLKSource_PLLCLK);           /* 等待 PLL 成为 SYSCLK 时钟源 */           while (RCC_GetSYSCLKSource() != 0x08)               ;       }          /* 使能各个用到的外设时钟 */       RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA,               ENABLE);   }      voID GpioInit(voID) {       /* 定义 GPIO 初始化结构体 GPIO_InitStructure */       GPIO_InitTypeDef GPIO_InitStructure;          /* 设置 USART1 的Tx脚(PA.9)为第二功能推挽输出功能 */       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       GPIO_Init(GPIOA, &GPIO_InitStructure);          /* 设置 USART1 的Rx脚(PA.10)为浮空输入脚 */       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_floatING;       GPIO_Init(GPIOA, &GPIO_InitStructure);   }      voID Usartinit(voID) {       /* 定义 USART 初始化结构体 USART_InitStructure */       USART_InitTypeDef USART_InitStructure;       /* 定义 USART 初始化结构体 USART_ClockInitStructure */       USART_ClockInitTypeDef USART_ClockInitStructure;          USART_ClockInitStructure.USART_Clock = USART_Clock_disable;       USART_ClockInitStructure.USART_CPol = USART_CPol_Low;       USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;       USART_ClockInitStructure.USART_LastBit = USART_LastBit_disable;       USART_ClockInit(USART1, &USART_ClockInitStructure);          USART_InitStructure.USART_Baudrate = 9600;       USART_InitStructure.USART_WordLength = USART_WordLength_8b;       USART_InitStructure.USART_StopBits = USART_StopBits_1;       USART_InitStructure.USART_Parity = USART_Parity_No;       USART_InitStructure.USART_HarDWareFlowControl =               USART_HarDWareFlowControl_None;       USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;       USART_Init(USART1, &USART_InitStructure);          /* 使能 USART1 */       USART_Cmd(USART1, ENABLE);   }      /*******************************************************************************   * 函数名          : fputc   * 函数描述     : 将printf函数重定位到USATR1   * 输入参数     : 无   * 输出结果     : 无   * 返回值      : 无   *******************************************************************************/   int fputc(int ch, file *f) {       USART_SendData(USART1, (u8) ch);       while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == reset)           ;       return ch;   }      const char LUA_SCRIPT[] = "function loop_add(a, b,t)            "           "   local sum = 0                   "           "   for i = 1, t do          "           "       sum = sum + a + b           "           "   end                             "           "   return sum                      "           "end                                "           "                                   ";      u32 c_loop_add(int a,int b,int t){     u32 result=0,i=0;     for(i=0;i<t;i++){       result = result + a+ b;     }     return result;   }      int use_lua_add(lua_State *L, const char *func_name, int x, int y, int t) {       int sum;       /*装载脚本*/       lua_getglobal(L, func_name);       /* 第一个参数 */       lua_pushnumber(L, x);       /* 第二个参数 */       lua_pushnumber(L, y);       /* 第三个参数 */       lua_pushnumber(L, t);       /* 调用函数,告知有三个参数,一个返回值 */       lua_call(L, 3, 1);       /* 得到结果 */       sum = (int) lua_tointeger(L, -1);       lua_pop(L, 1);       return sum;   }      /**   * 开始计算耗时,不适合太耗时的计算   */   voID start_calculate_time() {       SysTick_CLKSourceConfig (SysTick_CLKSource_HCLK_div8); //(8*9000)*1000=72MHz       SysTick_SetReload(0xFFFFFF); //校准值,开始后不断递减       SysTick_CounterCmd (SysTick_Counter_Enable); // 启动SysTick定时器      }      /**   * 停止计算耗时,不适合太耗时的计算   */   u32 stop_calculate_time() {       SysTick_CounterCmd (SysTick_Counter_disable); // 关闭SysTick定时器       u32 result = 0xFFFFFF - SysTick_GetCounter(); //得到时间差       SysTick_CounterCmd (SysTick_Counter_Clear); //清0       result = result / 9000; //除以9000->result的单位为ms       return result;      }   int main() {       RCC_Init();       GpioInit();       Usartinit();          lua_State *L = luaL_newstate();       if (L == NulL)           printf("cannot create state: not enough memory");          luaopen_base(L); //48kb内存紧张,用luaL_openlibs加载所有模块,会自动退出          luaL_dostring(L, LUA_SCRIPT);          int i;       for (i = 10000; i < 90000; i=i + 30000) {                    //----计算lua循环加运算的耗时           start_calculate_time();           int sum = use_lua_add(L, "loop_add", 1, i);           u32 duration = stop_calculate_time();           printf("lua %d", i);           printf(" frequency duration(ms): %d\r\n", duration);                   //----计算c循环加运算的耗时                   start_calculate_time();           sum = c_loop_add(1, i);           duration = stop_calculate_time();           printf("c %d", duration);                          }       // 关闭虚拟机       lua_close(L);              while(1){};          }  
lua和C的循环加法运算耗时通过串口输出,简单的lua程序跟C程序效率比是1:100,而 lua运算量越大,与C程序效率差距就越小

总结

以上是内存溢出为你收集整理的弱性能穿戴设备App化之Lua For STM32全部内容,希望文章能够帮你解决弱性能穿戴设备App化之Lua For STM32所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1261614.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存