2024年5月10日 星期五

引用Lua的一些事

 Lua有分成Load及call二段。Load是將使用者輸入段落轉成binary code。然後用lua_pcall()去執行。

本來是想直接用dll方式引入使用,沒有想到這種型式沒有任何stdio可以用。
用起來可以動作但沒有輸出入,所以判定是沒有用到stdio。只能改用原始碼再引入重編,果然有輸出。
原始的lua.c中有從stdin/stdout做為輸出入。我習慣自己處理輸入而不是用scanf,因為這個函式會卡住其他行程。
故改用loadbuffer()從記憶體做為輸入來源。因為MCU也常常要處理多程序。
再來就是去執行lua_pcall()就會動作。

架好lua核心,當然是要加入使用者要的指令。Lua做得很方便。
使用 luaL_Reg 這個結構矩陣,將指令及函式排起來。最後再用luaLregister()掛進去就可以了。

再來就是寫給Lua調用的C函式。它的外型是固定的,回傳值是放回多少個Lua回傳數目。
以我最常用的招呼函式來寫,會是以下的樣子。




要取用輸入參數,範例如下:
就是取用參數1做為要用的axis,參數2為要啟用的狀態。



要放入回傳值給Lua的範例如下:

可以看到有push三個數值,就是要給lua的值,最後return值就是數目,故這裏給的是3


在某些平台上有時會遇到一個問題,在載入使用者函式庫就當掉,回報原因是釋放了一個空指標。
我又回去看lua.c 發現在載入函式庫時要先停用GC(垃圾收集器),載完後再啟用。