今天由於想讓STM32完美的處理字符串,因此就想着讓STM32嵌入lua,原本想用f103c8t6,可是一編譯就提示內存不足......函數
因此單片機的型號選擇的測試
\lua
我下載到了RBT6的芯片上測試的spa
先說一下最終實現的效果吧,就是用lua語言控制單片機的PC13 每間隔500Ms反轉一次.net
實現功能的部分3d
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";
調用部分code
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上,因此,唉,不開心......blog
如今說一下移植(賦值粘貼加修改)的步驟隊列
參考文章內存
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