完善资料让更多小伙伴认识你,还能领取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 处理程序。假设它正确地清除/确认中断。
|
|
|
|
|
只有小组成员才能发言,加入小组>>
933 浏览 0 评论
1653 浏览 0 评论
请问一下我想用ESP8685直接替换ESP8266而不用写程序,可以让ESP8685直接通过之前ESP8266的外挂的flash运行程序吗
1284 浏览 1 评论
1218 浏览 1 评论
4959 浏览 2 评论
为blufi_device设置自定义名称,但是无法修改,为什么?
1249浏览 4评论
请问ESP32-S2-WROOM怎么获得ESP32-S2外接FLASH的唯一序列号?
927浏览 3评论
2329浏览 3评论
ESP-IDF的VScode插件的build按钮点击会报错的原因?
2524浏览 3评论
ESP-Jumpstart例程中第5个工程:5_cloud连接报错是哪里的问题?
1051浏览 2评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 17:27 , Processed in 0.572196 second(s), Total 50, Slave 43 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
603
