diff --git a/components/esp8266/Kconfig b/components/esp8266/Kconfig index 6fd3bba4..a28c60c3 100644 --- a/components/esp8266/Kconfig +++ b/components/esp8266/Kconfig @@ -35,6 +35,11 @@ config SOC_FULL_ICACHE Enable this option, full 32 KB iram instead of 16 KB iram will be used as icache, so the heap use can use may reduce a lot. +config SOC_IRAM_SIZE + hex + default 0x8000 if SOC_FULL_ICACHE + default 0xC000 if !SOC_FULL_ICACHE + choice CONSOLE_UART_NUM prompt "UART peripheral to use for console output (0-1)" default CONSOLE_UART_CUSTOM_NUM_0 @@ -119,6 +124,14 @@ config WIFI_PPT_TASKSTACK_SIZE which calls promiscuous callback function. So if user's function is complex, the stack must be set larger. +config ESP8266_CORE_GLOBAL_DATA_LINK_IRAM + bool "Link libcore.a internal global data to IRAM" + default y + depends on !LWIP_HIGH_THROUGHPUT + depends on !SOC_FULL_ICACHE + help + Link libcore.a internal global data(.bss .data COMMON) from DRAM to IRAM. + endmenu menu WIFI diff --git a/components/esp8266/component.mk b/components/esp8266/component.mk index b181a24f..1d7a4008 100644 --- a/components/esp8266/component.mk +++ b/components/esp8266/component.mk @@ -18,12 +18,13 @@ endif #Linker scripts used to link the final application. #Warning: These linker scripts are only used when the normal app is compiled; the bootloader #specifies its own scripts. -LINKER_SCRIPTS += esp8266.common.ld esp8266.rom.ld esp8266.peripherals.ld +LINKER_SCRIPTS += esp8266.rom.ld esp8266.peripherals.ld COMPONENT_ADD_LDFLAGS += -L$(COMPONENT_PATH)/lib \ $(addprefix -l,$(LIBS)) \ -L $(COMPONENT_PATH)/ld \ -T esp8266_out.ld \ + -T esp8266_common_out.ld \ -Wl,--no-check-sections \ -u call_user_start \ $(addprefix -T ,$(LINKER_SCRIPTS)) @@ -38,11 +39,14 @@ COMPONENT_ADD_LINKER_DEPS := $(ALL_LIB_FILES) $(addprefix ld/,$(LINKER_SCRIPTS)) # # The library doesn't really depend on esp8266_out.ld, but it # saves us from having to add the target to a Makefile.projbuild -$(COMPONENT_LIBRARY): esp8266_out.ld +$(COMPONENT_LIBRARY): esp8266_out.ld esp8266_common_out.ld esp8266_out.ld: $(COMPONENT_PATH)/ld/esp8266.ld ../include/sdkconfig.h $(CC) -I ../include -C -P -x c -E $< -o $@ +esp8266_common_out.ld: $(COMPONENT_PATH)/ld/esp8266.common.ld ../include/sdkconfig.h + $(CC) -I ../include -C -P -x c -E $< -o $@ + COMPONENT_EXTRA_CLEAN := esp8266_out.ld endif \ No newline at end of file diff --git a/components/esp8266/ld/esp8266.common.ld b/components/esp8266/ld/esp8266.common.ld index 0edd9f0a..514c6def 100644 --- a/components/esp8266/ld/esp8266.common.ld +++ b/components/esp8266/ld/esp8266.common.ld @@ -1,6 +1,8 @@ /* This linker script generated from xt-genldscripts.tpp for LSP . */ /* Linker Script for ld -N */ +#include "sdkconfig.h" + PHDRS { dport0_0_phdr PT_LOAD; @@ -108,6 +110,25 @@ SECTIONS *(.fini.literal) *(.fini) *(.gnu.version) + +#ifdef CONFIG_LWIP_GLOBAL_DATA_LINK_IRAM + *liblwip.a:(.bss .data .bss.* .data.* COMMON) +#endif + +#ifdef CONFIG_TCPIP_ADAPTER_GLOBAL_DATA_LINK_IRAM + *libtcpip_adapter.a:(.bss .data .bss.* .data.* COMMON) +#endif + +#ifdef CONFIG_ESP8266_CORE_GLOBAL_DATA_LINK_IRAM + *libcore.a:(.bss .data .bss.* .data.* COMMON) +#endif + +#ifdef CONFIG_FREERTOS_GLOBAL_DATA_LINK_IRAM + *libfreertos.a:tasks.o(.bss .data .bss.* .data.* COMMON) + *libfreertos.a:timers.o(.bss .data .bss.* .data.* COMMON) + *libfreertos.a:freertos_hooks.o(.bss .data .bss.* .data.* COMMON) +#endif + _text_end = ABSOLUTE(.); _etext = .; } >iram1_0_seg :iram1_0_phdr diff --git a/components/esp8266/ld/esp8266.ld b/components/esp8266/ld/esp8266.ld index 5fb13e75..cfa0d01b 100644 --- a/components/esp8266/ld/esp8266.ld +++ b/components/esp8266/ld/esp8266.ld @@ -20,11 +20,11 @@ MEMORY { dport0_0_seg : org = 0x3FF00000, len = 0x10 - /* All .data/.bss/heap are in this segment. 1024 bytes is for system start and interrupt*/ - dram0_0_seg : org = 0x3FFE8000, len = 0x18000 - 1024 + /* All .data/.bss/heap are in this segment. */ + dram0_0_seg : org = 0x3FFE8000, len = 0x18000 /* Functions which are critical should be put in this segment. */ - iram1_0_seg : org = 0x40100000, len = 0x8000 + iram1_0_seg : org = 0x40100000, len = CONFIG_SOC_IRAM_SIZE /* It is actually mapped to flash. */ irom0_0_seg : org = 0x40200010 + CONFIG_PARTITION_TABLE_CUSTOM_APP_BIN_OFFSET, len = 0x100000 - 0x10 - CONFIG_PARTITION_TABLE_CUSTOM_APP_BIN_OFFSET diff --git a/components/freertos/Kconfig b/components/freertos/Kconfig index 6ff02827..751f7580 100644 --- a/components/freertos/Kconfig +++ b/components/freertos/Kconfig @@ -29,5 +29,13 @@ config FREERTOS_ISR_STACKSIZE default 512 help The interrupt handlers have their own stack. The size of the stack can be defined here. + +config FREERTOS_GLOBAL_DATA_LINK_IRAM + bool "Link FreeRTOS global data to IRAM" + default y + depends on !LWIP_HIGH_THROUGHPUT + depends on !SOC_FULL_ICACHE + help + Link FreeRTOS global data(.bss .data COMMON) from DRAM to IRAM. endmenu diff --git a/components/lwip/Kconfig b/components/lwip/Kconfig index 4f7606df..5eb0ad08 100644 --- a/components/lwip/Kconfig +++ b/components/lwip/Kconfig @@ -17,6 +17,14 @@ config LWIP_HIGH_THROUGHPUT chip should full 32 KB IRAM as icache. For these 2 reasons, the global heap user can used may reduce a lot. +config LWIP_GLOBAL_DATA_LINK_IRAM + bool "Link LWIP global data to IRAM" + default y + depends on !LWIP_HIGH_THROUGHPUT + depends on !SOC_FULL_ICACHE + help + Link LWIP global data(.bss .data COMMON) from DRAM to IRAM. + menu "ARP" config LWIP_ARP_TABLE_SIZE diff --git a/components/tcpip_adapter/Kconfig b/components/tcpip_adapter/Kconfig index eecf1205..1c803476 100644 --- a/components/tcpip_adapter/Kconfig +++ b/components/tcpip_adapter/Kconfig @@ -13,4 +13,12 @@ config IP_LOST_TIMER_INTERVAL the timer expires. The IP lost timer is stopped if the station get the IP again before the timer expires. +config TCPIP_ADAPTER_GLOBAL_DATA_LINK_IRAM + bool "Link TCPIP adapter global data to IRAM" + default y + depends on !LWIP_HIGH_THROUGHPUT + depends on !SOC_FULL_ICACHE + help + Link TCPIP adapter global data(.bss .data COMMON) from DRAM to IRAM. + endmenu