Allow selecting in IDF the running core for Arduino's core tasks
This commit is contained in:
		
							parent
							
								
									d922557e01
								
							
						
					
					
						commit
						fa74767b2e
					
				| @ -19,6 +19,70 @@ config AUTOSTART_ARDUINO | ||||
|         If disabled, you can call initArduino() to run any preparations | ||||
|         required by the framework | ||||
| 
 | ||||
| choice ARDUINO_RUNNING_CORE | ||||
|     bool "Core on which Arduino's setup() and loop() are running" | ||||
|     default ARDUINO_RUN_CORE1 | ||||
|     help | ||||
|         Select on which core Arduino's setup() and loop() functions run | ||||
| 
 | ||||
|     config ARDUINO_RUN_CORE0 | ||||
|         bool "CORE 0" | ||||
|     config ARDUINO_RUN_CORE1 | ||||
|         bool "CORE 1" | ||||
|     config ARDUINO_RUN_NO_AFFINITY | ||||
|         bool "BOTH" | ||||
| 
 | ||||
| endchoice | ||||
| 
 | ||||
| config ARDUINO_RUNNING_CORE | ||||
|     int | ||||
|     default 0 if ARDUINO_RUN_CORE0 | ||||
|     default 1 if ARDUINO_RUN_CORE1 | ||||
|     default -1 if ARDUINO_RUN_NO_AFFINITY | ||||
| 
 | ||||
| choice ARDUINO_EVENT_RUNNING_CORE | ||||
|     bool "Core on which Arduino's event handler is running" | ||||
|     default ARDUINO_EVENT_RUN_CORE1 | ||||
|     help | ||||
|         Select on which core Arduino's WiFi.onEvent() run | ||||
| 
 | ||||
|     config ARDUINO_EVENT_RUN_CORE0 | ||||
|         bool "CORE 0" | ||||
|     config ARDUINO_EVENT_RUN_CORE1 | ||||
|         bool "CORE 1" | ||||
|     config ARDUINO_EVENT_RUN_NO_AFFINITY | ||||
|         bool "BOTH" | ||||
| 
 | ||||
| endchoice | ||||
| 
 | ||||
| config ARDUINO_EVENT_RUNNING_CORE | ||||
|     int | ||||
|     default 0 if ARDUINO_EVENT_RUN_CORE0 | ||||
|     default 1 if ARDUINO_EVENT_RUN_CORE1 | ||||
|     default -1 if ARDUINO_EVENT_RUN_NO_AFFINITY | ||||
| 
 | ||||
| choice ARDUINO_UDP_RUNNING_CORE | ||||
|     bool "Core on which Arduino's UDP is running" | ||||
|     default ARDUINO_UDP_RUN_CORE1 | ||||
|     help | ||||
|         Select on which core Arduino's UDP run | ||||
| 
 | ||||
|     config ARDUINO_UDP_RUN_CORE0 | ||||
|         bool "CORE 0" | ||||
|     config ARDUINO_UDP_RUN_CORE1 | ||||
|         bool "CORE 1" | ||||
|     config ARDUINO_UDP_RUN_NO_AFFINITY | ||||
|         bool "BOTH" | ||||
| 
 | ||||
| endchoice | ||||
| 
 | ||||
| config ARDUINO_UDP_RUNNING_CORE | ||||
|     int | ||||
|     default 0 if ARDUINO_UDP_RUN_CORE0 | ||||
|     default 1 if ARDUINO_UDP_RUN_CORE1 | ||||
|     default -1 if ARDUINO_UDP_RUN_NO_AFFINITY | ||||
| 
 | ||||
| 
 | ||||
| config DISABLE_HAL_LOCKS | ||||
|     bool "Disable mutex locks for HAL" | ||||
|     default "n" | ||||
|  | ||||
| @ -111,6 +111,24 @@ void disableCore1WDT(){ | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| BaseType_t xTaskCreateUniversal( TaskFunction_t pxTaskCode, | ||||
|                         const char * const pcName, | ||||
|                         const uint32_t usStackDepth, | ||||
|                         void * const pvParameters, | ||||
|                         UBaseType_t uxPriority, | ||||
|                         TaskHandle_t * const pxCreatedTask, | ||||
|                         const BaseType_t xCoreID ){ | ||||
| #ifndef CONFIG_FREERTOS_UNICORE | ||||
|     if(xCoreID >= 0 && xCoreID < 2) { | ||||
|         return xTaskCreatePinnedToCore(pxTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask, xCoreID); | ||||
|     } else { | ||||
| #endif | ||||
|     return xTaskCreate(pxTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask); | ||||
| #ifndef CONFIG_FREERTOS_UNICORE | ||||
|     } | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| unsigned long IRAM_ATTR micros() | ||||
| { | ||||
|     return (unsigned long) (esp_timer_get_time()); | ||||
|  | ||||
| @ -90,6 +90,16 @@ void enableCore1WDT(); | ||||
| void disableCore1WDT(); | ||||
| #endif | ||||
| 
 | ||||
| //if xCoreID < 0 or CPU is unicore, it will use xTaskCreate, else xTaskCreatePinnedToCore
 | ||||
| //allows to easily handle all possible situations without repetitive code
 | ||||
| BaseType_t xTaskCreateUniversal( TaskFunction_t pxTaskCode, | ||||
|                         const char * const pcName, | ||||
|                         const uint32_t usStackDepth, | ||||
|                         void * const pvParameters, | ||||
|                         UBaseType_t uxPriority, | ||||
|                         TaskHandle_t * const pxCreatedTask, | ||||
|                         const BaseType_t xCoreID ); | ||||
| 
 | ||||
| unsigned long micros(); | ||||
| unsigned long millis(); | ||||
| void delay(uint32_t); | ||||
|  | ||||
| @ -7,12 +7,6 @@ TaskHandle_t loopTaskHandle = NULL; | ||||
| 
 | ||||
| #if CONFIG_AUTOSTART_ARDUINO | ||||
| 
 | ||||
| #if CONFIG_FREERTOS_UNICORE | ||||
| #define ARDUINO_RUNNING_CORE 0 | ||||
| #else | ||||
| #define ARDUINO_RUNNING_CORE 1 | ||||
| #endif | ||||
| 
 | ||||
| bool loopTaskWDTEnabled; | ||||
| 
 | ||||
| void loopTask(void *pvParameters) | ||||
| @ -30,7 +24,7 @@ extern "C" void app_main() | ||||
| { | ||||
|     loopTaskWDTEnabled = false; | ||||
|     initArduino(); | ||||
|     xTaskCreatePinnedToCore(loopTask, "loopTask", 8192, NULL, 1, &loopTaskHandle, ARDUINO_RUNNING_CORE); | ||||
|     xTaskCreateUniversal(loopTask, "loopTask", 8192, NULL, 1, &loopTaskHandle, CONFIG_ARDUINO_RUNNING_CORE); | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
|  | ||||
| @ -150,7 +150,7 @@ static bool _udp_task_start(){ | ||||
|         } | ||||
|     } | ||||
|     if(!_udp_task_handle){ | ||||
|         xTaskCreate(_udp_task, "async_udp", 4096, NULL, 3, (TaskHandle_t*)&_udp_task_handle); | ||||
|         xTaskCreateUniversal(_udp_task, "async_udp", 4096, NULL, 3, (TaskHandle_t*)&_udp_task_handle, CONFIG_ARDUINO_UDP_RUNNING_CORE); | ||||
|         if(!_udp_task_handle){ | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
| @ -50,12 +50,6 @@ extern "C" { | ||||
| 
 | ||||
| #include "sdkconfig.h" | ||||
| 
 | ||||
| #if CONFIG_FREERTOS_UNICORE | ||||
| #define ARDUINO_RUNNING_CORE 0 | ||||
| #else | ||||
| #define ARDUINO_RUNNING_CORE 1 | ||||
| #endif | ||||
| 
 | ||||
| static xQueueHandle _network_event_queue; | ||||
| static TaskHandle_t _network_event_task_handle = NULL; | ||||
| static EventGroupHandle_t _network_event_group = NULL; | ||||
| @ -96,7 +90,7 @@ static bool _start_network_event_task(){ | ||||
|         } | ||||
|     } | ||||
|     if(!_network_event_task_handle){ | ||||
|         xTaskCreatePinnedToCore(_network_event_task, "network_event", 4096, NULL, ESP_TASKD_EVENT_PRIO - 1, &_network_event_task_handle, ARDUINO_RUNNING_CORE); | ||||
|         xTaskCreateUniversal(_network_event_task, "network_event", 4096, NULL, ESP_TASKD_EVENT_PRIO - 1, &_network_event_task_handle, CONFIG_ARDUINO_EVENT_RUNNING_CORE); | ||||
|         if(!_network_event_task_handle){ | ||||
|             log_e("Network Event Task Start Failed!"); | ||||
|             return false; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user