if(TARGET zephyr_final)
# Определяем величину сдвига LMA (3758096384 = 0xE0000000)
set(LMA_OFFSET "3758096384")
# Перечисляем только те секции, которые должны лежать во FLASH, но выполняться из RAM
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()
# Добавляем кастомную сборку правильного HEX и BIN напрямую из оригинального ELF
add_custom_command(
TARGET zephyr_final
POST_BUILD
# Генерация HEX
COMMAND ${CMAKE_OBJCOPY} ${OBJCOPY_ARGS} --output-target=ihex --remove-section=.comment --remove-section=COMMON $<TARGET_FILE:zephyr_final> ${CMAKE_BINARY_DIR}/zephyr.hex
# Генерация BIN
COMMAND ${CMAKE_OBJCOPY} ${OBJCOPY_ARGS} --gap-fill 0xFF --output-target=binary --remove-section=.comment --remove-section=COMMON $<TARGET_FILE:zephyr_final> ${CMAKE_BINARY_DIR}/zephyr.bin
COMMENT "Формирование образов HEX и BIN со сдвигом LMA для RAMLOADER (Debug сохранен в ELF)..."
)
endif()