本文共 5704 字,大约阅读时间需要 19 分钟。
今年穿戴设备突然火起来......穿戴设备与概念未爆发前的电子产品不同于“可联网”和“支持app”,使得一个封闭的小玩意可以加入多人的想象,屌丝的想象力很丰富的说....
穿戴设备目前分为"屌丝“和”高富帅“两档配置,所谓”屌丝”配置也就是弱得装不上android,未来一段时间内,手表和手环都以“屌丝”配置为主,例如pebble和sony手表以arm cortex m3芯,不过"高富帅"geek watch用上android....
吹完水,就说本文的重点,如何让弱性能设备支持app,也就是把lua移植到stm32.....本文代码可以到这里()下载。
手上的板子是STM32F103RCT6 FLASH 256K RAM 48K,配置低得勉强跑得动Lua。开发环境是IAR For ARM 6.4,以后也方便使用eclipse cdt,移植重点:
1.下载lua:,本文用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在运算效率上的对比,源码如下:
- #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, 1, i);
- u32 duration = stop_calculate_time();
- printf("lua %d", i);
- printf(" frequency duration(ms): %d\r\n", duration);
-
- start_calculate_time();
- sum = c_loop_add(1, 1, i);
- duration = stop_calculate_time();
- printf("c %d", i);
- printf(" frequency duration(ms): %d\r\n", duration);
-
- }
-
- lua_close(L);
-
- while(1){};
-
- }
lua和C的循环加法运算耗时通过串口输出,简单的lua程序跟C程序效率比是1:100,而 lua运算量越大,与C程序效率差距就越小 。