首先,感谢您的回答!它绝对为我指明了正确的方向。我现在尝试以下列方式使用 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 驱动程序使用,这可能是造成这种行为的原因吗?我在这里错过了什么?
首先,感谢您的回答!它绝对为我指明了正确的方向。我现在尝试以下列方式使用 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 驱动程序使用,这可能是造成这种行为的原因吗?我在这里错过了什么?
举报