在STM32F103中运行LUA时报错“unexpected symbol”

我已经成功地将LUA编译到STM32F103中,并且下面的代码是可以的:

const char lua_test[] = "print(\"Hello Lua!!\")";
lua_State *L;
L = luaL_newstate();
luaL_openlibs(L);
luaopen_base(L);
luaL_dostring(L, lua_test);
lua_close(L);

串口中正确显示出字符串。 但是当我将print函数放入外部SD卡中的文件中,并尝试将“dostring”替换为“dofile”,像这样:

lua_State *L;
L = luaL_newstate();
luaL_openlibs(L);
luaopen_base(L);

if (luaL_dofile(L, "1:/2.txt")!=0) //Run 2.txt in SD card
      USART1_Send_String(lua_tostring(L,-1));
lua_close(L);

串口显示一个错误信息“1:/2.txt:1: unexpected symbol”,函数“luaL_dofile”返回3。 错误信息中没有任何提示,如“near XXX”。

我已经覆盖了“_sys_open”和“_sys_read”,并确信文件“1:/2.txt”被正确读取。 我尝试将2.txt的内容更改为任何内容,包括仅包含一个新行和空格,但仍然收到相同的错误。

如何解决这个问题,或者我如何获得更进一步的错误消息? 请帮我,任何建议都会受到赞赏。

PS:我正在使用官方lua 5.3.4。它需要至少7.5KB的RAM和65K ROM。我在STM32F103ZET6的64KB内部RAM中分配了4KB堆栈和16K堆空间。通过“luaL_dostring”运行lua代码没有问题,但调用“luaL_dofile”时发生错误。

点赞
用户6425715
用户6425715

我试图覆盖“fgetc”而不是“_sys_read”,它可以正常工作。但我认为一个字符一个字符地读取文件可能会导致IO性能不佳。最后,我发现“_sys_read”的返回值应该是剩余需要读取的长度而不是已经读取的长度。在像下面这样更正“_sys_read”函数后,“luaL_dofile”函数现在可以正常运行。

int _sys_read(FILEHANDLE fh, unsigned char*buf, unsigned len, int mode)
{
  FRESULT fr;
  UINT br;
  fr = f_read((FIL *)fh, buf, len, &br);
  if (fr == FR_OK)
    return len - br;
  return -1;
}
2019-05-25 04:41:27