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

fix:外部中断捕获和64bitTick计算有点问题

alienwalker 4 лет назад
Родитель
Сommit
250bf3944c
2 измененных файлов с 26 добавлено и 8 удалено
  1. 11 3
      components/io_queue/luat_lib_io_queue.c
  2. 15 5
      luat/modules/luat_lib_mcu.c

+ 11 - 3
components/io_queue/luat_lib_io_queue.c

@@ -23,11 +23,19 @@ int l_io_queue_done_handler(lua_State *L, void* ptr)
 
 int l_io_queue_capture_handler(lua_State *L, void* ptr)
 {
+	volatile uint64_t tick;
+	uint32_t pin;
+	uint32_t val;
 	rtos_msg_t* msg = (rtos_msg_t*)lua_topointer(L, -1);
 	lua_getglobal(L, "sys_pub");
-	LLOGD("%d", msg->arg1);
-	lua_pushfstring(L, "IO_QUEUE_DONE_%d", msg->arg1);
-	lua_call(L, 1, 0);
+	pin = ((uint32_t)msg->ptr >> 8) & 0x000000ff;
+	val = (uint32_t)msg->ptr & 0x00000001;
+	tick = ((uint64_t)msg->arg1 << 32) | (uint32_t)msg->arg2;
+//	LLOGD("%u, %x,%x, %llu",pin, msg->arg1, msg->arg2, tick);
+	lua_pushfstring(L, "IO_QUEUE_EXTI_%d", pin);
+	lua_pushinteger(L, val);
+	lua_pushlstring(L, &tick, 8);
+	lua_call(L, 3, 0);
 	return 1;
 }
 

+ 15 - 5
luat/modules/luat_lib_mcu.c

@@ -7,7 +7,8 @@
 */
 #include "luat_base.h"
 #include "luat_mcu.h"
-
+#define LUAT_LOG_TAG "mcu"
+#include "luat_log.h"
 /*
 设置主频,单位MHZ. 请注意,主频与外设主频有关联性, 例如主频2M时SPI的最高只能1M
 @api mcu.setClk(mhz)
@@ -108,24 +109,33 @@ static int l_mcu_hw_tick64(lua_State* L) {
 
 /*
 计算2个64bit tick的差值
-@api mcu.dtick(tick1, tick2)
+@api mcu.dtick(tick1, tick2, check_value)
 @string tick1
 @string tick2
-@return int 差值tick1 - tick2
+@int 参考值,可选项,如果为0,则返回结果中第一个项目为true
+@return
+boolean 与参考值比较,如果大于等于为true,反之为false
+int 差值tick1 - tick2,如果超过了0x7fffffff,结果可能是错的
 @usage
 local diff_tick = mcu.dtick64(tick1, tick2)
 print("ticks", tick)
 */
 static int l_mcu_hw_diff_tick64(lua_State* L) {
 	uint64_t tick1, tick2;
+	int64_t diff;
+	int check_value = 0;
     size_t len1;
     const char *data1 = luaL_checklstring(L, 1, &len1);
     size_t len2;
     const char *data2 = luaL_checklstring(L, 2, &len2);
+    check_value = luaL_optinteger(L, 3, 0);
+
     memcpy(&tick1, data1, len1);
     memcpy(&tick2, data2, len2);
-    lua_pushinteger(L, (tick1 - tick2));
-    return 1;
+    diff = tick1 - tick2;
+    lua_pushboolean(L, (diff >= (int64_t)check_value)?1:0);
+    lua_pushinteger(L, diff);
+    return 2;
 }
 
 /*