今天因为想让STM32完美的处理字符串,所以就想着让STM32嵌入lua,本来想用f103c8t6,但是一编译就提示内存不足......
所以单片机的型号选择的
我下载到了RBT6的芯片上测试的
先说一下最终实现的效果吧,就是用lua语言控制单片机的PC13 每间隔500Ms反转一次
实现功能的部分
static int lua_led_on(lua_State *L) { PCout(13) = 1; return 1; } static int lua_led_off(lua_State *L) { PCout(13) = 0; return 1; } static int lua_delay(lua_State *L) { int num; num= lua_tointeger(L, 1); delay_ms(num); return 1; } static const struct luaL_Reg mylib[]= { {"led_on",lua_led_on}, {"led_off",lua_led_off}, {"delay",lua_delay}, {NULL,NULL} }; const char LUA_SCRIPT_GLOBAL[] =" off = 500 on = 500 while 1 do led_on() delay(off) led_off() delay(on) end";
调用部分
while(1) { lua_State *L; L = luaL_newstate(); /* 建立Lua运行环境 */ luaopen_base(L); luaL_setfuncs(L, mylib, 0); luaL_dostring(L, LUA_SCRIPT_GLOBAL); /* 运行Lua脚本 */ while(1);
其实虽然可以了,但是也没什么感觉....因为可能需要裁剪很多功能才能运行在c8t6上,所以,唉,不开心......
现在说一下移植(赋值粘贴加修改)的步骤
参考文章
https://blog.csdn.net/tinyfar/article/details/73727484
首先是下载Lua的源码
http://www.lua.org/ftp/lua-5.3.5.tar.gz
下载之后
把这个文件夹拷贝出来
放在自己的工程目录下,位置随意,只要自己知道就行,因为需要手动设置告诉软件一些.h的位置,这个大家应该知道
设置头文件位置
现在可以编译
可能会报这种错误
按理说这样其实可以测试了,,我的源码还修改了个地方
其实就是重定向一些函数
现在看主函数
#include "include.h" #include "main.h" #include "lua.h" #include "lauxlib.h" #include "lualib.h" const char __stdin_name[150]; const char __stdout_name[150]; const char __stderr_name[150]; typedef int FILEHANDLE; FILEHANDLE _sys_open(const char *name,int openmode) { return 0; } int _sys_close(FILEHANDLE fh) { return 0; } int _sys_write(FILEHANDLE fh, const unsigned char *buf, unsigned len, int mode) { return 0; } int _sys_read(FILEHANDLE fh, unsigned char*buf, unsigned len, int mode) { return 0; } //检查句柄是否为终端 int _sys_istty(FILEHANDLE fh) { return 0; } int _sys_seek(FILEHANDLE fh, long pos) { return 0; } //刷新句柄关联的缓冲区 int _sys_ensure(FILEHANDLE fh) { return 0; } //返回文件当前长度 long _sys_flen(FILEHANDLE fh) { return 0; } void _sys_exit(int status) { //while(1); } int _sys_tmpnam(char *name, int fileno, unsigned maxlength) { return 0; } //将一个字符写入控制台 void _ttywrch(int ch) { } int remove(const char *filename) { return 0; } char *_sys_command_string(char *cmd, int len) { return NULL; } static int lua_led_on(lua_State *L) { PCout(13) = 1; return 1; } static int lua_led_off(lua_State *L) { PCout(13) = 0; return 1; } static int lua_delay(lua_State *L) { int num; num= lua_tointeger(L, 1); delay_ms(num); return 1; } static const struct luaL_Reg mylib[]= { {"led_on",lua_led_on}, {"led_off",lua_led_off}, {"delay",lua_delay}, {NULL,NULL} }; const char LUA_SCRIPT_GLOBAL[] =" off = 500 on = 500 while 1 do led_on() delay(off) led_off() delay(on) end"; int main(void) { NVIC_Configuration(); GpioInit(); Timer2_Config(); Uart123Init(115200,115200,115200); //串口初始化 rbCreate(&Uart1rb,Usart1SendBuff,Usart1SendLen);//创建环形队列--串口1 rbCreate(&Uart2rb,Usart2SendBuff,Usart2SendLen);//创建环形队列--串口2 rbCreate(&Uart3rb,Usart3SendBuff,Usart3SendLen);//创建环形队列--串口3 // FlashReadSaveDataInit();// //ADC_Config();//配置ADC采集(不使用DMA) DMA_ADC_Config();//使用DMA采集ADC DMA_Config(); AdcGpioConfig();//配置ADC采集引脚 // IWDG_Init(IWDG_Prescaler_256,156*5); //时钟40K,分频数为256,156.25HZ,6.4ms;喂狗最小间隔5S while(1) { lua_State *L; L = luaL_newstate(); /* 建立Lua运行环境 */ luaopen_base(L); luaL_setfuncs(L, mylib, 0); luaL_dostring(L, LUA_SCRIPT_GLOBAL); /* 运行Lua脚本 */ while(1); // IWDG_Feed();//喂狗 // Testing();//测试函数 // // if(Usart1ReadFlage) // { // Usart1ReadFlage = 0; // PutData(&Uart1rb,USART1,Usart1ReadBuff,Usart1ReadCntCopy); // } } } /** * @brief 测试函数 * @param * @param None * @param None * @retval None * @example **/ void Testing(void) { }
其实就执行了lua语言
实质是Lua调用C
源码下载
链接:https://pan.baidu.com/s/13N0sPkM1f8Egoap0oZCR1g 密码:slxt