Просмотр исходного кода

fix: zbuff的writeF32/readF32在ec618系列固件会死机

https://gitee.com/openLuat/LuatOS/issues/I70YBL
Wendal Chen 2 лет назад
Родитель
Сommit
5d229ba8e7
2 измененных файлов с 13 добавлено и 4 удалено
  1. 7 1
      demo/zbuff/main.lua
  2. 6 3
      luat/modules/luat_lib_zbuff.c

+ 7 - 1
demo/zbuff/main.lua

@@ -8,7 +8,7 @@ log.info("main", PROJECT, VERSION)
 sys = require("sys")
 
 sys.taskInit(function()
-    sys.wait(2000)
+    sys.wait(3000)
     -- zbuff可以理解为char[], char*, uint8_t*
     -- 为了与lua更好的融合, zbuff带长度,带指针位置,可动态扩容
     local buff = zbuff.create(1024)
@@ -54,6 +54,12 @@ sys.taskInit(function()
     -- 获取其指针位置
     log.info("zbuff", "len", buff:used())
 
+    -- 测试writeF32, 注意, EC618系列(Air780E等), V1106会死机, 在V1107修复
+    buff:seek(0, zbuff.SEEK_SET)
+    buff:writeF32(1.2)
+    buff:seek(0, zbuff.SEEK_SET)
+    log.info("buff", "rw", "f32", buff:readF32())
+
     -- 更多用法请查阅api文档
 
     log.info("zbuff", "demo done")

+ 6 - 3
luat/modules/luat_lib_zbuff.c

@@ -623,10 +623,12 @@ local data = buff:readU32()
 #define zread(n, t, f)                                       \
     static int l_zbuff_read_##n(lua_State *L)                \
     {                                                        \
-        luat_zbuff_t *buff = tozbuff(L);                       \
+        luat_zbuff_t *buff = tozbuff(L);                      \
         if (buff->len - buff->cursor < sizeof(t))            \
             return 0;                                        \
-        lua_push##f(L, *((t *)(buff->addr + buff->cursor))); \
+        t tmp;                                              \
+        memcpy(&tmp, buff->addr + buff->cursor, sizeof(t));  \
+        lua_push##f(L, tmp);                                 \
         buff->cursor += sizeof(t);                           \
         return 1;                                            \
     }
@@ -660,7 +662,8 @@ local len = buff:writeU32(1024)
             lua_pushinteger(L, 0);                                    \
             return 1;                                                 \
         }                                                             \
-        *((t *)(buff->addr + buff->cursor)) = (t)luaL_check##f(L, 2); \
+        t tmp =   (t)luaL_check##f(L, 2);                             \
+        memcpy(buff->addr + buff->cursor, &(tmp), sizeof(t));            \
         buff->cursor += sizeof(t);                                    \
         lua_pushinteger(L, sizeof(t));                                \
         return 1;                                                     \