# Проверяем, что сборка идет в контексте Zephyr
if(TARGET zephyr_property_target)
# Величина сдвига LMA (3758096384 = 0xE0000000)
set(LMA_OFFSET "3758096384")
# Список секций кода и данных для переноса во FLASH
set(SECTIONS_TO_ADJUST
rom_start text .ARM.exidx initlevel device_area sw_isr_table
_static_thread_area dma_driver_area entropy_driver_area flash_driver_area
gpio_driver_area i2c_driver_area i2s_driver_area clock_control_driver_area
mdio_driver_area uart_driver_area ethphy_driver_area net_l3_regions
net_socket_register_area log_const_area log_backend_area input_callback_area
shell_area shell_root_cmds_sections shell_subcmds_sections shell_dynamic_subcmds_sections
tdata rodata nocache .ramfunc datas device_states log_mpsc_pbuf_area
log_msg_ptr_area log_dynamic_area k_mem_slab_area k_heap_area k_mutex_area
k_msgq_area k_sem_area net_buf_pool_area net_if_area net_if_dev_area
net_l2_area usbd_context_area usbd_class_fs_area usbd_class_hs_area usbd_msc_lun_area
)
# Формируем аргументы для objcopy
set(OBJCOPY_ARGS "")
foreach(section ${SECTIONS_TO_ADJUST})
list(APPEND OBJCOPY_ARGS --change-section-lma ${section}+${LMA_OFFSET})
endforeach()
# 1. Создаем собственную цель, которая будет форсированно вызываться при сборке
add_custom_target(adjust_lma_images ALL
COMMENT "Формирование образов HEX и BIN со сдвигом LMA для RAMLOADER..."
)
# 2. Указываем CMake, что наш шаг должен выполняться строго ПОСЛЕ полной линковки zephyr.elf
add_dependencies(adjust_lma_images zephyr_final)
# 3. Сама команда генерации файлов, которая берет готовый zephyr.elf
add_custom_command(
TARGET adjust_lma_images
POST_BUILD
# Генерация правильного HEX напрямую из исходного ELF
COMMAND ${CMAKE_OBJCOPY} ${OBJCOPY_ARGS} --output-target=ihex --remove-section=.comment --remove-section=COMMON ${CMAKE_BINARY_DIR}/zephyr/zephyr.elf ${CMAKE_BINARY_DIR}/zephyr/zephyr.hex
# Генерация правильного BIN напрямую из исходного ELF
COMMAND ${CMAKE_OBJCOPY} ${OBJCOPY_ARGS} --gap-fill 0xFF --output-target=binary --remove-section=.comment --remove-section=COMMON ${CMAKE_BINARY_DIR}/zephyr/zephyr.elf ${CMAKE_BINARY_DIR}/zephyr/zephyr.bin
)
endif()