| 
									
										
										
										
											2018-01-11 21:43:58 +08:00
										 |  |  | // Copyright 2015-2018 Espressif Systems (Shanghai) PTE LTD
 | 
					
						
							| 
									
										
										
										
											2016-08-17 23:08:22 +08:00
										 |  |  | //
 | 
					
						
							|  |  |  | // 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
 | 
					
						
							| 
									
										
										
										
											2017-04-24 18:36:47 +08:00
										 |  |  | //
 | 
					
						
							| 
									
										
										
										
											2016-08-17 23:08:22 +08:00
										 |  |  | //     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.
 | 
					
						
							| 
									
										
										
										
											2017-04-24 18:36:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-17 23:08:22 +08:00
										 |  |  | #include <stdint.h>
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "esp_attr.h"
 | 
					
						
							|  |  |  | #include "esp_err.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "rom/ets_sys.h"
 | 
					
						
							| 
									
										
										
										
											2016-09-13 13:48:28 +10:00
										 |  |  | #include "rom/uart.h"
 | 
					
						
							| 
									
										
										
										
											2016-10-13 11:46:51 +11:00
										 |  |  | #include "rom/rtc.h"
 | 
					
						
							| 
									
										
										
										
											2016-11-04 12:18:57 +08:00
										 |  |  | #include "rom/cache.h"
 | 
					
						
							| 
									
										
										
										
											2016-08-17 23:08:22 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-15 01:59:42 +08:00
										 |  |  | #include "soc/cpu.h"
 | 
					
						
							| 
									
										
										
										
											2017-04-11 15:44:43 +08:00
										 |  |  | #include "soc/rtc.h"
 | 
					
						
							| 
									
										
										
										
											2016-08-17 23:08:22 +08:00
										 |  |  | #include "soc/dport_reg.h"
 | 
					
						
							|  |  |  | #include "soc/io_mux_reg.h"
 | 
					
						
							| 
									
										
										
										
											2016-09-15 01:59:42 +08:00
										 |  |  | #include "soc/rtc_cntl_reg.h"
 | 
					
						
							| 
									
										
										
										
											2016-12-08 01:41:27 +08:00
										 |  |  | #include "soc/timer_group_reg.h"
 | 
					
						
							| 
									
										
										
										
											2018-09-19 11:34:34 +08:00
										 |  |  | #include "soc/efuse_reg.h"
 | 
					
						
							| 
									
										
										
										
											2016-08-17 23:08:22 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-14 14:20:01 +08:00
										 |  |  | #include "driver/rtc_io.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-17 23:08:22 +08:00
										 |  |  | #include "freertos/FreeRTOS.h"
 | 
					
						
							|  |  |  | #include "freertos/task.h"
 | 
					
						
							|  |  |  | #include "freertos/semphr.h"
 | 
					
						
							|  |  |  | #include "freertos/queue.h"
 | 
					
						
							|  |  |  | #include "freertos/portmacro.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-28 17:12:29 +10:00
										 |  |  | #include "esp_heap_caps_init.h"
 | 
					
						
							| 
									
										
										
										
											2016-08-17 23:08:22 +08:00
										 |  |  | #include "sdkconfig.h"
 | 
					
						
							|  |  |  | #include "esp_system.h"
 | 
					
						
							|  |  |  | #include "esp_spi_flash.h"
 | 
					
						
							|  |  |  | #include "nvs_flash.h"
 | 
					
						
							|  |  |  | #include "esp_event.h"
 | 
					
						
							| 
									
										
										
										
											2016-09-12 18:54:45 +08:00
										 |  |  | #include "esp_spi_flash.h"
 | 
					
						
							|  |  |  | #include "esp_ipc.h"
 | 
					
						
							| 
									
										
										
										
											2016-10-27 12:37:19 +08:00
										 |  |  | #include "esp_crosscore_int.h"
 | 
					
						
							| 
									
										
										
										
											2017-05-08 20:03:04 +08:00
										 |  |  | #include "esp_dport_access.h"
 | 
					
						
							| 
									
										
										
										
											2016-09-15 00:53:33 +08:00
										 |  |  | #include "esp_log.h"
 | 
					
						
							| 
									
										
										
										
											2016-10-25 22:16:08 +08:00
										 |  |  | #include "esp_vfs_dev.h"
 | 
					
						
							| 
									
										
										
										
											2016-10-25 22:12:07 +08:00
										 |  |  | #include "esp_newlib.h"
 | 
					
						
							| 
									
										
										
										
											2016-10-21 17:59:57 +08:00
										 |  |  | #include "esp_brownout.h"
 | 
					
						
							| 
									
										
										
										
											2016-10-21 19:30:29 +08:00
										 |  |  | #include "esp_int_wdt.h"
 | 
					
						
							| 
									
										
										
										
											2018-03-14 13:47:04 +05:30
										 |  |  | #include "esp_task.h"
 | 
					
						
							| 
									
										
										
										
											2016-10-21 19:30:29 +08:00
										 |  |  | #include "esp_task_wdt.h"
 | 
					
						
							| 
									
										
										
										
											2016-11-15 18:36:18 +08:00
										 |  |  | #include "esp_phy_init.h"
 | 
					
						
							| 
									
										
										
										
											2017-03-09 20:50:39 +08:00
										 |  |  | #include "esp_cache_err_int.h"
 | 
					
						
							| 
									
										
										
										
											2016-11-24 19:57:47 +08:00
										 |  |  | #include "esp_coexist.h"
 | 
					
						
							| 
									
										
										
										
											2017-03-29 21:09:47 +03:00
										 |  |  | #include "esp_panic.h"
 | 
					
						
							| 
									
										
										
										
											2016-12-22 02:56:23 +03:00
										 |  |  | #include "esp_core_dump.h"
 | 
					
						
							| 
									
										
										
										
											2017-01-25 19:35:28 +03:00
										 |  |  | #include "esp_app_trace.h"
 | 
					
						
							| 
									
										
										
										
											2018-02-15 20:09:03 +03:00
										 |  |  | #include "esp_dbg_stubs.h"
 | 
					
						
							| 
									
										
										
										
											2017-08-22 14:55:23 +10:00
										 |  |  | #include "esp_efuse.h"
 | 
					
						
							| 
									
										
										
										
											2017-07-20 16:26:35 +08:00
										 |  |  | #include "esp_spiram.h"
 | 
					
						
							| 
									
										
										
										
											2017-09-22 23:04:16 +08:00
										 |  |  | #include "esp_clk_internal.h"
 | 
					
						
							| 
									
										
										
										
											2017-08-08 04:21:19 +08:00
										 |  |  | #include "esp_timer.h"
 | 
					
						
							| 
									
										
										
										
											2017-09-22 23:02:58 +08:00
										 |  |  | #include "esp_pm.h"
 | 
					
						
							|  |  |  | #include "pm_impl.h"
 | 
					
						
							| 
									
										
										
										
											2016-10-17 12:18:17 +08:00
										 |  |  | #include "trax.h"
 | 
					
						
							| 
									
										
										
										
											2016-10-21 17:59:57 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-27 16:17:28 +08:00
										 |  |  | #define STRINGIFY(s) STRINGIFY2(s)
 | 
					
						
							|  |  |  | #define STRINGIFY2(s) #s
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-12 10:25:13 +08:00
										 |  |  | void start_cpu0(void) __attribute__((weak, alias("start_cpu0_default"))) __attribute__((noreturn)); | 
					
						
							|  |  |  | void start_cpu0_default(void) IRAM_ATTR __attribute__((noreturn)); | 
					
						
							| 
									
										
										
										
											2016-09-23 15:02:17 +08:00
										 |  |  | #if !CONFIG_FREERTOS_UNICORE
 | 
					
						
							| 
									
										
										
										
											2017-07-12 10:25:13 +08:00
										 |  |  | static void IRAM_ATTR call_start_cpu1() __attribute__((noreturn)); | 
					
						
							|  |  |  | void start_cpu1(void) __attribute__((weak, alias("start_cpu1_default"))) __attribute__((noreturn)); | 
					
						
							|  |  |  | void start_cpu1_default(void) IRAM_ATTR __attribute__((noreturn)); | 
					
						
							| 
									
										
										
										
											2016-09-23 15:02:17 +08:00
										 |  |  | static bool app_cpu_started = false; | 
					
						
							| 
									
										
										
										
											2016-09-26 14:35:09 +08:00
										 |  |  | #endif //!CONFIG_FREERTOS_UNICORE
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-26 12:29:00 +08:00
										 |  |  | static void do_global_ctors(void); | 
					
						
							|  |  |  | static void main_task(void* args); | 
					
						
							| 
									
										
										
										
											2016-09-27 19:30:43 +10:00
										 |  |  | extern void app_main(void); | 
					
						
							| 
									
										
										
										
											2017-09-04 21:46:16 +03:00
										 |  |  | extern esp_err_t esp_pthread_init(void); | 
					
						
							| 
									
										
										
										
											2016-08-17 23:08:22 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | extern int _bss_start; | 
					
						
							|  |  |  | extern int _bss_end; | 
					
						
							| 
									
										
										
										
											2016-10-13 11:46:51 +11:00
										 |  |  | extern int _rtc_bss_start; | 
					
						
							|  |  |  | extern int _rtc_bss_end; | 
					
						
							| 
									
										
										
										
											2016-08-17 23:08:22 +08:00
										 |  |  | extern int _init_start; | 
					
						
							| 
									
										
										
										
											2016-09-15 01:59:42 +08:00
										 |  |  | extern void (*__init_array_start)(void); | 
					
						
							|  |  |  | extern void (*__init_array_end)(void); | 
					
						
							|  |  |  | extern volatile int port_xSchedulerRunning[2]; | 
					
						
							| 
									
										
										
										
											2016-08-17 23:08:22 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-15 00:53:33 +08:00
										 |  |  | static const char* TAG = "cpu_start"; | 
					
						
							| 
									
										
										
										
											2016-08-17 23:08:22 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-08 13:34:13 +02:00
										 |  |  | struct object { long placeholder[ 10 ]; }; | 
					
						
							|  |  |  | void __register_frame_info (const void *begin, struct object *ob); | 
					
						
							|  |  |  | extern char __eh_frame[]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-06 11:27:17 +08:00
										 |  |  | //If CONFIG_SPIRAM_IGNORE_NOTFOUND is set and external RAM is not found or errors out on testing, this is set to false.
 | 
					
						
							|  |  |  | static bool s_spiram_okay=true; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-17 23:08:22 +08:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2016-09-15 01:59:42 +08:00
										 |  |  |  * We arrive here after the bootloader finished loading the program from flash. The hardware is mostly uninitialized, | 
					
						
							|  |  |  |  * and the app CPU is in reset. We do have a stack, so we can do the initialization in C. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2016-08-17 23:08:22 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-26 12:29:00 +08:00
										 |  |  | void IRAM_ATTR call_start_cpu0() | 
					
						
							| 
									
										
										
										
											2016-09-15 01:59:42 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2017-03-29 21:09:47 +03:00
										 |  |  | #if CONFIG_FREERTOS_UNICORE
 | 
					
						
							|  |  |  |     RESET_REASON rst_reas[1]; | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |     RESET_REASON rst_reas[2]; | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-09-15 01:59:42 +08:00
										 |  |  |     cpu_configure_region_protection(); | 
					
						
							| 
									
										
										
										
											2018-11-01 11:30:48 +08:00
										 |  |  |     cpu_init_memctl(); | 
					
						
							| 
									
										
										
										
											2016-09-15 01:59:42 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     //Move exception vectors to IRAM
 | 
					
						
							|  |  |  |     asm volatile (\ | 
					
						
							|  |  |  |                   "wsr    %0, vecbase\n" \ | 
					
						
							|  |  |  |                   ::"r"(&_init_start)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-29 21:09:47 +03:00
										 |  |  |     rst_reas[0] = rtc_get_reset_reason(0); | 
					
						
							| 
									
										
										
										
											2017-04-11 22:55:31 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-29 21:09:47 +03:00
										 |  |  | #if !CONFIG_FREERTOS_UNICORE
 | 
					
						
							|  |  |  |     rst_reas[1] = rtc_get_reset_reason(1); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-04-16 23:34:03 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-29 21:09:47 +03:00
										 |  |  |     // from panic handler we can be reset by RWDT or TG0WDT
 | 
					
						
							|  |  |  |     if (rst_reas[0] == RTCWDT_SYS_RESET || rst_reas[0] == TG0WDT_SYS_RESET | 
					
						
							|  |  |  | #if !CONFIG_FREERTOS_UNICORE
 | 
					
						
							|  |  |  |         || rst_reas[1] == RTCWDT_SYS_RESET || rst_reas[1] == TG0WDT_SYS_RESET | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-04-11 22:55:31 +03:00
										 |  |  |     ) { | 
					
						
							| 
									
										
										
										
											2017-03-29 21:09:47 +03:00
										 |  |  |         esp_panic_wdt_stop(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-16 23:34:03 +08:00
										 |  |  |     //Clear BSS. Please do not attempt to do any complex stuff (like early logging) before this.
 | 
					
						
							| 
									
										
										
										
											2016-09-15 01:59:42 +08:00
										 |  |  |     memset(&_bss_start, 0, (&_bss_end - &_bss_start) * sizeof(_bss_start)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-13 11:46:51 +11:00
										 |  |  |     /* Unless waking from deep sleep (implying RTC memory is intact), clear RTC bss */ | 
					
						
							| 
									
										
										
										
											2017-03-29 21:09:47 +03:00
										 |  |  |     if (rst_reas[0] != DEEPSLEEP_RESET) { | 
					
						
							| 
									
										
										
										
											2016-10-13 11:46:51 +11:00
										 |  |  |         memset(&_rtc_bss_start, 0, (&_rtc_bss_end - &_rtc_bss_start) * sizeof(_rtc_bss_start)); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-20 16:26:35 +08:00
										 |  |  | #if CONFIG_SPIRAM_BOOT_INIT
 | 
					
						
							| 
									
										
										
										
											2017-09-18 23:02:33 +08:00
										 |  |  |     esp_spiram_init_cache(); | 
					
						
							| 
									
										
										
										
											2017-07-20 16:26:35 +08:00
										 |  |  |     if (esp_spiram_init() != ESP_OK) { | 
					
						
							| 
									
										
										
										
											2018-02-06 11:27:17 +08:00
										 |  |  | #if CONFIG_SPIRAM_IGNORE_NOTFOUND
 | 
					
						
							|  |  |  |         ESP_EARLY_LOGI(TAG, "Failed to init external RAM; continuing without it."); | 
					
						
							|  |  |  |         s_spiram_okay = false; | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2017-07-20 16:26:35 +08:00
										 |  |  |         ESP_EARLY_LOGE(TAG, "Failed to init external RAM!"); | 
					
						
							|  |  |  |         abort(); | 
					
						
							| 
									
										
										
										
											2018-02-06 11:27:17 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-07-20 16:26:35 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-15 01:59:42 +08:00
										 |  |  |     ESP_EARLY_LOGI(TAG, "Pro cpu up."); | 
					
						
							| 
									
										
										
										
											2016-08-24 16:21:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-26 14:35:09 +08:00
										 |  |  | #if !CONFIG_FREERTOS_UNICORE
 | 
					
						
							| 
									
										
										
										
											2018-09-19 11:34:34 +08:00
										 |  |  |     if (REG_GET_BIT(EFUSE_BLK0_RDATA3_REG, EFUSE_RD_CHIP_VER_DIS_APP_CPU)) { | 
					
						
							|  |  |  |         ESP_EARLY_LOGE(TAG, "Running on single core chip, but application is built with dual core support."); | 
					
						
							|  |  |  |         ESP_EARLY_LOGE(TAG, "Please enable CONFIG_FREERTOS_UNICORE option in menuconfig."); | 
					
						
							|  |  |  |         abort(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-09-26 12:29:00 +08:00
										 |  |  |     ESP_EARLY_LOGI(TAG, "Starting app cpu, entry point is %p", call_start_cpu1); | 
					
						
							| 
									
										
										
										
											2016-11-04 12:18:57 +08:00
										 |  |  |     //Flush and enable icache for APP CPU
 | 
					
						
							|  |  |  |     Cache_Flush(1); | 
					
						
							|  |  |  |     Cache_Read_Enable(1); | 
					
						
							| 
									
										
										
										
											2016-11-21 17:15:37 +08:00
										 |  |  |     esp_cpu_unstall(1); | 
					
						
							| 
									
										
										
										
											2017-06-12 15:16:57 +08:00
										 |  |  |     // Enable clock and reset APP CPU. Note that OpenOCD may have already
 | 
					
						
							|  |  |  |     // enabled clock and taken APP CPU out of reset. In this case don't reset
 | 
					
						
							|  |  |  |     // APP CPU again, as that will clear the breakpoints which may have already
 | 
					
						
							|  |  |  |     // been set.
 | 
					
						
							|  |  |  |     if (!DPORT_GET_PERI_REG_MASK(DPORT_APPCPU_CTRL_B_REG, DPORT_APPCPU_CLKGATE_EN)) { | 
					
						
							|  |  |  |         DPORT_SET_PERI_REG_MASK(DPORT_APPCPU_CTRL_B_REG, DPORT_APPCPU_CLKGATE_EN); | 
					
						
							|  |  |  |         DPORT_CLEAR_PERI_REG_MASK(DPORT_APPCPU_CTRL_C_REG, DPORT_APPCPU_RUNSTALL); | 
					
						
							|  |  |  |         DPORT_SET_PERI_REG_MASK(DPORT_APPCPU_CTRL_A_REG, DPORT_APPCPU_RESETTING); | 
					
						
							|  |  |  |         DPORT_CLEAR_PERI_REG_MASK(DPORT_APPCPU_CTRL_A_REG, DPORT_APPCPU_RESETTING); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-09-26 12:29:00 +08:00
										 |  |  |     ets_set_appcpu_boot_addr((uint32_t)call_start_cpu1); | 
					
						
							| 
									
										
										
										
											2016-08-17 23:08:22 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-15 01:59:42 +08:00
										 |  |  |     while (!app_cpu_started) { | 
					
						
							|  |  |  |         ets_delay_us(100); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-08-17 23:08:22 +08:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2016-09-15 01:59:42 +08:00
										 |  |  |     ESP_EARLY_LOGI(TAG, "Single core mode"); | 
					
						
							| 
									
										
										
										
											2017-05-08 20:03:04 +08:00
										 |  |  |     DPORT_CLEAR_PERI_REG_MASK(DPORT_APPCPU_CTRL_B_REG, DPORT_APPCPU_CLKGATE_EN); | 
					
						
							| 
									
										
										
										
											2016-08-17 23:08:22 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-01-25 17:25:50 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-20 16:26:35 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | #if CONFIG_SPIRAM_MEMTEST
 | 
					
						
							| 
									
										
										
										
											2018-02-06 11:27:17 +08:00
										 |  |  |     if (s_spiram_okay) { | 
					
						
							|  |  |  |         bool ext_ram_ok=esp_spiram_test(); | 
					
						
							|  |  |  |         if (!ext_ram_ok) { | 
					
						
							|  |  |  |             ESP_EARLY_LOGE(TAG, "External RAM failed memory test!"); | 
					
						
							|  |  |  |             abort(); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-07-20 16:26:35 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-25 17:25:50 +08:00
										 |  |  |     /* Initialize heap allocator. WARNING: This *needs* to happen *after* the app cpu has booted.
 | 
					
						
							|  |  |  |        If the heap allocator is initialized first, it will put free memory linked list items into | 
					
						
							|  |  |  |        memory also used by the ROM. Starting the app cpu will let its ROM initialize that memory, | 
					
						
							|  |  |  |        corrupting those linked lists. Initializing the allocator *after* the app cpu has booted | 
					
						
							| 
									
										
										
										
											2017-07-20 16:26:35 +08:00
										 |  |  |        works around this problem. | 
					
						
							|  |  |  |        With SPI RAM enabled, there's a second reason: half of the SPI RAM will be managed by the | 
					
						
							|  |  |  |        app CPU, and when that is not up yet, the memory will be inaccessible and heap_caps_init may | 
					
						
							|  |  |  |        fail initializing it properly. */ | 
					
						
							| 
									
										
										
										
											2017-05-03 18:03:28 +10:00
										 |  |  |     heap_caps_init(); | 
					
						
							| 
									
										
										
										
											2017-01-25 17:25:50 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-15 01:59:42 +08:00
										 |  |  |     ESP_EARLY_LOGI(TAG, "Pro cpu start user code"); | 
					
						
							| 
									
										
										
										
											2016-09-26 12:29:00 +08:00
										 |  |  |     start_cpu0(); | 
					
						
							| 
									
										
										
										
											2016-08-17 23:08:22 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 15:02:17 +08:00
										 |  |  | #if !CONFIG_FREERTOS_UNICORE
 | 
					
						
							| 
									
										
										
										
											2017-06-05 18:26:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | static void wdt_reset_cpu1_info_enable(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     DPORT_REG_SET_BIT(DPORT_APP_CPU_RECORD_CTRL_REG, DPORT_APP_CPU_PDEBUG_ENABLE | DPORT_APP_CPU_RECORD_ENABLE); | 
					
						
							|  |  |  |     DPORT_REG_CLR_BIT(DPORT_APP_CPU_RECORD_CTRL_REG, DPORT_APP_CPU_RECORD_ENABLE); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-26 12:29:00 +08:00
										 |  |  | void IRAM_ATTR call_start_cpu1() | 
					
						
							| 
									
										
										
										
											2016-09-15 01:59:42 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     asm volatile (\ | 
					
						
							|  |  |  |                   "wsr    %0, vecbase\n" \ | 
					
						
							|  |  |  |                   ::"r"(&_init_start)); | 
					
						
							| 
									
										
										
										
											2016-08-17 23:08:22 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-22 06:07:37 +03:00
										 |  |  |     ets_set_appcpu_boot_addr(0); | 
					
						
							| 
									
										
										
										
											2016-09-15 01:59:42 +08:00
										 |  |  |     cpu_configure_region_protection(); | 
					
						
							| 
									
										
										
										
											2018-11-01 11:30:48 +08:00
										 |  |  |     cpu_init_memctl(); | 
					
						
							| 
									
										
										
										
											2016-08-17 23:08:22 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-27 16:17:28 +08:00
										 |  |  | #if CONFIG_CONSOLE_UART_NONE
 | 
					
						
							|  |  |  |     ets_install_putc1(NULL); | 
					
						
							|  |  |  |     ets_install_putc2(NULL); | 
					
						
							|  |  |  | #else // CONFIG_CONSOLE_UART_NONE
 | 
					
						
							|  |  |  |     uartAttach(); | 
					
						
							|  |  |  |     ets_install_uart_printf(); | 
					
						
							|  |  |  |     uart_tx_switch(CONFIG_CONSOLE_UART_NUM); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-05 18:26:14 +08:00
										 |  |  |     wdt_reset_cpu1_info_enable(); | 
					
						
							| 
									
										
										
										
											2016-09-15 01:59:42 +08:00
										 |  |  |     ESP_EARLY_LOGI(TAG, "App cpu up."); | 
					
						
							|  |  |  |     app_cpu_started = 1; | 
					
						
							| 
									
										
										
										
											2016-09-26 12:29:00 +08:00
										 |  |  |     start_cpu1(); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-09-26 14:35:09 +08:00
										 |  |  | #endif //!CONFIG_FREERTOS_UNICORE
 | 
					
						
							| 
									
										
										
										
											2016-09-26 12:29:00 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-15 17:20:25 +08:00
										 |  |  | static void intr_matrix_clear(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     //Clear all the interrupt matrix register
 | 
					
						
							|  |  |  |     for (int i = ETS_WIFI_MAC_INTR_SOURCE; i <= ETS_CACHE_IA_INTR_SOURCE; i++) { | 
					
						
							|  |  |  |         intr_matrix_set(0, i, ETS_INVALID_INUM); | 
					
						
							|  |  |  | #if !CONFIG_FREERTOS_UNICORE
 | 
					
						
							|  |  |  |         intr_matrix_set(1, i, ETS_INVALID_INUM); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-26 12:29:00 +08:00
										 |  |  | void start_cpu0_default(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-08-24 02:53:20 +03:00
										 |  |  |     esp_err_t err; | 
					
						
							| 
									
										
										
										
											2016-11-21 22:56:11 +08:00
										 |  |  |     esp_setup_syscall_table(); | 
					
						
							| 
									
										
										
										
											2017-09-05 17:29:57 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-06 11:27:17 +08:00
										 |  |  |     if (s_spiram_okay) { | 
					
						
							| 
									
										
										
										
											2017-09-05 17:29:57 +08:00
										 |  |  | #if CONFIG_SPIRAM_BOOT_INIT && (CONFIG_SPIRAM_USE_CAPS_ALLOC || CONFIG_SPIRAM_USE_MALLOC)
 | 
					
						
							| 
									
										
										
										
											2018-02-06 11:27:17 +08:00
										 |  |  |         esp_err_t r=esp_spiram_add_to_heapalloc(); | 
					
						
							|  |  |  |         if (r != ESP_OK) { | 
					
						
							|  |  |  |             ESP_EARLY_LOGE(TAG, "External RAM could not be added to heap!"); | 
					
						
							|  |  |  |             abort(); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-09-22 16:02:39 +08:00
										 |  |  | #if CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL
 | 
					
						
							| 
									
										
										
										
											2018-02-06 11:27:17 +08:00
										 |  |  |         r=esp_spiram_reserve_dma_pool(CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL); | 
					
						
							|  |  |  |         if (r != ESP_OK) { | 
					
						
							|  |  |  |             ESP_EARLY_LOGE(TAG, "Could not reserve internal/DMA pool!"); | 
					
						
							|  |  |  |             abort(); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-09-22 16:02:39 +08:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | #if CONFIG_SPIRAM_USE_MALLOC
 | 
					
						
							| 
									
										
										
										
											2018-02-06 11:27:17 +08:00
										 |  |  |         heap_caps_malloc_extmem_enable(CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL); | 
					
						
							| 
									
										
										
										
											2017-09-22 16:02:39 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-09-05 17:29:57 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2018-02-06 11:27:17 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-09-05 17:29:57 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-17 12:18:17 +08:00
										 |  |  | //Enable trace memory and immediately start trace.
 | 
					
						
							| 
									
										
										
										
											2017-01-17 22:58:11 +08:00
										 |  |  | #if CONFIG_ESP32_TRAX
 | 
					
						
							|  |  |  | #if CONFIG_ESP32_TRAX_TWOBANKS
 | 
					
						
							| 
									
										
										
										
											2016-10-17 12:18:17 +08:00
										 |  |  |     trax_enable(TRAX_ENA_PRO_APP); | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |     trax_enable(TRAX_ENA_PRO); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     trax_start_trace(TRAX_DOWNCOUNT_WORDS); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-04-24 18:36:47 +08:00
										 |  |  |     esp_clk_init(); | 
					
						
							| 
									
										
										
										
											2017-08-08 16:58:58 +08:00
										 |  |  |     esp_perip_clk_init(); | 
					
						
							| 
									
										
										
										
											2017-06-15 17:20:25 +08:00
										 |  |  |     intr_matrix_clear(); | 
					
						
							| 
									
										
										
										
											2017-08-21 22:30:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-18 15:36:10 +02:00
										 |  |  | #ifndef CONFIG_CONSOLE_UART_NONE
 | 
					
						
							| 
									
										
										
										
											2017-08-21 22:30:23 +08:00
										 |  |  | #ifdef CONFIG_PM_ENABLE
 | 
					
						
							|  |  |  |     const int uart_clk_freq = REF_CLK_FREQ; | 
					
						
							|  |  |  |     /* When DFS is enabled, use REFTICK as UART clock source */ | 
					
						
							|  |  |  |     CLEAR_PERI_REG_MASK(UART_CONF0_REG(CONFIG_CONSOLE_UART_NUM), UART_TICK_REF_ALWAYS_ON); | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |     const int uart_clk_freq = APB_CLK_FREQ; | 
					
						
							|  |  |  | #endif // CONFIG_PM_DFS_ENABLE
 | 
					
						
							|  |  |  |     uart_div_modify(CONFIG_CONSOLE_UART_NUM, (uart_clk_freq << 4) / CONFIG_CONSOLE_UART_BAUDRATE); | 
					
						
							|  |  |  | #endif // CONFIG_CONSOLE_UART_NONE
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-21 17:59:57 +08:00
										 |  |  | #if CONFIG_BROWNOUT_DET
 | 
					
						
							|  |  |  |     esp_brownout_init(); | 
					
						
							| 
									
										
										
										
											2017-08-22 14:55:23 +10:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | #if CONFIG_DISABLE_BASIC_ROM_CONSOLE
 | 
					
						
							|  |  |  |     esp_efuse_disable_basic_rom_console(); | 
					
						
							| 
									
										
										
										
											2016-10-21 17:59:57 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-03-19 23:59:19 +08:00
										 |  |  |     rtc_gpio_force_hold_dis_all(); | 
					
						
							| 
									
										
										
										
											2016-10-25 22:16:08 +08:00
										 |  |  |     esp_vfs_dev_uart_register(); | 
					
						
							|  |  |  |     esp_reent_init(_GLOBAL_REENT); | 
					
						
							| 
									
										
										
										
											2016-10-27 16:17:28 +08:00
										 |  |  | #ifndef CONFIG_CONSOLE_UART_NONE
 | 
					
						
							|  |  |  |     const char* default_uart_dev = "/dev/uart/" STRINGIFY(CONFIG_CONSOLE_UART_NUM); | 
					
						
							| 
									
										
										
										
											2016-11-08 09:08:23 +08:00
										 |  |  |     _GLOBAL_REENT->_stdin  = fopen(default_uart_dev, "r"); | 
					
						
							| 
									
										
										
										
											2016-10-26 14:05:56 +08:00
										 |  |  |     _GLOBAL_REENT->_stdout = fopen(default_uart_dev, "w"); | 
					
						
							|  |  |  |     _GLOBAL_REENT->_stderr = fopen(default_uart_dev, "w"); | 
					
						
							| 
									
										
										
										
											2016-10-27 16:17:28 +08:00
										 |  |  | #else
 | 
					
						
							|  |  |  |     _GLOBAL_REENT->_stdin  = (FILE*) &__sf_fake_stdin; | 
					
						
							|  |  |  |     _GLOBAL_REENT->_stdout = (FILE*) &__sf_fake_stdout; | 
					
						
							|  |  |  |     _GLOBAL_REENT->_stderr = (FILE*) &__sf_fake_stderr; | 
					
						
							| 
									
										
										
										
											2017-01-25 19:35:28 +03:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-08-08 04:21:19 +08:00
										 |  |  |     esp_timer_init(); | 
					
						
							| 
									
										
										
										
											2017-08-29 11:48:18 +08:00
										 |  |  |     esp_set_time_from_rtc(); | 
					
						
							| 
									
										
										
										
											2017-01-25 19:35:28 +03:00
										 |  |  | #if CONFIG_ESP32_APPTRACE_ENABLE
 | 
					
						
							| 
									
										
										
										
											2017-08-24 02:53:20 +03:00
										 |  |  |     err = esp_apptrace_init(); | 
					
						
							| 
									
										
										
										
											2017-09-14 19:36:10 +03:00
										 |  |  |     assert(err == ESP_OK && "Failed to init apptrace module on PRO CPU!"); | 
					
						
							| 
									
										
										
										
											2017-03-22 06:07:37 +03:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | #if CONFIG_SYSVIEW_ENABLE
 | 
					
						
							|  |  |  |     SEGGER_SYSVIEW_Conf(); | 
					
						
							| 
									
										
										
										
											2018-02-15 20:09:03 +03:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | #if CONFIG_ESP32_DEBUG_STUBS_ENABLE
 | 
					
						
							|  |  |  |     esp_dbg_stubs_init(); | 
					
						
							| 
									
										
										
										
											2016-10-27 16:17:28 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-08-24 02:53:20 +03:00
										 |  |  |     err = esp_pthread_init(); | 
					
						
							| 
									
										
										
										
											2017-09-14 19:36:10 +03:00
										 |  |  |     assert(err == ESP_OK && "Failed to init pthread module!"); | 
					
						
							| 
									
										
										
										
											2017-08-24 02:53:20 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-26 12:23:01 +08:00
										 |  |  |     do_global_ctors(); | 
					
						
							| 
									
										
										
										
											2016-11-25 17:33:51 +08:00
										 |  |  | #if CONFIG_INT_WDT
 | 
					
						
							|  |  |  |     esp_int_wdt_init(); | 
					
						
							| 
									
										
										
										
											2018-01-11 21:43:58 +08:00
										 |  |  |     //Initialize the interrupt watch dog for CPU0.
 | 
					
						
							|  |  |  |     esp_int_wdt_cpu_init(); | 
					
						
							| 
									
										
										
										
											2016-11-25 17:33:51 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-03-09 20:50:39 +08:00
										 |  |  |     esp_cache_err_int_init(); | 
					
						
							| 
									
										
										
										
											2016-10-27 12:37:19 +08:00
										 |  |  |     esp_crosscore_int_init(); | 
					
						
							| 
									
										
										
										
											2016-10-26 12:23:01 +08:00
										 |  |  |     esp_ipc_init(); | 
					
						
							| 
									
										
										
										
											2017-05-08 20:03:04 +08:00
										 |  |  | #ifndef CONFIG_FREERTOS_UNICORE
 | 
					
						
							|  |  |  |     esp_dport_access_int_init(); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-10-26 12:23:01 +08:00
										 |  |  |     spi_flash_init(); | 
					
						
							| 
									
										
										
										
											2017-01-03 22:01:40 +03:00
										 |  |  |     /* init default OS-aware flash access critical section */ | 
					
						
							|  |  |  |     spi_flash_guard_set(&g_flash_guard_default_ops); | 
					
						
							| 
									
										
										
										
											2017-09-22 23:02:58 +08:00
										 |  |  | #ifdef CONFIG_PM_ENABLE
 | 
					
						
							|  |  |  |     esp_pm_impl_init(); | 
					
						
							|  |  |  | #ifdef CONFIG_PM_DFS_INIT_AUTO
 | 
					
						
							|  |  |  |     rtc_cpu_freq_t max_freq; | 
					
						
							|  |  |  |     rtc_clk_cpu_freq_from_mhz(CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ, &max_freq); | 
					
						
							|  |  |  |     esp_pm_config_esp32_t cfg = { | 
					
						
							|  |  |  |             .max_cpu_freq = max_freq, | 
					
						
							|  |  |  |             .min_cpu_freq = RTC_CPU_FREQ_XTAL | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |     esp_pm_configure(&cfg); | 
					
						
							|  |  |  | #endif //CONFIG_PM_DFS_INIT_AUTO
 | 
					
						
							|  |  |  | #endif //CONFIG_PM_ENABLE
 | 
					
						
							| 
									
										
										
										
											2016-10-21 17:59:57 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-19 20:24:55 +03:00
										 |  |  | #if CONFIG_ESP32_ENABLE_COREDUMP
 | 
					
						
							|  |  |  |     esp_core_dump_init(); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-12 11:33:51 +08:00
										 |  |  |     portBASE_TYPE res = xTaskCreatePinnedToCore(&main_task, "main", | 
					
						
							|  |  |  |                                                 ESP_TASK_MAIN_STACK, NULL, | 
					
						
							|  |  |  |                                                 ESP_TASK_MAIN_PRIO, NULL, 0); | 
					
						
							|  |  |  |     assert(res == pdTRUE); | 
					
						
							| 
									
										
										
										
											2016-09-26 12:29:00 +08:00
										 |  |  |     ESP_LOGI(TAG, "Starting scheduler on PRO CPU."); | 
					
						
							|  |  |  |     vTaskStartScheduler(); | 
					
						
							| 
									
										
										
										
											2017-07-12 10:25:13 +08:00
										 |  |  |     abort(); /* Only get to here if not enough free heap to start scheduler */ | 
					
						
							| 
									
										
										
										
											2016-08-17 23:08:22 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-26 14:35:09 +08:00
										 |  |  | #if !CONFIG_FREERTOS_UNICORE
 | 
					
						
							| 
									
										
										
										
											2016-09-26 12:29:00 +08:00
										 |  |  | void start_cpu1_default(void) | 
					
						
							| 
									
										
										
										
											2016-09-15 01:59:42 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2017-09-13 19:48:00 +02:00
										 |  |  |     // Wait for FreeRTOS initialization to finish on PRO CPU
 | 
					
						
							|  |  |  |     while (port_xSchedulerRunning[0] == 0) { | 
					
						
							|  |  |  |         ; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-01-17 22:58:11 +08:00
										 |  |  | #if CONFIG_ESP32_TRAX_TWOBANKS
 | 
					
						
							| 
									
										
										
										
											2016-10-17 12:18:17 +08:00
										 |  |  |     trax_start_trace(TRAX_DOWNCOUNT_WORDS); | 
					
						
							| 
									
										
										
										
											2017-01-25 19:35:28 +03:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | #if CONFIG_ESP32_APPTRACE_ENABLE
 | 
					
						
							|  |  |  |     esp_err_t err = esp_apptrace_init(); | 
					
						
							| 
									
										
										
										
											2017-09-14 19:36:10 +03:00
										 |  |  |     assert(err == ESP_OK && "Failed to init apptrace module on APP CPU!"); | 
					
						
							| 
									
										
										
										
											2018-01-11 21:43:58 +08:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | #if CONFIG_INT_WDT
 | 
					
						
							|  |  |  |     //Initialize the interrupt watch dog for CPU1.
 | 
					
						
							|  |  |  |     esp_int_wdt_cpu_init(); | 
					
						
							| 
									
										
										
										
											2016-10-17 12:18:17 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-12-12 20:05:58 +08:00
										 |  |  |     //Take care putting stuff here: if asked, FreeRTOS will happily tell you the scheduler
 | 
					
						
							|  |  |  |     //has started, but it isn't active *on this CPU* yet.
 | 
					
						
							| 
									
										
										
										
											2017-03-09 20:50:39 +08:00
										 |  |  |     esp_cache_err_int_init(); | 
					
						
							| 
									
										
										
										
											2016-10-27 12:37:19 +08:00
										 |  |  |     esp_crosscore_int_init(); | 
					
						
							| 
									
										
										
										
											2017-05-08 20:03:04 +08:00
										 |  |  |     esp_dport_access_int_init(); | 
					
						
							| 
									
										
										
										
											2016-12-12 20:05:58 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     ESP_EARLY_LOGI(TAG, "Starting scheduler on APP CPU."); | 
					
						
							| 
									
										
										
										
											2016-09-15 01:59:42 +08:00
										 |  |  |     xPortStartScheduler(); | 
					
						
							| 
									
										
										
										
											2017-07-12 10:25:13 +08:00
										 |  |  |     abort(); /* Only get to here if FreeRTOS somehow very broken */ | 
					
						
							| 
									
										
										
										
											2016-09-15 01:59:42 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2016-09-26 14:35:09 +08:00
										 |  |  | #endif //!CONFIG_FREERTOS_UNICORE
 | 
					
						
							| 
									
										
										
										
											2016-08-17 23:08:22 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-17 12:38:19 +03:00
										 |  |  | #ifdef CONFIG_CXX_EXCEPTIONS
 | 
					
						
							|  |  |  | size_t __cxx_eh_arena_size_get() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return CONFIG_CXX_EXCEPTIONS_EMG_POOL_SIZE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-15 01:59:42 +08:00
										 |  |  | static void do_global_ctors(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-10-04 17:29:21 +11:00
										 |  |  | #ifdef CONFIG_CXX_EXCEPTIONS
 | 
					
						
							| 
									
										
										
										
											2017-06-08 13:34:13 +02:00
										 |  |  |     static struct object ob; | 
					
						
							|  |  |  |     __register_frame_info( __eh_frame, &ob ); | 
					
						
							| 
									
										
										
										
											2017-10-04 17:29:21 +11:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-06-08 13:34:13 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-17 23:08:22 +08:00
										 |  |  |     void (**p)(void); | 
					
						
							| 
									
										
										
										
											2016-09-26 03:05:25 +08:00
										 |  |  |     for (p = &__init_array_end - 1; p >= &__init_array_start; --p) { | 
					
						
							| 
									
										
										
										
											2016-08-17 23:08:22 +08:00
										 |  |  |         (*p)(); | 
					
						
							| 
									
										
										
										
											2016-09-15 01:59:42 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-08-17 23:08:22 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-26 12:29:00 +08:00
										 |  |  | static void main_task(void* args) | 
					
						
							| 
									
										
										
										
											2016-09-26 00:50:57 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-12-08 01:41:27 +08:00
										 |  |  |     // Now that the application is about to start, disable boot watchdogs
 | 
					
						
							|  |  |  |     REG_CLR_BIT(TIMG_WDTCONFIG0_REG(0), TIMG_WDT_FLASHBOOT_MOD_EN_S); | 
					
						
							|  |  |  |     REG_CLR_BIT(RTC_CNTL_WDTCONFIG0_REG, RTC_CNTL_WDT_FLASHBOOT_MOD_EN); | 
					
						
							| 
									
										
										
										
											2017-04-28 14:08:58 +10:00
										 |  |  | #if !CONFIG_FREERTOS_UNICORE
 | 
					
						
							|  |  |  |     // Wait for FreeRTOS initialization to finish on APP CPU, before replacing its startup stack
 | 
					
						
							|  |  |  |     while (port_xSchedulerRunning[1] == 0) { | 
					
						
							|  |  |  |         ; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-01-25 17:25:50 +08:00
										 |  |  |     //Enable allocation in region where the startup stacks were located.
 | 
					
						
							| 
									
										
										
										
											2017-05-03 18:03:28 +10:00
										 |  |  |     heap_caps_enable_nonos_stack_heaps(); | 
					
						
							| 
									
										
										
										
											2017-10-09 18:07:30 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     //Initialize task wdt if configured to do so
 | 
					
						
							|  |  |  | #ifdef CONFIG_TASK_WDT_PANIC
 | 
					
						
							|  |  |  |     ESP_ERROR_CHECK(esp_task_wdt_init(CONFIG_TASK_WDT_TIMEOUT_S, true)) | 
					
						
							|  |  |  | #elif CONFIG_TASK_WDT
 | 
					
						
							|  |  |  |     ESP_ERROR_CHECK(esp_task_wdt_init(CONFIG_TASK_WDT_TIMEOUT_S, false)) | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     //Add IDLE 0 to task wdt
 | 
					
						
							|  |  |  | #ifdef CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0
 | 
					
						
							|  |  |  |     TaskHandle_t idle_0 = xTaskGetIdleTaskHandleForCPU(0); | 
					
						
							|  |  |  |     if(idle_0 != NULL){ | 
					
						
							|  |  |  |         ESP_ERROR_CHECK(esp_task_wdt_add(idle_0)) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     //Add IDLE 1 to task wdt
 | 
					
						
							|  |  |  | #ifdef CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1
 | 
					
						
							|  |  |  |     TaskHandle_t idle_1 = xTaskGetIdleTaskHandleForCPU(1); | 
					
						
							|  |  |  |     if(idle_1 != NULL){ | 
					
						
							|  |  |  |         ESP_ERROR_CHECK(esp_task_wdt_add(idle_1)) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-26 14:48:41 +08:00
										 |  |  |     app_main(); | 
					
						
							| 
									
										
										
										
											2016-09-26 00:50:57 +08:00
										 |  |  |     vTaskDelete(NULL); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 |