完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我目前正在尝试实施一个名为“SyncTSF”的同步协议,其核心思想是始终将系统时间调整为 Wi-Fi TSF-timer 值。现在,根据标准,STA 的本地 TSF 计时器通过应用包含在信标时间戳字段中的偏移自动与 AP 的 TSF 计时器值同步。为消除与偏差相关的同步错误,应在更新 TSF 计时器后尽快更新系统时间。为此,我想在每次接收到帧时触发一个中断并更新我的系统时钟。有没有办法在不使用混杂模式的情况下实现这种行为?我在文档或 Wi-Fi 驱动程序源代码中找不到任何内容。
|
|
相关推荐
5个回答
|
|
锁定 MAC_INTR和 git repo 中的 ETS_WMAC_INUM
|
|
|
|
首先,感谢您的回答!它绝对为我指明了正确的方向。我现在尝试以下列方式使用 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 驱动程序使用,这可能是造成这种行为的原因吗?我在这里错过了什么? |
|
|
|
你没有清除中断
|
|
|
|
你能解释一下“清除”中断是什么意思吗?我没有在 ESP32 的上下文中遇到过这个终端,我在 api 或技术参考手册中的任何地方都找不到对此的引用。
|
|
|
|
一种方法是让 wifi 驱动程序设置中断处理程序。然后你可以用你自己的替换它并调用“原始”wmac 处理程序。假设它正确地清除/确认中断。
|
|
|
|
只有小组成员才能发言,加入小组>>
1012 浏览 1 评论
557浏览 6评论
464浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
449浏览 5评论
449浏览 4评论
424浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-1 12:30 , Processed in 0.901955 second(s), Total 87, Slave 70 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号