2.增加檔案stm32_lua_config.c,其內容如下,主要是重定義lua中檔案操作的底層函式(即fopen、fread、fclose等函式要呼叫的函式):
#include "includes.h"
#include "lcd_get_res.h"
#include "ff.h"
#pragma import(__use_no_semihosting_swi)
#pragma import(_main_redirection)
const char __stdin_name[150];
const char __stdout_name[150];
const char __stderr_name[150];
typedef int filehandle;
void _sys_exit(int status)
filehandle _sys_open(const char *name, int openmode)
if(openmode & 0x01)
if(openmode & 0x10)
if(openmode & 0x0100)
ret = f_open(&sd_file, name, mode);
if(ret != fr_ok)
return 1;
}int _sys_close(filehandle fh)
int _sys_write(filehandle fh, const unsigned char *buf, unsigned len, int mode)
int _sys_read(filehandle fh, unsigned char*buf, unsigned len, int mode)
// read_len -=cou_sd;
// i += cou_sd;
// if(read_len <= 0 || cou_sd == 0)
//
// }
return i;
}//若此處重定義了fgetc則fread不會呼叫_sys_read
int fgetc(file *stream)
return ch;
}int _sys_seek(filehandle fh, long pos)
return 0;
}int _sys_istty(filehandle fh)
int _sys_ensure(filehandle fh)
long _sys_flen(filehandle fh)
int _sys_tmpnam(char *name, int fileno, unsigned maxlength)
void _ttywrch(int ch)
time_t time(time_t *t)
int remove(const char *filename)
char *_sys_command_string(char *cmd, int len)
clock_t clock(void)
int system(const char* a)
int rename(const char *a, const char *b)
3.在2中已經重新定義了lua中的檔案操作的底層函式,但是lua中有一些函式如lual_dofile需要從檔案目錄中載入.lua程式,這時我們只需實現上面的_sys_open、_sys_close、fgetc等函式再修改luaconf.h即可,在2中我已經實現檔案操作一些函式的介面,修改luaconf.h:
在luaconf.h 190行左右有如下**:
#define lua_root "/usr/local/"
#define lua_ldir lua_root "share/lua/" lua_vdir "/"
#define lua_cdir lua_root "lib/lua/" lua_vdir "/"
#define lua_path_default \
lua_ldir"?.lua;" lua_ldir"?/init.lua;" \
lua_cdir"?.lua;" lua_cdir"?/init.lua;" \
"./?.lua;" "./?/init.lua"
#define lua_cpath_default \
lua_cdir"?.so;" lua_cdir"loadall.so;" "./?.so"
上面及時lua尋找檔案的乙個預設路徑,因我們不存在這些路徑,把它修改為我們自己的sd卡路徑或其他儲存裝置路徑即可,這裡我用的是sd卡,把上面注釋,修改如下:
#define lua_path_default "1:/lualib/?.lua;"
#define lua_cpath_default "1:/lualib/?.so;"
4.上面的工作做完就可以執行在sd卡中的lua程式了,舉例如下:
c程式:
static int delay_ms(lua_state *l)
static int print(lua_state *l)
return 0;
}static lual_reg lualib1_0 =
, ,
};void lua_task(void)
lua.lua中程式:
local lualib1_0 = require("lualib1_0")
windows =
local i = 0
function window2()
i = i + 1;
if i == 256 then
i = 0
end
endfunction window1()
i = i + 1;
if i == 256 then
i = 0
endendfunction window_handle()
window_cur = window1
if window_cur == windows.window1 then
window1()
elseif window_cur == windows.window2 then
window2()
end
endfunction lua_main()
while true do
window_handle()
lualib1_0.delay_ms(200)
endendlua_main()
這樣就可以把c和lua分開,在lua中寫自己的應用程式了,lua中想要什麼資料由c提供。
以上內容均為自己理解,如有錯誤,歡迎指正
在STM32上移植FreeRTOS
freertos是乙個迷你的實時作業系統核心。作為乙個輕量級的作業系統,功能包括 任務管理 時間管理 訊號量 訊息佇列 記憶體管理 記錄功能 軟體定時器 協程等,可基本滿足較小系統的需要。開啟後如下如顯示 為了避免出錯,請將路徑改為全英文 將主程式改為如下 include freertos.h in...
uCos在stm32上的移植總結
作業系統 windows xp 開發環境 keil uvision3 mdk 實驗開發板 open103z 一 準備 2 ucos ii 原始碼 移植版本 3 stm32標準外設庫 stm32標準外設庫是stm32全系列晶元的外設驅動 4 jlink 器驅動程式 找不到官網 二 建立工程資料夾結構 ...
MQTT協議在STM32上的移植
mqtt協議在stm32上的移植 開發平台 軟體環境 硬體環境 參考文件 本篇是mqtt在stm32裝置上的移植,因此使用paho的嵌入式c 庫,原始碼位址 移植 首先,需要將 paho.mqtt.embedded c mqttpacket 中的所有檔案新增到keil工程檔案,然後參考 paho.m...