mirror of
https://github.com/espressif/esp-idf.git
synced 2025-08-08 04:02:27 +00:00
bugfix/freertos_dual_core_hooks
This commit fixes bugs with the dual core changes to freeRTOS tick and idle hooks. Interrupt watchdog now registers tick hooks to both cores. API for cross core tick and idle hook registration were also added
This commit is contained in:
@@ -56,14 +56,33 @@ void esp_vApplicationIdleHook()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
esp_err_t esp_register_freertos_idle_hook(esp_freertos_idle_cb_t new_idle_cb)
|
||||
esp_err_t esp_register_freertos_idle_hook_for_cpu(esp_freertos_idle_cb_t new_idle_cb, UBaseType_t cpuid)
|
||||
{
|
||||
int n;
|
||||
int core = xPortGetCoreID();
|
||||
for (n=0; n<MAX_HOOKS; n++) {
|
||||
if (idle_cb[core][n]==NULL) {
|
||||
idle_cb[core][n]=new_idle_cb;
|
||||
if(cpuid >= portNUM_PROCESSORS){
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
for(int n = 0; n < MAX_HOOKS; n++){
|
||||
if (idle_cb[cpuid][n]==NULL) {
|
||||
idle_cb[cpuid][n]=new_idle_cb;
|
||||
return ESP_OK;
|
||||
}
|
||||
}
|
||||
return ESP_ERR_NO_MEM;
|
||||
}
|
||||
|
||||
esp_err_t esp_register_freertos_idle_hook(esp_freertos_idle_cb_t new_idle_cb)
|
||||
{
|
||||
return esp_register_freertos_idle_hook_for_cpu(new_idle_cb, xPortGetCoreID());
|
||||
}
|
||||
|
||||
esp_err_t esp_register_freertos_tick_hook_for_cpu(esp_freertos_tick_cb_t new_tick_cb, UBaseType_t cpuid)
|
||||
{
|
||||
if(cpuid >= portNUM_PROCESSORS){
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
for(int n = 0; n < MAX_HOOKS; n++){
|
||||
if (tick_cb[cpuid][n]==NULL) {
|
||||
tick_cb[cpuid][n]=new_tick_cb;
|
||||
return ESP_OK;
|
||||
}
|
||||
}
|
||||
@@ -72,32 +91,24 @@ esp_err_t esp_register_freertos_idle_hook(esp_freertos_idle_cb_t new_idle_cb)
|
||||
|
||||
esp_err_t esp_register_freertos_tick_hook(esp_freertos_tick_cb_t new_tick_cb)
|
||||
{
|
||||
int n;
|
||||
int core = xPortGetCoreID();
|
||||
for (n=0; n<MAX_HOOKS; n++) {
|
||||
if (tick_cb[core][n]==NULL) {
|
||||
tick_cb[core][n]=new_tick_cb;
|
||||
return ESP_OK;
|
||||
}
|
||||
}
|
||||
return ESP_ERR_NO_MEM;
|
||||
return esp_register_freertos_tick_hook_for_cpu(new_tick_cb, xPortGetCoreID());
|
||||
}
|
||||
|
||||
void esp_deregister_freertos_idle_hook(esp_freertos_idle_cb_t old_idle_cb)
|
||||
{
|
||||
int n;
|
||||
int core = xPortGetCoreID();
|
||||
for (n=0; n<MAX_HOOKS; n++) {
|
||||
if (idle_cb[core][n]==old_idle_cb) idle_cb[core][n]=NULL;
|
||||
for(int m = 0; m < portNUM_PROCESSORS; m++) {
|
||||
for(int n = 0; n < MAX_HOOKS; n++){
|
||||
if(idle_cb[m][n] == old_idle_cb) idle_cb[m][n] = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void esp_deregister_freertos_tick_hook(esp_freertos_tick_cb_t old_tick_cb)
|
||||
{
|
||||
int n;
|
||||
int core = xPortGetCoreID();
|
||||
for (n=0; n<MAX_HOOKS; n++) {
|
||||
if (tick_cb[core][n]==old_tick_cb) tick_cb[core][n]=NULL;
|
||||
for(int m = 0; m < portNUM_PROCESSORS; m++){
|
||||
for(int n = 0; n < MAX_HOOKS; n++){
|
||||
if(tick_cb[m][n] == old_tick_cb) tick_cb[m][n] = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user