今年穿戴设备突然火起来......穿戴设备与概念未爆发前的电子产品不同于“可联网”和“支持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)?{??
- ??????
- ????ErrorStatus?HSEStartUpStatus;??
- ??
- ??????
- ????RCC_DeInit();??
- ??????
- ????RCC_HSEConfig?(RCC_HSE_ON);??
- ??????
- ????HSEStartUpStatus?=?RCC_WaitForHSEStartUp();??
- ??????
- ????if?(HSEStartUpStatus?==?SUCCESS)?{??
- ??????????
- ????????RCC_HCLKConfig?(RCC_SYSCLK_Div1);??
- ??????????
- ????????RCC_PCLK2Config?(RCC_HCLK_Div1);??
- ??????????
- ????????RCC_PCLK1Config?(RCC_HCLK_Div2);??
- ??????????
- ????????FLASH_SetLatency?(FLASH_Latency_2);??
- ??????????
- ????????FLASH_PrefetchBufferCmd?(FLASH_PrefetchBuffer_Enable);??
- ??????????
- ????????RCC_PLLConfig(RCC_PLLSource_HSE_Div1,?RCC_PLLMul_9);??
- ??????????
- ????????RCC_PLLCmd?(ENABLE);??
- ??????????
- ????????while?(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)?==?RESET)??
- ????????????;??
- ??????????
- ????????RCC_SYSCLKConfig?(RCC_SYSCLKSource_PLLCLK);??
- ??????????
- ????????while?(RCC_GetSYSCLKSource()?!=?0x08)??
- ????????????;??
- ????}??
- ??
- ??????
- ????RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1?|?RCC_APB2Periph_GPIOA,??
- ????????????ENABLE);??
- }??
- ??
- void?GpioInit(void)?{??
- ??????
- ????GPIO_InitTypeDef?GPIO_InitStructure;??
- ??
- ??????
- ????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);??
- ??
- ??????
- ????GPIO_InitStructure.GPIO_Pin?=?GPIO_Pin_10;??
- ????GPIO_InitStructure.GPIO_Mode?=?GPIO_Mode_IN_FLOATING;??
- ????GPIO_Init(GPIOA,?&GPIO_InitStructure);??
- }??
- ??
- void?UsartInit(void)?{??
- ??????
- ????USART_InitTypeDef?USART_InitStructure;??
- ??????
- ????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);??
- ??
- ??????
- ????USART_Cmd(USART1,?ENABLE);??
- }??
- ??
- ?
- ?
- ?
- ?
- ?
- ?
- ??
- 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);???
- ????SysTick_SetReload(0xFFFFFF);???
- ????SysTick_CounterCmd?(SysTick_Counter_Enable);???
- ??
- }??
- ??
- ?
- ?
- ??
- u32?stop_calculate_time()?{??
- ????SysTick_CounterCmd?(SysTick_Counter_Disable);???
- ????u32?result?=?0xFFFFFF?-?SysTick_GetCounter();???
- ????SysTick_CounterCmd?(SysTick_Counter_Clear);???
- ????result?=?result?/?9000;???
- ????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);???
- ??
- ????luaL_dostring(L,?LUA_SCRIPT);??
- ??
- ????int?i;??
- ????for?(i?=?10000;?i?<?90000;?i=i?+?30000)?{???
- ??????????????????
- ????????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):?%drn",?duration);??
- ??????????????????
- ????????????????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程序效率差距就越小
。

(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|