PolarFire® SoC softconsole mpfs-uart-mac-freertos_lwip 链接文件分析
链接文件来自:mpfs-uart-mac-freertos_lwip
1、硬件环境: PolarFire SoC Icicle Kit | Microchip Technology 开发板
- 5-core RISC-V CPU (1× E51, 4× U54)
- Low-power PolarFire FPGA fabric
- 4× 12.7 Gbps SERDES, PCIe Gen2, 2× GbE
- 2 GB LPDDR4, 8 GB eMMC, SD, SPI flash
- RPi header, mikroBUS™, UART/SPI/I²C/CAN
- 2 MB L2 cache or 1.875 MB LIM with ECC
- 128 KB eNVM
- RV64IMAC, 625 MHz, 16 KB L1 iCache or 8 KB ITIM, and 8 KB DTIM
- RV64GC, 625 MHz, 32 KB L1 iCache or 28 KB ITIM. 32 KB dCache
- PolarFire SoC MSS Technical Reference Manual 可以看 第十章节 “MSS Memory Map”
2、软件环境: Libero 2025.1 和 SoftConsole v2021.1
1、mpfs-ddr-loaded-by-boot-loader.ld
SECTIONS 存放地址:ddr_cached_32bit→0x80000000;
该链接脚本生成的固件,需要一个bootloader 加载此文件到 DDR 中运行;
MEMORY { envm (rx) : ORIGIN = 0x20220100, LENGTH = 128k - 0x100 dtim (rwx) : ORIGIN = 0x01000000, LENGTH = 7k /* This 1K of DTIM is used to run code when switching the envm clock */ switch_code_dtim (rx) : ORIGIN = 0x01001c00, LENGTH = 1k e51_itim (rwx) : ORIGIN = 0x01800000, LENGTH = 28k u54_1_itim (rwx) : ORIGIN = 0x01808000, LENGTH = 28k u54_2_itim (rwx) : ORIGIN = 0x01810000, LENGTH = 28k u54_3_itim (rwx) : ORIGIN = 0x01818000, LENGTH = 28k u54_4_itim (rwx) : ORIGIN = 0x01820000, LENGTH = 28k l2lim (rwx) : ORIGIN = 0x08000000, LENGTH = 256k scratchpad(rwx) : ORIGIN = 0x0A000000, LENGTH = 256k /* DDR sections example */ ddr_cached_32bit (rwx) : ORIGIN = 0x80000000, LENGTH = 768M ddr_non_cached_32bit (rwx) : ORIGIN = 0xC0000000, LENGTH = 256M ddr_wcb_32bit (rwx) : ORIGIN = 0xD0000000, LENGTH = 256M ddr_cached_38bit (rwx) : ORIGIN = 0x1000000000, LENGTH = 1024M ddr_non_cached_38bit (rwx) : ORIGIN = 0x1400000000, LENGTH = 0k ddr_wcb_38bit (rwx) : ORIGIN = 0x1800000000, LENGTH = 0k }
2、mpfs-envm.ld
SECTIONS 存放地址:__envm_start → 0x20220100;
该链接脚本生成的固件,存放在 eNVM 中;
MEMORY { /* In this example, our reset vector is set to point to the */ /* start at page 1 of the envm */ envm (rx) : ORIGIN = 0x20220100, LENGTH = 128k - 0x100 dtim (rwx) : ORIGIN = 0x01000000, LENGTH = 7k /* This 1K of DTIM is used to run code when switching the envm clock */ switch_code_dtim (rx) : ORIGIN = 0x01001c00, LENGTH = 1k e51_itim (rwx) : ORIGIN = 0x01800000, LENGTH = 28k u54_1_itim (rwx) : ORIGIN = 0x01808000, LENGTH = 28k u54_2_itim (rwx) : ORIGIN = 0x01810000, LENGTH = 28k u54_3_itim (rwx) : ORIGIN = 0x01818000, LENGTH = 28k u54_4_itim (rwx) : ORIGIN = 0x01820000, LENGTH = 28k l2lim (rwx) : ORIGIN = 0x08000000, LENGTH = 256k scratchpad(rwx) : ORIGIN = 0x0A000000, LENGTH = 256k /* DDR sections example */ ddr_cached_32bit (rwx) : ORIGIN = 0x80000000, LENGTH = 768M ddr_non_cached_32bit (rwx) : ORIGIN = 0xC0000000, LENGTH = 256M ddr_wcb_32bit (rwx) : ORIGIN = 0xD0000000, LENGTH = 256M ddr_cached_38bit (rwx) : ORIGIN = 0x1000000000, LENGTH = 1024M ddr_non_cached_38bit (rwx) : ORIGIN = 0x1400000000, LENGTH = 0k ddr_wcb_38bit (rwx) : ORIGIN = 0x1800000000, LENGTH = 0k }
3、mpfs-envm-lma-scratchpad-vma.ld
从 eNVM 加载,但拷贝到最快的内存(Scratchpad)中执行;

MEMORY { envm (rx) : ORIGIN = 0x20220100, LENGTH = 128k - 0x100 dtim (rwx) : ORIGIN = 0x01000000, LENGTH = 7k /* This 1K of DTIM is used to run code when switching the envm clock */ switch_code_dtim (rx) : ORIGIN = 0x01001c00, LENGTH = 1k e51_itim (rwx) : ORIGIN = 0x01800000, LENGTH = 28k u54_1_itim (rwx) : ORIGIN = 0x01808000, LENGTH = 28k u54_2_itim (rwx) : ORIGIN = 0x01810000, LENGTH = 28k u54_3_itim (rwx) : ORIGIN = 0x01818000, LENGTH = 28k u54_4_itim (rwx) : ORIGIN = 0x01820000, LENGTH = 28k l2lim (rwx) : ORIGIN = 0x08000000, LENGTH = 256k scratchpad(rwx) : ORIGIN = 0x0A000000, LENGTH = 256k /* DDR sections example */ ddr_cached_32bit (rwx) : ORIGIN = 0x80000000, LENGTH = 768M ddr_non_cached_32bit (rwx) : ORIGIN = 0xC0000000, LENGTH = 256M ddr_wcb_32bit (rwx) : ORIGIN = 0xD0000000, LENGTH = 256M ddr_cached_38bit (rwx) : ORIGIN = 0x1000000000, LENGTH = 1024M ddr_non_cached_38bit (rwx) : ORIGIN = 0x1400000000, LENGTH = 0k ddr_wcb_38bit (rwx) : ORIGIN = 0x1800000000, LENGTH = 0k }
4、mpfs-lim.ld
代码存放在 lim 中运行, 大小为 256KB;
MEMORY { envm (rx) : ORIGIN = 0x20220100, LENGTH = 128k - 0x100 dtim (rwx) : ORIGIN = 0x01000000, LENGTH = 7k /* This 1K of DTIM is used to run code when switching the envm clock */ switch_code_dtim (rx) : ORIGIN = 0x01001c00, LENGTH = 1k e51_itim (rwx) : ORIGIN = 0x01800000, LENGTH = 28k u54_1_itim (rwx) : ORIGIN = 0x01808000, LENGTH = 28k u54_2_itim (rwx) : ORIGIN = 0x01810000, LENGTH = 28k u54_3_itim (rwx) : ORIGIN = 0x01818000, LENGTH = 28k u54_4_itim (rwx) : ORIGIN = 0x01820000, LENGTH = 28k l2lim (rwx) : ORIGIN = 0x08000000, LENGTH = 256k scratchpad(rwx) : ORIGIN = 0x0A000000, LENGTH = 256k /* DDR sections example */ ddr_cached_32bit (rwx) : ORIGIN = 0x80000000, LENGTH = 768M ddr_non_cached_32bit (rwx) : ORIGIN = 0xC0000000, LENGTH = 256M ddr_wcb_32bit (rwx) : ORIGIN = 0xD0000000, LENGTH = 256M ddr_cached_38bit (rwx) : ORIGIN = 0x1000000000, LENGTH = 1024M ddr_non_cached_38bit (rwx) : ORIGIN = 0x1400000000, LENGTH = 0k ddr_wcb_38bit (rwx) : ORIGIN = 0x1800000000, LENGTH = 0k }
5、mpfs-lim-lma-scratchpad-vma.ld
存放在 lim 中, 复制到 scratchpad 运行;
MEMORY { envm (rx) : ORIGIN = 0x20220100, LENGTH = 128k - 0x100 dtim (rwx) : ORIGIN = 0x01000000, LENGTH = 7k /* This 1K of DTIM is used to run code when switching the envm clock */ switch_code_dtim (rx) : ORIGIN = 0x01001c00, LENGTH = 1k e51_itim (rwx) : ORIGIN = 0x01800000, LENGTH = 28k u54_1_itim (rwx) : ORIGIN = 0x01808000, LENGTH = 28k u54_2_itim (rwx) : ORIGIN = 0x01810000, LENGTH = 28k u54_3_itim (rwx) : ORIGIN = 0x01818000, LENGTH = 28k u54_4_itim (rwx) : ORIGIN = 0x01820000, LENGTH = 28k l2lim (rwx) : ORIGIN = 0x08000000, LENGTH = 256k scratchpad(rwx) : ORIGIN = 0x0A000000, LENGTH = 256k /* DDR sections example */ ddr_cached_32bit (rwx) : ORIGIN = 0x80000000, LENGTH = 768M ddr_non_cached_32bit (rwx) : ORIGIN = 0xC0000000, LENGTH = 256M ddr_wcb_32bit (rwx) : ORIGIN = 0xD0000000, LENGTH = 256M ddr_cached_38bit (rwx) : ORIGIN = 0x1000000000, LENGTH = 1024M ddr_non_cached_38bit (rwx) : ORIGIN = 0x1400000000, LENGTH = 0k ddr_wcb_38bit (rwx) : ORIGIN = 0x1800000000, LENGTH = 0k }
浙公网安备 33010602011771号