乐鑫技术交流
直播中

风来吴山

8年用户 1453经验值
擅长:电源/新能源
私信 关注
[问答]

有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?

我目前正在尝试实施一个名为“SyncTSF”的同步协议,其核心思想是始终将系统时间调整为 Wi-Fi TSF-timer 值。现在,根据标准,STA 的本地 TSF 计时器通过应用包含在信标时间戳字段中的偏移自动与 AP 的 TSF 计时器值同步。为消除与偏差相关的同步错误,应在更新 TSF 计时器后尽快更新系统时间。为此,我想在每次接收到帧时触发一个中断并更新我的系统时钟。有没有办法在不使用混杂模式的情况下实现这种行为?我在文档或 Wi-Fi 驱动程序源代码中找不到任何内容。


回帖(5)

李月如

2023-3-1 14:53:17
锁定 MAC_INTR和 git repo 中的 ETS_WMAC_INUM
举报

陈舒斌

2023-3-1 14:54:17
首先,感谢您的回答!它绝对为我指明了正确的方向。我现在尝试以下列方式使用 ETS_WIFI_MAC_INTR_SOURCE 安装中断:
1.)我创建了一个 freeRTOS 事件组来处理我的 SyncTSF 服务的一些事件。目前中断应该做的唯一一件事是在它被触发时设置一个事件位,然后它将反过来通知事件处理程序在控制台上打印一条消息。这是我创建任务的方式:
代码:
void syncTSF_init(void){
    syncTSF_event_group = xEventGroupCreate();
    syncTSF_event_group_mutex = xSemaphoreCreateMutex();
    xTaskCreatePinnedToCore(&syncTSF,
                            "SyncTSF",
                            2048,
                            &syncTSF_interrupt_handle,
                            4,
                            syncTSF_task,
                            0);
}
2.)如果 SyncTSF 启动函数设置了专用位,则在同一任务中分配并启动中断。通过这种方式,我确保中断是在任务运行的同一核心上创建的。这个特定部分的代码如下所示:
代码:
static void syncTSF(void *pvParameters){
    const EventBits_t xBitsToWaitFor  = ( SYNC_TSF_STARTED | SYNC_TSF_STOPPED | SYNC_TSF_WIFI_PROBE_RCVD );
    EventBits_t xEventGroupValue;
    const TickType_t xTicksToWait = 200 / portTICK_PERIOD_MS;

    for(;;){
        xEventGroupValue  = xEventGroupWaitBits(syncTSF_event_group, xBitsToWaitFor, pdFALSE, pdFALSE, xTicksToWait);
      
        /* Print the Event Bits for debugging */
        ESP_LOGI(TAG, "Event Bits value: %d", (uint32_t) xEventGroupValue);
      
        /* This is where the message gets printed in case the interrupt handler sets the SYNC_TSF_WIFI_PROBE_RCVD Bit */
        if((xEventGroupValue & ( SYNC_TSF_RUNNING | SYNC_TSF_WIFI_PROBE_RCVD )) ==
                ( SYNC_TSF_RUNNING | SYNC_TSF_WIFI_PROBE_RCVD )){
                ESP_LOGI(TAG, "Interupt triggered");
            }
        }

        else if((xEventGroupValue & SYNC_TSF_STARTED) && syncTSF_intr_handle == NULL){
            ESP_LOGI(TAG, "SyncTSF Service Started");
            
            /* Allocate Interrupt */
            esp_intr_alloc( ETS_WIFI_MAC_INTR_SOURCE,
                            ESP_INTR_FLAG_SHARED,
                            &syncTSF_interrupt_handle,
                            NULL,
                            &syncTSF_intr_handle);
            /* Set the Service in running state */
            xEventGroupSetBits(syncTSF_event_group, SYNC_TSF_RUNNING);
            xEventGroupClearBits(syncTSF_event_group, SYNC_TSF_STARTED);
            esp_intr_enable(syncTSF_intr_handle);
        }
    }
}
3.)最后,正如我所说,设置 SYNC_TSF_WIFI_PROBE_RCVD 位以触发事件的中断处理程序:
代码:
void syncTSF_interrupt_handle(void *arg){
    xEventGroupClearBitsFromISR(syncTSF_event_group, SYNC_TSF_WIFI_PROBE_RCVD);
}
4.)现在,当我按照描述执行所有操作时,在第一次进入中断后,我立即收到以下消息的核心恐慌:
代码:
␛[0;32mI (3153) SyncTSF: Event Bits value: 2␛[0m
␛[0;32mI (3163) SyncTSF: SyncTSF Service Started␛[0m
Guru Meditation Error: Core  0 panic'ed (Interrupt wdt timeout on CPU0).
这仅在我在核心 0 上创建事件处理程序任务时发生。如果我尝试在核心 1 上创建它,则永远不会进入中断处理程序。我还尝试增加看门狗超时值,但这也无济于事。当我尝试rom/ets_sys.h库中提供的函数时,它具有相同的效果(基本上没有任何反应 == 中断从未进入或根本没有创建)。我知道我正在做的事情不是线程安全的,但这不应该是核心恐慌的原因。由于此中断源可能也被 WiFi PHY 驱动程序使用,这可能是造成这种行为的原因吗?我在这里错过了什么?
举报

高若琰

2023-3-1 14:54:32
你没有清除中断
举报

张昂笙

2023-3-1 14:54:45
你能解释一下“清除”中断是什么意思吗?我没有在 ESP32 的上下文中遇到过这个终端,我在 api 或技术参考手册中的任何地方都找不到对此的引用。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分