mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
Merge branch 'add_openocd_stub_bins' into 'master'
Preload openocd stub binaries and reserve memory for debugging See merge request espressif/esp-idf!31504
This commit is contained in:
commit
6c0b4c90b4
@ -147,3 +147,7 @@ endif()
|
||||
if(CONFIG_SOC_MEM_NON_CONTIGUOUS_SRAM)
|
||||
target_link_options(${COMPONENT_LIB} INTERFACE "-Wl,--enable-non-contiguous-regions")
|
||||
endif()
|
||||
|
||||
if(CONFIG_ESP_DEBUG_INCLUDE_OCD_STUB_BINS)
|
||||
add_subdirectory(openocd_stub_bins)
|
||||
endif()
|
||||
|
@ -530,6 +530,19 @@ menu "ESP System Settings"
|
||||
Debug stubs are used by OpenOCD to execute pre-compiled onboard code
|
||||
which does some useful debugging stuff, e.g. GCOV data dump.
|
||||
|
||||
config ESP_DEBUG_INCLUDE_OCD_STUB_BINS
|
||||
bool "Preload OpenOCD stub binaries to speed up debugging. 8K memory will be reserved"
|
||||
default y
|
||||
depends on SOC_DEBUG_HAVE_OCD_STUB_BINS
|
||||
help
|
||||
OpenOCD uses stub code to access flash during programming or when inserting and removing
|
||||
flash SW breakpoints.
|
||||
To execute stub code, OpenOCD allocates memory on the target device, backs up the existing memory,
|
||||
loads the stub binary, runs the binary, and then restores the original memory.
|
||||
This process can be time-consuming, especially when using USB serial JTAG.
|
||||
By enabling this option, 8K of memory in RAM will be preallocated with the stub code,
|
||||
eliminating the need to back up and restore the memory region.
|
||||
|
||||
config ESP_DEBUG_OCDAWARE
|
||||
bool "Make exception and panic handlers JTAG/OCD aware"
|
||||
default y
|
||||
|
@ -156,6 +156,21 @@ SECTIONS
|
||||
.iram0.text :
|
||||
{
|
||||
_iram_start = ABSOLUTE(.);
|
||||
|
||||
#if CONFIG_ESP_DEBUG_INCLUDE_OCD_STUB_BINS
|
||||
/* Do not move this block! OpenOCD expects this to be at the beginning of IRAM. */
|
||||
KEEP(*(.ocd_stub.code));
|
||||
KEEP(*(.ocd_stub.tramp));
|
||||
. = ALIGN(0x800);
|
||||
KEEP(*(.ocd_stub.data));
|
||||
KEEP(*(.ocd_stub.bss));
|
||||
KEEP(*(.ocd_stub.stack));
|
||||
KEEP(*(.ocd_stub.params));
|
||||
. = ALIGN(0x1000);
|
||||
KEEP(*(.ocd_stub.scratchmem));
|
||||
ASSERT(ABSOLUTE(.) == _iram_start + 0x2000, "openocd stub memory must be ended at _iram_start + 0x2000");
|
||||
#endif
|
||||
|
||||
/* Vectors go to start of IRAM */
|
||||
ASSERT(ABSOLUTE(.) % 0x100 == 0, "vector address must be 256 byte aligned");
|
||||
KEEP(*(.exception_vectors_table.text));
|
||||
|
@ -156,6 +156,21 @@ SECTIONS
|
||||
.iram0.text :
|
||||
{
|
||||
_iram_start = ABSOLUTE(.);
|
||||
|
||||
#if CONFIG_ESP_DEBUG_INCLUDE_OCD_STUB_BINS
|
||||
/* Do not move this block! OpenOCD expects this to be at the beginning of IRAM. */
|
||||
KEEP(*(.ocd_stub.code));
|
||||
KEEP(*(.ocd_stub.tramp));
|
||||
. = ALIGN(0x800);
|
||||
KEEP(*(.ocd_stub.data));
|
||||
KEEP(*(.ocd_stub.bss));
|
||||
KEEP(*(.ocd_stub.stack));
|
||||
KEEP(*(.ocd_stub.params));
|
||||
. = ALIGN(0x1000);
|
||||
KEEP(*(.ocd_stub.scratchmem));
|
||||
ASSERT(ABSOLUTE(.) == _iram_start + 0x2000, "openocd stub memory must be ended at _iram_start + 0x2000");
|
||||
#endif
|
||||
|
||||
/* Vectors go to start of IRAM */
|
||||
ASSERT(ABSOLUTE(.) % 0x100 == 0, "vector address must be 256 byte aligned");
|
||||
KEEP(*(.exception_vectors_table.text));
|
||||
|
45
components/esp_system/openocd_stub_bins/CMakeLists.txt
Normal file
45
components/esp_system/openocd_stub_bins/CMakeLists.txt
Normal file
@ -0,0 +1,45 @@
|
||||
idf_build_get_property(target IDF_TARGET)
|
||||
|
||||
# Function to add custom commands for copying files
|
||||
function(add_copy_command src dest)
|
||||
add_custom_command(
|
||||
OUTPUT ${dest}
|
||||
COMMAND ${CMAKE_COMMAND} -E copy ${src} ${dest}
|
||||
DEPENDS ${src}
|
||||
COMMENT "Copying ${src} to ${dest}"
|
||||
VERBATIM
|
||||
)
|
||||
endfunction()
|
||||
|
||||
set(openocd_path $ENV{OPENOCD_SCRIPTS})
|
||||
|
||||
if(openocd_path)
|
||||
set(stub_bin_path ${openocd_path}/../esp_stub_bins)
|
||||
if(IS_DIRECTORY ${stub_bin_path} AND IS_DIRECTORY ${stub_bin_path}/${target})
|
||||
set(code_bin "${stub_bin_path}/${target}/stub_flash_idf_binary_code.inc")
|
||||
set(data_bin "${stub_bin_path}/${target}/stub_flash_idf_binary_data.inc")
|
||||
set(img_header "${stub_bin_path}/${target}/stub_flash_idf_image.h")
|
||||
if(EXISTS ${code_bin} AND EXISTS ${data_bin} AND EXISTS ${img_header})
|
||||
set(dest_dir "${IDF_PATH}/components/esp_system/openocd_stub_bins/${target}")
|
||||
set(output_code_bin "${dest_dir}/stub_flash_idf_binary_code.inc")
|
||||
set(output_data_bin "${dest_dir}/stub_flash_idf_binary_data.inc")
|
||||
set(output_img_header "${dest_dir}/stub_flash_idf_image.h")
|
||||
add_copy_command(${code_bin} ${output_code_bin})
|
||||
add_copy_command(${data_bin} ${output_data_bin})
|
||||
add_copy_command(${img_header} ${output_img_header})
|
||||
add_custom_target(copy_stub_bins ALL
|
||||
DEPENDS ${output_code_bin} ${output_data_bin} ${output_img_header}
|
||||
COMMENT "Copying OpenOCD stub binaries and image header"
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set(srcs)
|
||||
|
||||
list(APPEND srcs "${target}/openocd_stub_flasher.c")
|
||||
|
||||
target_sources(${COMPONENT_LIB} PRIVATE ${srcs})
|
||||
target_include_directories(${COMPONENT_LIB} PRIVATE ${target})
|
||||
|
||||
target_link_libraries(${COMPONENT_LIB} INTERFACE "-u esp_system_include_openocd_stub_binaries")
|
@ -0,0 +1,33 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
#include <stdint.h>
|
||||
|
||||
#include "stub_flash_idf_image.h"
|
||||
|
||||
/* Copied from openocd-esp32/contrib/loaders/flash/espressif/esp32c6/inc/stub_flash_idf_binary_code.inc */
|
||||
static const uint8_t s_flasher_stub_code[] __attribute__((used, section(".ocd_stub.code"))) = {
|
||||
#include "stub_flash_idf_binary_code.inc"
|
||||
};
|
||||
|
||||
/* Copied from openocd-esp32/src/target/espressif/esp_riscv_stub_tramp.inc */
|
||||
static const uint8_t s_flasher_stub_tramp[] __attribute__((used, section(".ocd_stub.tramp"))) = {
|
||||
#include "../esp_riscv_stub_tramp.inc"
|
||||
};
|
||||
|
||||
/* Copied from openocd-esp32/contrib/loaders/flash/espressif/esp32c6/inc/stub_flash_idf_binary_data.inc */
|
||||
static const uint8_t s_flasher_stub_data[] __attribute__((used, section(".ocd_stub.data"))) = {
|
||||
#include "stub_flash_idf_binary_data.inc"
|
||||
};
|
||||
|
||||
static uint8_t s_flasher_stub_bss[OPENOCD_STUB_BSS_SIZE] __attribute__((used, section(".ocd_stub.bss")));
|
||||
static uint8_t s_flasher_stub_stack[OPENOCD_STUB_STACK_SIZE] __attribute__((used, section(".ocd_stub.stack")));
|
||||
static uint8_t s_flasher_stub_params[OPENOCD_STUB_PARAM_SIZE] __attribute__((used, section(".ocd_stub.params")));
|
||||
static uint8_t s_flasher_stub_bp_sectors[OPENOCD_STUB_BP_SECTOR_SIZE] __attribute__((used, section(".ocd_stub.scratchmem")));
|
||||
|
||||
// Hook to force the linker to include this file
|
||||
void esp_system_include_openocd_stub_binaries(void)
|
||||
{
|
||||
}
|
@ -0,0 +1,33 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
#include <stdint.h>
|
||||
|
||||
#include "stub_flash_idf_image.h"
|
||||
|
||||
/* Copied from openocd-esp32/contrib/loaders/flash/espressif/esp32h2/inc/stub_flash_idf_binary_code.inc */
|
||||
static const uint8_t s_flasher_stub_code[] __attribute__((used, section(".ocd_stub.code"))) = {
|
||||
#include "stub_flash_idf_binary_code.inc"
|
||||
};
|
||||
|
||||
/* Copied from openocd-esp32/src/target/espressif/esp_riscv_stub_tramp.inc */
|
||||
static const uint8_t s_flasher_stub_tramp[] __attribute__((used, section(".ocd_stub.tramp"))) = {
|
||||
#include "../esp_riscv_stub_tramp.inc"
|
||||
};
|
||||
|
||||
/* Copied from openocd-esp32/contrib/loaders/flash/espressif/esp32h2/inc/stub_flash_idf_binary_data.inc */
|
||||
static const uint8_t s_flasher_stub_data[] __attribute__((used, section(".ocd_stub.data"))) = {
|
||||
#include "stub_flash_idf_binary_data.inc"
|
||||
};
|
||||
|
||||
static uint8_t s_flasher_stub_bss[OPENOCD_STUB_BSS_SIZE] __attribute__((used, section(".ocd_stub.bss")));
|
||||
static uint8_t s_flasher_stub_stack[OPENOCD_STUB_STACK_SIZE] __attribute__((used, section(".ocd_stub.stack")));
|
||||
static uint8_t s_flasher_stub_params[OPENOCD_STUB_PARAM_SIZE] __attribute__((used, section(".ocd_stub.params")));
|
||||
static uint8_t s_flasher_stub_bp_sectors[OPENOCD_STUB_BP_SECTOR_SIZE] __attribute__((used, section(".ocd_stub.scratchmem")));
|
||||
|
||||
// Hook to force the linker to include this file
|
||||
void esp_system_include_openocd_stub_binaries(void)
|
||||
{
|
||||
}
|
@ -0,0 +1 @@
|
||||
0x82, 0x98, 0x02, 0x90
|
@ -1522,3 +1522,7 @@ config SOC_LP_CORE_SINGLE_INTERRUPT_VECTOR
|
||||
config SOC_LP_CORE_SUPPORT_ETM
|
||||
bool
|
||||
default y
|
||||
|
||||
config SOC_DEBUG_HAVE_OCD_STUB_BINS
|
||||
bool
|
||||
default y
|
||||
|
@ -602,3 +602,6 @@
|
||||
/*------------------------------------- ULP CAPS -------------------------------------*/
|
||||
#define SOC_LP_CORE_SINGLE_INTERRUPT_VECTOR (1) /*!< LP Core interrupts all map to a single entry in vector table */
|
||||
#define SOC_LP_CORE_SUPPORT_ETM (1) /*!< LP Core supports ETM */
|
||||
|
||||
/*------------------------------------- DEBUG CAPS -------------------------------------*/
|
||||
#define SOC_DEBUG_HAVE_OCD_STUB_BINS (1)
|
||||
|
@ -1434,3 +1434,7 @@ config SOC_BLE_MULTI_CONN_OPTIMIZATION
|
||||
config SOC_BLE_PERIODIC_ADV_ENH_SUPPORTED
|
||||
bool
|
||||
default y
|
||||
|
||||
config SOC_DEBUG_HAVE_OCD_STUB_BINS
|
||||
bool
|
||||
default y
|
||||
|
@ -562,3 +562,6 @@
|
||||
#define SOC_BLE_POWER_CONTROL_SUPPORTED (1) /*!< Support Bluetooth Power Control */
|
||||
#define SOC_BLE_MULTI_CONN_OPTIMIZATION (1) /*!< Support multiple connections optimization */
|
||||
#define SOC_BLE_PERIODIC_ADV_ENH_SUPPORTED (1) /*!< Support For BLE Periodic Adv Enhancements */
|
||||
|
||||
/*------------------------------------- DEBUG CAPS -------------------------------------*/
|
||||
#define SOC_DEBUG_HAVE_OCD_STUB_BINS (1)
|
||||
|
@ -192,6 +192,7 @@ The following options will reduce IRAM usage of some ESP-IDF features:
|
||||
- Refer to the sdkconfig menu ``Auto-detect Flash chips``, and you can disable flash drivers which you do not need to save some IRAM.
|
||||
:SOC_GPSPI_SUPPORTED: - Enable :ref:`CONFIG_HEAP_PLACE_FUNCTION_INTO_FLASH`. Provided that :ref:`CONFIG_SPI_MASTER_ISR_IN_IRAM` is not enabled and the heap functions are not incorrectly used from ISRs, this option is safe to enable in all configurations.
|
||||
:esp32c2: - Enable :ref:`CONFIG_BT_RELEASE_IRAM`. Release BT text section and merge BT data, bss & text into a large free heap region when ``esp_bt_mem_release`` is called. This makes Bluetooth unavailable until the next restart, but saving ~22 KB or more of IRAM.
|
||||
:SOC_DEBUG_HAVE_OCD_STUB_BINS: - Disabling :ref:`CONFIG_ESP_DEBUG_INCLUDE_OCD_STUB_BINS` frees 8 KB IRAM but overall speed of debugging might be impacted due to the added overhead of runtime stub loading especially when using flash breakpoints.
|
||||
|
||||
.. only:: esp32
|
||||
|
||||
@ -202,7 +203,7 @@ The following options will reduce IRAM usage of some ESP-IDF features:
|
||||
|
||||
To use this option, ESP-IDF should be able to recognize that the new SRAM1 area is also a valid load address for an image segment. If the software bootloader was compiled before this option existed, then the bootloader will not be able to load the app that has code placed in this new extended IRAM area. This would typically happen if you are doing an OTA update, where only the app would be updated.
|
||||
|
||||
If the IRAM section were to be placed in an invalid area, then this would be detected during the bootup process, and result in a failed boot:
|
||||
If the IRAM section were to be placed in an invalid area, then this would be detected during the boot up process, and result in a failed boot:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
|
@ -192,6 +192,7 @@ IRAM 优化
|
||||
- 要禁用不需要的 flash 驱动程序,节省 IRAM 空间,请参阅 sdkconfig 菜单中的 ``Auto-detect Flash chips`` 选项。
|
||||
:SOC_GPSPI_SUPPORTED: - 启用 :ref:`CONFIG_HEAP_PLACE_FUNCTION_INTO_FLASH`。只要未启用 :ref:`CONFIG_SPI_MASTER_ISR_IN_IRAM` 选项,且没有从 ISR 中错误地调用堆函数,就可以在所有配置中安全启用此选项。
|
||||
:esp32c2: - 启用 :ref:`CONFIG_BT_RELEASE_IRAM`。 蓝牙所使用的 data,bss 和 text 段已经被分配在连续的RAM区间。当调用 ``esp_bt_mem_release`` 时,这些段都会被添加到 Heap 中。 这将节省约 22 KB 的 RAM。但要再次使用蓝牙功能,需要重启程序。
|
||||
:SOC_DEBUG_HAVE_OCD_STUB_BINS: - 禁用 :ref:`CONFIG_ESP_DEBUG_INCLUDE_OCD_STUB_BINS`。 选项可以释放 8 KB 的 IRAM, 但由于运行时加载存根的额外开销,特别是在使用 flash 断点时,可能会影响调试的整体速度。
|
||||
|
||||
.. only:: esp32
|
||||
|
||||
|
@ -161,6 +161,10 @@ components_not_formatted_permanent:
|
||||
- "/examples/peripherals/dac/dac_continuous/dac_audio/main/audio_example_file.h"
|
||||
# Coredump (generated)
|
||||
- /components/espcoredump/include_core_dump/elf.h
|
||||
# OpenOCD stub binaries (generated)
|
||||
- /components/esp_system/openocd_stub_bins/*.inc
|
||||
- /components/esp_system/openocd_stub_bins/esp32c6/*.inc
|
||||
- /components/esp_system/openocd_stub_bins/esp32h2/*.inc
|
||||
|
||||
docs:
|
||||
# Docs directory contains some .inc files, which are not C include files
|
||||
|
Loading…
Reference in New Issue
Block a user