Загрузка данных


/* ====================================================================
 * CUSTOM ARCHITECTURAL LINKER WRAPPER FOR MONOLITHIC SDRAM EXECUTION
 * ====================================================================
 * Скрипт полностью повторяет идеологию NXP: код и данные работают 
 * в раздельных регионах SDRAM (0x80... и 0x8040...), но их LMA
 * принудительно подменяется в непрерывный Flash-образ.
 *
 * Мы не трогаем капризные макросы GROUP_LINK_IN, чтобы избежать syntax error.
 * Мы подменяем физический смысл регионов памяти для GNU LD.
 */

/* 1. Подключаем базовые заголовочные макросы архитектуры Zephyr */
#include <zephyr/linker/sections.h>
#include <zephyr/devicetree.h>
#include <zephyr/linker/devicetree_regions.h>
#include <zephyr/linker/linker-defs.h>
#include <zephyr/linker/linker-tool.h>

/* 2. ОБЪЯВЛЯЕМ РЕАЛЬНЫЕ ФИЗИЧЕСКИЕ РЕГИОНЫ ПАМЯТИ
      Вместо абстрактных имен, даем линкеру четкие физические координаты. */
MEMORY
{
    /* Куда программатор физически запишет прошивку (LMA) */
    PHYS_FLASH (rx) : ORIGIN = 0x60000000, LENGTH = 0x400000 /* 4MB */

    /* Где код PJSIP и ОС будет физически выполняться (VMA) */
    VMA_CODE   (rx) : ORIGIN = 0x80000000, LENGTH = 0x400000 /* 4MB */

    /* Где данные PJSIP будут физически выполняться (VMA) */
    VMA_DATA   (wx) : ORIGIN = 0x80400000, LENGTH = 0x1C00000 /* 28MB */
}

/* 3. МАГИЯ АЛИАСОВ: ПОДМЕНА СУТИ ДЛЯ СИСТЕМЫ СБОРКИ ZEPHYR
      В вашем DTS указано zephyr,flash = &sdram_code и zephyr,sram = &sdram_data.
      Линкер Zephyr автоматически создаст регионы памяти с именами "sdram_code" и "sdram_data".
      
      Мы принудительно перехватываем эти имена на уровне GNU LD и говорим:
      - Если Zephyr шлет код выполнения в "sdram_code" -> выполнять в VMA_CODE, но загружать (LMA) из PHYS_FLASH!
      - Если Zephyr шлет данные в "sdram_data" -> выполнять в VMA_DATA, но загружать (LMA) из PHYS_FLASH!
      
      Синтаксис команды: REGION_ALIAS(alias_name, vma_region, lma_region)
      Это базовая фича GNU LD, которая жестко раздваивает VMA и LMA без изменения макросов! */
REGION_ALIAS("sdram_code", VMA_CODE, PHYS_FLASH);
REGION_ALIAS("sdram_data", VMA_DATA, PHYS_FLASH);

/* 4. Настраиваем базовые макросы Zephyr, чтобы они не конфликтовали с алиасами */
#undef ROMABLE_REGION
#define ROMABLE_REGION PHYS_FLASH

#undef RAMABLE_REGION
#define RAMABLE_REGION VMA_DATA

/* 5. Включаем оригинальный мастер-скрипт Zephyr для архитектуры ARM Cortex-M.
      Он отработает штатно, без синтаксических ошибок, но линкер автоматически 
      подменит LMA всех секций на 0x60000000. */
#include <zephyr/arch/arm/cortex_m/scripts/linker.ld>

/* Финальная страховка */
#undef ROMABLE_REGION
#define ROMABLE_REGION PHYS_FLASH