Sfoglia il codice sorgente

update: airlink,暂停airlink添加用互斥锁阻塞

??? 2 mesi fa
parent
commit
ef6dd096c0

+ 4 - 3
components/airlink/binding/luat_lib_airlink.c

@@ -441,7 +441,8 @@ static int l_airlink_debug(lua_State *L) {
 airlink.pause(1)
 */
 static int l_airlink_pause(lua_State *L) {
-    g_airlink_pause = luaL_checkinteger(L, 1);
+    uint32_t val = luaL_checkinteger(L, 1);
+    luat_airlink_set_pause(val);
     // 配置过wakeup pin,并且airlink恢复运行时,就触发一次中断唤醒
     if (g_airlink_wakeup_irq_ctx.master_pin != 0 && !g_airlink_pause) {
         g_airlink_wakeup_irq_ctx.enable = 1;
@@ -529,12 +530,12 @@ static int l_airlink_power(lua_State *L) {
     if (luat_airlink_has_wifi()) {
         if (enable) {
             luat_gpio_set(23, 1);
-            g_airlink_pause = 0;
+            luat_airlink_set_pause(0);
             LLOGI("wifi chip power on, airlink pause=false");
         }
         else {
             luat_gpio_set(23, 0);
-            g_airlink_pause = 1;
+            luat_airlink_set_pause(1);
             LLOGI("wifi chip power off, airlink pause=true");
         }
     }

+ 4 - 0
components/airlink/include/luat_airlink.h

@@ -183,6 +183,10 @@ typedef struct luat_airlink_spi_conf
 extern luat_airlink_spi_conf_t g_airlink_spi_conf;
 extern luat_airlink_link_data_cb g_airlink_link_data_cb;
 
+extern void *g_airlink_pause_mutex;
+void luat_airlink_pause_init(void);
+void luat_airlink_set_pause(uint32_t val);
+
 uint64_t luat_airlink_get_next_cmd_id(void);
 
 luat_airlink_cmd_t* luat_airlink_cmd_new(uint16_t cmd, uint16_t data_len);

+ 21 - 0
components/airlink/src/luat_airlink.c

@@ -37,6 +37,7 @@ uint32_t g_airlink_spi_task_mode;
 uint64_t g_airlink_last_cmd_timestamp;
 uint32_t g_airlink_debug;
 uint32_t g_airlink_pause;
+void *g_airlink_pause_mutex = NULL;
 uint64_t g_airlink_wifi_boot_time;
 
 int luat_airlink_init(void)
@@ -89,6 +90,26 @@ int luat_airlink_start(int id)
     return 0;
 }
 
+void luat_airlink_pause_init(void) {
+    if (g_airlink_pause_mutex == NULL)
+    {
+        g_airlink_pause_mutex = luat_mutex_create();
+    }
+}
+
+void luat_airlink_set_pause(uint32_t val) {
+    g_airlink_pause = val;
+    if (g_airlink_pause_mutex == NULL) luat_airlink_pause_init();
+    if (val) 
+    {
+        luat_mutex_lock(g_airlink_pause_mutex);
+    }
+    else 
+    {
+        luat_mutex_unlock(g_airlink_pause_mutex);
+    }
+} 
+
 int luat_airlink_stop(int id)
 {
     return 0;

+ 18 - 5
components/airlink/src/task/luat_airlink_spi_master_task.c

@@ -33,6 +33,7 @@
 
 extern airlink_statistic_t g_airlink_statistic;
 extern uint32_t g_airlink_pause;
+extern void *g_airlink_pause_mutex;
 
 // static uint8_t start;
 // static uint8_t slave_rdy;
@@ -265,7 +266,6 @@ __USER_FUNC_IN_RAM__ int airlink_wait_for_slave_reply(size_t timeout_ms)
 {
     uint64_t timeout = 0;
     luat_event_t event = {0};
-    size_t qlen = 0;
     while (timeout < timeout_ms)
     {
         event.id = 0;
@@ -289,10 +289,23 @@ __USER_FUNC_IN_RAM__ void airlink_wait_and_prepare_data(uint8_t *txbuff)
     int ret = 0;
     uint32_t qlen = 0;
     luat_rtos_queue_get_cnt(evt_queue, &qlen);
-    if (qlen == 0) {
-        while (g_airlink_pause) {
-            //LLOGD("airlink spi 交互暂停中,允许主控休眠, 监测周期100ms");
-            luat_rtos_task_sleep(100);
+    if (qlen == 0)
+    {
+        if (g_airlink_pause)
+        {
+            if (g_airlink_pause_mutex)
+            {
+                luat_mutex_lock(g_airlink_pause_mutex);
+                luat_mutex_unlock(g_airlink_pause_mutex);   // 被unlock唤醒后, 再立即unlock一次, 防止死锁
+            }
+            else
+            {
+                while (g_airlink_pause)
+                {
+                    LLOGD("airlink spi 交互暂停中,允许主控休眠, 监测周期1000ms");
+                    luat_rtos_task_sleep(1000);
+                }
+            }
         }
     }
     if (g_airlink_wakeup_irq_ctx.enable)

+ 3 - 3
components/drv/src/luat_drv_pm.c

@@ -45,15 +45,15 @@ int luat_drv_pm_power_ctrl(int chip, int id, uint8_t val) {
                     luat_gpio_set(23, 1); // 打开wifi
                     s_wifi_sleep = 0;
                 }
-                g_airlink_pause = 0;
+                luat_airlink_set_pause(0);
             }
             // 然后, 如果是进入
             else {
                 s_wifi_sleep = 1;
                 luat_airlink_drv_pm_power_ctrl(id, val);
                 luat_rtos_task_sleep(10);
-                // 如果是进入休眠模式, 恢复airlink工作
-                g_airlink_pause = 1;
+                // 如果是进入休眠模式, 暂停airlink工作
+                luat_airlink_set_pause(1);
             }
         }
         #endif

+ 1 - 1
luat/modules/luat_lib_pm.c

@@ -99,7 +99,7 @@ static int l_pm_request(lua_State *L) {
     if (lua_isinteger(L, 2)) {
         chip = luaL_checkinteger(L, 2);
         if (chip > 0) {
-            g_airlink_pause = 1;    // wifi进入休眠自动暂停airlink工作
+            luat_airlink_set_pause(1);    // wifi进入休眠自动暂停airlink工作
         }
     }
     ret = luat_drv_pm_request(chip, mode);