| 
									
										
										
										
											2016-11-15 12:10:02 +08:00
										 |  |  | // Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Licensed under the Apache License, Version 2.0 (the "License");
 | 
					
						
							|  |  |  | // you may not use this file except in compliance with the License.
 | 
					
						
							|  |  |  | // You may obtain a copy of the License at
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //     http://www.apache.org/licenses/LICENSE-2.0
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Unless required by applicable law or agreed to in writing, software
 | 
					
						
							|  |  |  | // distributed under the License is distributed on an "AS IS" BASIS,
 | 
					
						
							|  |  |  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
					
						
							|  |  |  | // See the License for the specific language governing permissions and
 | 
					
						
							|  |  |  | // limitations under the License.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-11 19:20:54 +08:00
										 |  |  | #include <stdint.h>
 | 
					
						
							|  |  |  | #include <stdlib.h>
 | 
					
						
							|  |  |  | #include <stdbool.h>
 | 
					
						
							| 
									
										
										
										
											2017-07-08 20:47:55 +02:00
										 |  |  | #include "freertos/FreeRTOS.h"
 | 
					
						
							| 
									
										
										
										
											2016-11-11 19:20:54 +08:00
										 |  |  | #include "esp_attr.h"
 | 
					
						
							|  |  |  | #include "esp_freertos_hooks.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //We use just a static array here because it's not expected many components will need
 | 
					
						
							|  |  |  | //an idle or tick hook.
 | 
					
						
							|  |  |  | #define MAX_HOOKS 8
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-08 20:47:55 +02:00
										 |  |  | static esp_freertos_idle_cb_t idle_cb[portNUM_PROCESSORS][MAX_HOOKS]={0}; | 
					
						
							|  |  |  | static esp_freertos_tick_cb_t tick_cb[portNUM_PROCESSORS][MAX_HOOKS]={0}; | 
					
						
							| 
									
										
										
										
											2016-11-11 19:20:54 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | void IRAM_ATTR esp_vApplicationTickHook()  | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int n; | 
					
						
							| 
									
										
										
										
											2017-07-08 20:47:55 +02:00
										 |  |  |     int core = xPortGetCoreID(); | 
					
						
							| 
									
										
										
										
											2016-11-11 19:20:54 +08:00
										 |  |  |     for (n=0; n<MAX_HOOKS; n++) { | 
					
						
							| 
									
										
										
										
											2017-07-08 20:47:55 +02:00
										 |  |  |         if (tick_cb[core][n]!=NULL) { | 
					
						
							|  |  |  |             tick_cb[core][n](); | 
					
						
							| 
									
										
										
										
											2016-11-11 19:20:54 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void esp_vApplicationIdleHook()  | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     bool doWait=true; | 
					
						
							|  |  |  |     bool r; | 
					
						
							|  |  |  |     int n; | 
					
						
							| 
									
										
										
										
											2017-07-08 20:47:55 +02:00
										 |  |  |     int core = xPortGetCoreID(); | 
					
						
							| 
									
										
										
										
											2016-11-11 19:20:54 +08:00
										 |  |  |     for (n=0; n<MAX_HOOKS; n++) { | 
					
						
							| 
									
										
										
										
											2017-07-08 20:47:55 +02:00
										 |  |  |         if (idle_cb[core][n]!=NULL) { | 
					
						
							|  |  |  |             r=idle_cb[core][n](); | 
					
						
							| 
									
										
										
										
											2016-11-11 19:20:54 +08:00
										 |  |  |             if (!r) doWait=false; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (doWait) { | 
					
						
							|  |  |  |         //Wait for whatever interrupt comes next... this should save some power.
 | 
					
						
							|  |  |  |         asm("waiti 0"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | esp_err_t esp_register_freertos_idle_hook(esp_freertos_idle_cb_t new_idle_cb)  | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int n; | 
					
						
							| 
									
										
										
										
											2017-07-08 20:47:55 +02:00
										 |  |  |     int core = xPortGetCoreID(); | 
					
						
							| 
									
										
										
										
											2016-11-11 19:20:54 +08:00
										 |  |  |     for (n=0; n<MAX_HOOKS; n++) { | 
					
						
							| 
									
										
										
										
											2017-07-08 20:47:55 +02:00
										 |  |  |         if (idle_cb[core][n]==NULL) { | 
					
						
							|  |  |  |             idle_cb[core][n]=new_idle_cb; | 
					
						
							| 
									
										
										
										
											2016-11-11 19:20:54 +08:00
										 |  |  |             return ESP_OK; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return ESP_ERR_NO_MEM; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | esp_err_t esp_register_freertos_tick_hook(esp_freertos_tick_cb_t new_tick_cb)  | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int n; | 
					
						
							| 
									
										
										
										
											2017-07-08 20:47:55 +02:00
										 |  |  |     int core = xPortGetCoreID(); | 
					
						
							| 
									
										
										
										
											2016-11-11 19:20:54 +08:00
										 |  |  |     for (n=0; n<MAX_HOOKS; n++) { | 
					
						
							| 
									
										
										
										
											2017-07-08 20:47:55 +02:00
										 |  |  |         if (tick_cb[core][n]==NULL) { | 
					
						
							|  |  |  |             tick_cb[core][n]=new_tick_cb; | 
					
						
							| 
									
										
										
										
											2016-11-11 19:20:54 +08:00
										 |  |  |             return ESP_OK; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return ESP_ERR_NO_MEM; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void esp_deregister_freertos_idle_hook(esp_freertos_idle_cb_t old_idle_cb) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int n; | 
					
						
							| 
									
										
										
										
											2017-07-08 20:47:55 +02:00
										 |  |  |     int core = xPortGetCoreID(); | 
					
						
							| 
									
										
										
										
											2016-11-11 19:20:54 +08:00
										 |  |  |     for (n=0; n<MAX_HOOKS; n++) { | 
					
						
							| 
									
										
										
										
											2017-07-08 20:47:55 +02:00
										 |  |  |         if (idle_cb[core][n]==old_idle_cb) idle_cb[core][n]=NULL; | 
					
						
							| 
									
										
										
										
											2016-11-11 19:20:54 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void esp_deregister_freertos_tick_hook(esp_freertos_tick_cb_t old_tick_cb) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int n; | 
					
						
							| 
									
										
										
										
											2017-07-08 20:47:55 +02:00
										 |  |  |     int core = xPortGetCoreID(); | 
					
						
							| 
									
										
										
										
											2016-11-11 19:20:54 +08:00
										 |  |  |     for (n=0; n<MAX_HOOKS; n++) { | 
					
						
							| 
									
										
										
										
											2017-07-08 20:47:55 +02:00
										 |  |  |         if (tick_cb[core][n]==old_tick_cb) tick_cb[core][n]=NULL; | 
					
						
							| 
									
										
										
										
											2016-11-11 19:20:54 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 |