diff --git a/tools/cmake/UploadMethodManager.cmake b/tools/cmake/UploadMethodManager.cmake index 4e92db5d3b7..c113fa5733f 100644 --- a/tools/cmake/UploadMethodManager.cmake +++ b/tools/cmake/UploadMethodManager.cmake @@ -1,6 +1,44 @@ # Copyright (c) 2020 ARM Limited. All rights reserved. # SPDX-License-Identifier: Apache-2.0 +# Change GDB load command to flash post-build processed image in debug launch. +# With this adjustment, GDB load command changes to "load .hex" from +# just "load": +# 1. "Load" will load .elf and is inappropriate for targets like +# bootloader or TF-M enabled which need to post-build process images. +# 2. "load .bin" is not considered because GDB load command +# doesn't support binary format. +# +# NOTE: Place at the very start so that it can override by the below loaded +# upload method if need be. +function(mbed_adjust_upload_debug_commands target) + # MBED_UPLOAD_LAUNCH_COMMANDS defined? + if(NOT DEFINED MBED_UPLOAD_LAUNCH_COMMANDS) + return() + endif() + + # GDB load command in MBED_UPLOAD_LAUNCH_COMMANDS? + list(FIND MBED_UPLOAD_LAUNCH_COMMANDS "load" LOAD_INDEX) + if(${LOAD_INDEX} LESS "0") + return() + endif() + + # .hex for debug launch load + set(HEX_FILE ${CMAKE_CURRENT_BINARY_DIR}/$.hex) + + # "load" -> "load .hex" + # + # GDB load command doesn't support binary format. Ignore OUTPUT_EXT + # and fix to Intel Hex format. + # + # NOTE: The .hex file name needs to be quoted (\\\") to pass along + # to gdb correctly. + list(TRANSFORM MBED_UPLOAD_LAUNCH_COMMANDS APPEND " \\\"${HEX_FILE}\\\"" AT ${LOAD_INDEX}) + + # Update MBED_UPLOAD_LAUNCH_COMMANDS in cache + set(MBED_UPLOAD_LAUNCH_COMMANDS ${MBED_UPLOAD_LAUNCH_COMMANDS} CACHE INTERNAL "" FORCE) +endfunction() + # ---------------------------------------------- # Load the upload method that the user selects diff --git a/tools/cmake/mbed_ide_debug_cfg_generator.cmake b/tools/cmake/mbed_ide_debug_cfg_generator.cmake index eb75c28b526..884cd16dcec 100644 --- a/tools/cmake/mbed_ide_debug_cfg_generator.cmake +++ b/tools/cmake/mbed_ide_debug_cfg_generator.cmake @@ -241,20 +241,6 @@ elseif(MBED_UPLOAD_SUPPORTS_DEBUG) function(mbed_generate_ide_debug_configuration CMAKE_TARGET) - # add debug target - if(MBED_UPLOAD_SUPPORTS_DEBUG AND MBED_GDB_FOUND) - add_custom_target(debug-${target} - COMMENT "Starting GDB to debug ${target}..." - COMMAND ${MBED_GDB} - --command=${CMAKE_BINARY_DIR}/mbed-cmake.gdbinit - $ - USES_TERMINAL) - endif() - - endfunction(mbed_generate_ide_debug_configuration) - - function(mbed_finalize_ide_debug_configurations) - # create init file for GDB client if(MBED_UPLOAD_WANTS_EXTENDED_REMOTE) set(UPLOAD_GDB_REMOTE_KEYWORD "extended-remote") @@ -264,13 +250,27 @@ elseif(MBED_UPLOAD_SUPPORTS_DEBUG) list(JOIN MBED_UPLOAD_LAUNCH_COMMANDS "\n" MBED_UPLOAD_LAUNCH_COMMANDS_FOR_GDBINIT) - file(GENERATE OUTPUT ${CMAKE_BINARY_DIR}/mbed-cmake.gdbinit CONTENT + file(GENERATE OUTPUT ${CMAKE_BINARY_DIR}/$.gdbinit CONTENT "# connect to GDB server target ${UPLOAD_GDB_REMOTE_KEYWORD} 127.0.0.1:${GDB_PORT} ${MBED_UPLOAD_LAUNCH_COMMANDS_FOR_GDBINIT} c" ) + # add debug target + if(MBED_UPLOAD_SUPPORTS_DEBUG AND MBED_GDB_FOUND) + add_custom_target(debug-${target} + COMMENT "Starting GDB to debug ${target}..." + COMMAND ${MBED_GDB} + --command=${CMAKE_BINARY_DIR}/$.gdbinit + $ + USES_TERMINAL) + endif() + + endfunction(mbed_generate_ide_debug_configuration) + + function(mbed_finalize_ide_debug_configurations) + # Create target to start the GDB server add_custom_target(gdbserver COMMENT "Starting ${UPLOAD_METHOD} GDB server" diff --git a/tools/cmake/mbed_target_functions.cmake b/tools/cmake/mbed_target_functions.cmake index 6f6f1c8e9c5..799d2edafa6 100644 --- a/tools/cmake/mbed_target_functions.cmake +++ b/tools/cmake/mbed_target_functions.cmake @@ -13,6 +13,10 @@ function(mbed_generate_bin_hex target) set(artifact_name $) + # Convert to BIN format just on demand because the resultant output + # can have large holes in addresses which BIN format cannot handle and + # can generate very large file. + # # The first condition is quoted in case MBED_OUTPUT_EXT is unset if ("${MBED_OUTPUT_EXT}" STREQUAL "" OR MBED_OUTPUT_EXT STREQUAL "bin") list(APPEND CMAKE_POST_BUILD_COMMAND @@ -20,12 +24,13 @@ function(mbed_generate_bin_hex target) COMMAND ${CMAKE_COMMAND} -E echo "-- built: ${CMAKE_CURRENT_BINARY_DIR}/${artifact_name}.bin" ) endif() - if ("${MBED_OUTPUT_EXT}" STREQUAL "" OR MBED_OUTPUT_EXT STREQUAL "hex") - list(APPEND CMAKE_POST_BUILD_COMMAND - COMMAND ${elf_to_bin} -O ihex $ ${CMAKE_CURRENT_BINARY_DIR}/${artifact_name}.hex - COMMAND ${CMAKE_COMMAND} -E echo "-- built: ${CMAKE_CURRENT_BINARY_DIR}/${artifact_name}.hex" - ) - endif() + # Convert to Intel HEX format unconditionally which most flash programming + # tools can support. For example, GDB load command supports Intel HEX format + # but no BIN format. + list(APPEND CMAKE_POST_BUILD_COMMAND + COMMAND ${elf_to_bin} -O ihex $ ${CMAKE_CURRENT_BINARY_DIR}/${artifact_name}.hex + COMMAND ${CMAKE_COMMAND} -E echo "-- built: ${CMAKE_CURRENT_BINARY_DIR}/${artifact_name}.hex" + ) add_custom_command( TARGET @@ -169,6 +174,12 @@ function(mbed_set_post_build target) mbed_generate_map_file(${target}) endif() + # Give chance to adjust MBED_UPLOAD_LAUNCH_COMMANDS or MBED_UPLOAD_RESTART_COMMANDS + # for debug launch + if(COMMAND mbed_adjust_upload_debug_commands) + mbed_adjust_upload_debug_commands(${target}) + endif() + mbed_generate_upload_target(${target}) mbed_generate_ide_debug_configuration(${target}) endfunction() diff --git a/tools/cmake/upload_methods/UploadMethodPYOCD.cmake b/tools/cmake/upload_methods/UploadMethodPYOCD.cmake index cd9f29e0a50..1fdecf9fe87 100644 --- a/tools/cmake/upload_methods/UploadMethodPYOCD.cmake +++ b/tools/cmake/upload_methods/UploadMethodPYOCD.cmake @@ -57,6 +57,10 @@ set(UPLOAD_LAUNCH_COMMANDS "monitor reset halt" "load" "tbreak main" + +# It appears the device under debug must be halted after UPLOAD_LAUNCH_COMMANDS, +# or debugger will become abnormal. +"monitor reset halt" ) set(UPLOAD_RESTART_COMMANDS "monitor reset halt"