將Lua直譯器移植到STM32

2021-07-10 03:51:17 字數 2694 閱讀 2926

這是我第一次寫部落格,當然在這之前已經學了會兒微控制器和c語言,這兩天突然有乙個新想法:把lua移植到stm32上去,網上搜了一下,好像非常簡單,所以我就立馬開始嘗試。到

lua官網

lua 5.3.2

的**,先是用gcc編譯了乙個lua直譯器試試手,熟悉下lua語法,然後又在vs2015下建了工程(個人比較喜歡用vs的介面。。。),看看lua原始碼的大概組織編排,折騰了一會兒後我就琢磨著移植到stm32了。 

我用的keil 5.17,開發板是stm32f429i discovery,剛好之前寫了乙個gui庫,就直接拿這個做顯示了。移植的過程沒有想象中的順利,開始我按網上說的不使用microlib,編譯是過了,但是微控制器上根本不執行(實際上是缺少一些c標準庫函式),折騰了大概一天才把這事解決。廢話不多說,就直接上移植方法吧。 

首先是吧lua原始碼解壓會得到乙個src資料夾,把src下的原始碼新增到stm32的工程裡,設定好包含路徑,

注意lua.c 和 luac.c 這兩個檔案是不包含的

(它們包含pc上lua直譯器和編譯器的main函式)。然後我寫了乙個簡單的函式來實現直譯器:

/* 測試的lua**字串 */

const char lua_test = ;

/* 執行lua */

void lua_main(void)

我還沒有做檔案方面的功能,直接把lua指令碼儲存到字串lua_test裡。lua指令碼的執行就靠lua_main()函式來完成。由於微控制器的io系統不同於pc,我們需要重新實現print函式的底層,lua的print函式的c語言實現部分是lbaselib.c檔案的luab_print()函式,我把底層的輸出列印到了乙個字串luabuffer(比較簡單嘛

char luabuffer[500] = ""; /* 輸出快取陣列 */

static int luab_print (lua_state *l)

/* 我自己定義的輸出(輸出到字串) */

sprintf(str, "%s", s);

str += l; /* 跳過字串的長度 */

lua_pop(l, 1); /* pop result */

} sprintf(str, "\n"); /* 輸出乙個換行符 */

return 0;

}

此外我還修改了lua記憶體管理的底層函式(在lauxlib.c中):

/* 修改了free()和realloc()函式 */

static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize)

else

return myrealloc(sdramex, ptr, nsize); /* 修改 */

}

myfree()和myrealloc()函式是從正點原子的動態記憶體分配程式裡來的,l_alloc()函式也可以不改,在使用microlib的時候是可以使用free()和realloc()函式的,這時就得在啟動檔案裡把堆(heap_size)設定的足夠大,我試過0x00008000(32kb)是沒問題的,其實要不了這麼多。

建議把棧設定的大一點

(1kb足夠)。

到這裡應該

編譯之後報錯說time(), exit(), system()這三個標準庫函式沒有定義,這個好說,直接寫三個不就完了。。。

/* 定義microlib沒有的函式 */

time_t time(time_t * time)

void exit(int status)

int system(const char * string)

好,現在終於可以執行了,拍張**,順便演示一下我的gui:

這段lua原始碼也貼出來:

print("hello,i am lua!\n--this is newline printf")

function foo()

local i = 0

local sum = 1

while i <= 10 do

sum = sum * 2

i = i + 1

endreturn sum

endprint("sum =", foo())

print("and sum = 2^11 =", 2 ^ 11)

print("exp(200) =", math.exp(200))

**上的執行結果跟pc上是一致的。

最後說下題外話,其實移植指令碼語言直譯器並非我一時興起,很久前就想做了,只是移植沒找到合適的語言,以前用ti的nspire計算器聽說過lua語言,lua雖然沒去研究,卻也聽說過了lua的效率,後來我也做了些東西了,c語言有了點積累,造輪子的衝動慢慢在心裡萌芽,去年暑假我開始寫乙個gui,不過後來似乎有在抄uc/gui之嫌了

臥槽,第一次寫部落格儲存時還斷網。。。人品真是爆了

FreeRTOS 移植到STM32記錄

新建乙個不包含中文路徑的資料夾名字為freertos,如下圖所示 freertos資料夾內容如下圖所示 其中heap 4.c檔案的路徑是 freertos freertosv9.0.0 freertos source portable memmang,port.c件的路徑是 freertos fre...

lua在stm32上的移植

2.增加檔案stm32 lua config.c,其內容如下,主要是重定義lua中檔案操作的底層函式 即fopen fread fclose等函式要呼叫的函式 include includes.h include lcd get res.h include ff.h pragma import us...

stm32移植ecos,移植ucgui到ecos

ucgui是乙個開源的輕型嵌入式gui,使用廣泛,資料豐富,功能完整,尤其適合嵌入式產品的gui。只是它開源但不免費。僅管如此,移植來玩玩還是可以的。ucgui設計優秀,具有良好移植性,配合ecos framebuf優秀框架,可以讓你很快見到ucgui呈現的精美顯示介面。本文主要介紹了ucgui移植...