我是靠谱客的博主 舒服奇迹,最近开发中收集的这篇文章主要介绍bl602链接文件分析,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文件路径:bl_iot_sdkcomponentsplatformsocbl602bl602evbldflash.ld

这个描述文件叫链接文件,比如 KEIL 中的 *.sct文件,IAR中的*.icf文件 都是此类文件,linux中一般是*.ld文件。

下面是文件内容

OUTPUT_ARCH( "riscv" ) /*设置输出文件的体系结构为 riscv 架构 */
ENTRY( bl602_start ) /* 将 bl602_start 函数设置为 入口函数 */
__EM_SIZE = DEFINED(ble_controller_init) ? 8K : 0K; /* 如果定义了 ble_controller_init 函数,
那么分配一个 __EM_SIZE  大小是 8K */

/* MEMORY 描述的是存储区域 代码空间 */
/* tcm 是紧耦合内存,速度比一般ram 快,分为:itcm和dtcm */
/* r:只读  x:可执行  a:可分配  w:可读写  i:可初始化  !后面属性是没有后面/否定后面属性 */
MEMORY
{
  rom       (rxai!w) : ORIGIN = 0x21015000, LENGTH = 44K
  flash     (rxai!w) : ORIGIN = 0x23000000, LENGTH = 4M
  ram_tcm   (wxa)    : ORIGIN = 0x4200C000, LENGTH = (16K + 16K + 48K + 64K) /*put itcm with dtcm and also OCRAM*/
  ram_wifi  (wxa)    : ORIGIN = 0x42030000, LENGTH = (104K) /*leave 8K left for BLE*/
}
/* 描述 各个section 如何放入MEMORY空间 */
SECTIONS
{
/* 定义栈的大小,如果用户自定义 __stack_size 则使用此值 */
  __stack_size = DEFINED(__stack_size) ? __stack_size : 2K;

/* 设置 boot2 的分区表地址 */
  BOOT2_PT_ADDR = 0x42049C00;

/* 设置 boot2 中 flashCfg地址 */
  BOOT2_FLASHCFG_ADDR = 0x42049c18;

/* 初始化段存储到 flash区域 输入是所有的不排序的初始化段 */
  .init           :
  {
    KEEP (*(SORT_NONE(.init)))
  } > flash

/* 生成 text段 到flash 输入是所有text 段 */
  .text           :
  {
    *(.text.unlikely .text.unlikely.*)
    *(.text.startup .text.startup.*)
    *(.text .text.*)
    *(.gnu.linkonce.t.*)
  } > flash

/*生成rodata段到flash,输入是所有的只读数据,还有一些指定的函数 */
  .rodata         :
  {
    *(.rdata)
    *(.rodata .rodata.*)
    *(.sdata2.*)
    /* static cli cmds */
    . = ALIGN(4);
    _bl_static_cli_cmds_start = .;
    KEEP(*(.static_cli_cmds))
    *(.static_cli_cmds)
    _bl_static_cli_cmds_end = .;
    /* static blog code1 */
    . = ALIGN(4);
    _bl_static_blogcomponent_code_start = .;
    KEEP(SORT(*)(.static_blogcomponent_code*))
    *(.static_blogcomponent_code*)
    _bl_static_blogcomponent_code_end = .;
    /* static blog code2 */
    . = ALIGN(4);
    _bl_static_blogfile_code_start = .;
    KEEP(SORT(*)(.static_blogfile_code*))
    *(.static_blogfile_code*)
    _bl_static_blogfile_code_end = .;
    /* static blog code3 */
    . = ALIGN(4);
    _bl_static_blogpri_code_start = .;
    KEEP(SORT(*)(.static_blogpri_code*))
    *(.static_blogpri_code*)
    _bl_static_blogpri_code_end = .;
    *(.gnu.linkonce.r.*)
  } > flash

/* 定义预初始化数组 在flash中的排列地址 举个例子 
在程序中拿到 __preinit_array_start和__preinit_array_end 地址,
两个地址相减,就可以直到中间有多少个函数地址,然后使用循环执行这些函数 避免了 一个个调用 */
  .preinit_array :
  {
    . = ALIGN(4);
    __preinit_array_start = .;
    KEEP (*(.preinit_array))
    __preinit_array_end = .;
  } > flash

/* 定义初始化数组 地址排列 */
  .init_array :
  {
    . = ALIGN(4);
    __init_array_start = .;
    KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*)))
    KEEP (*(.init_array))
    __init_array_end = .;
  } > flash
  /*put wifibss in the first place*/

/* 定义wifibss段在ram_wifi中的排列,不自动加载 */
/* 里面定义了应用的第三方的目标文件或静态库 */
  .wifibss         (NOLOAD) :
  {
/* PROVIDE 作用 声明一个地址,如果程序中没有定义这个地址,
则可以直接使用section中定义好的,如果应用程序定义了这个地址,
则使用程序中定义的地址 */
    PROVIDE( __wifi_bss_start = ADDR(.wifibss) );
    PROVIDE( __wifi_bss_end = ADDR(.wifibss) + SIZEOF(.wifibss) );
    *ipc_shared.o(COMMON)
    *sdu_shared.o(COMMON)
    *hal_desc.o(COMMON)
    *txl_buffer_shared.o(COMMON)
    *txl_frame_shared.o(COMMON)
    *scan_shared.o(COMMON)
    *scanu_shared.o(COMMON)
    *mfp_bip.o(COMMON)
    *me_mic.o(COMMON)
    *bl_sta_mgmt_others.o(COMMON)
    *bl_pmk_mgmt.o(COMMON)
    *bl_pmk_mgmt_internal.o(COMMON)
    *libwifi_drv.a:bl_utils.o(COMMON)
    *libwifi_drv.a:bl_utils.o(.bss*)
    *(.wifi_ram*)
    . = ALIGN(16);
  } > ram_wifi
  PROVIDE( _heap_wifi_start = . );
  PROVIDE( _heap_wifi_size = ORIGIN(ram_wifi) + LENGTH(ram_wifi) - _heap_wifi_start );
  .data          :
  {
    PROVIDE( _data_load = LOADADDR(.data) );
    PROVIDE( _data_run = ADDR(.data) );
    PROVIDE( _data_run_end = ADDR(.data) + SIZEOF(.data));
    *(.tcm_code)
    *(.tcm_const)
    *(.sclock_rlt_code)
    *(.sclock_rlt_const)
    *(.data .data.*)
    *(.gnu.linkonce.d.*)
    . = ALIGN(8);
    /*always put freetos under global_pointer with the following order. No change!*/
    PROVIDE( __global_pointer$ = . + 0x7F0 );
    KEEP(*libfreertos_riscv.a:*(.sdata.*))
    KEEP(*libfreertos_riscv.a:*(.sbss.*))
    KEEP(*libfreertos_riscv.a:*(.bss.*))
    KEEP(*libfreertos_riscv.a:*(COMMON))
    *(.sdata .sdata.*)
    *(.gnu.linkonce.s.*)
    . = ALIGN(8);
    *(.srodata.cst16)
    *(.srodata.cst8)
    *(.srodata.cst4)
    *(.srodata.cst2)
    *(.srodata .srodata.*)
    
    . = ALIGN(8);
    *(._k_queue.static.*)
    *(._k_sem.static.*)
    *(._k_mutex.static.*)
    _bt_gatt_service_static_list_start = .;
    KEEP(*(SORT_BY_NAME("._bt_gatt_service_static.static.*")))
    _bt_gatt_service_static_list_end = .;
    _bt_l2cap_fixed_chan_list_start = .;
    KEEP(*(SORT_BY_NAME("._bt_l2cap_fixed_chan.static.*")))
    _bt_l2cap_fixed_chan_list_end = .;
  } > ram_tcm AT > flash
  .boot2 (NOLOAD) :
  {
      PROVIDE ( __boot2_pt_addr_start = . );
      *(.bss.boot2_partition_table)
      PROVIDE ( __boot2_pt_addr_end   = . );
      PROVIDE ( __boot2_flashCfg_start = . );
      *(.bss.boot2_flashCfg)
      PROVIDE ( __boot2_flashCfg_end = . );
  } > ram_tcm
  .bss (NOLOAD)   :
  {
    PROVIDE( __bss_start = ADDR(.bss) );
    PROVIDE( __bss_end = ADDR(.bss) + SIZEOF(.bss) );
    *(.sbss*)
    *(.gnu.linkonce.sb.*)
    *(.bss .bss.*)
    *(.gnu.linkonce.b.*)
    *(COMMON)
  } > ram_tcm
  PROVIDE( _heap_start = . );
  PROVIDE( _heap_size = ADDR(.stack) - _heap_start );
  .stack ORIGIN(ram_tcm) + LENGTH(ram_tcm) - __stack_size (NOLOAD) :
  {
    . = . + __stack_size;
    PROVIDE( _sp_main = . );
    __freertos_irq_stack_top = .;
  } >ram_tcm
  /*SYMOBOL used in code*/
  PROVIDE( _ld_bl_static_cli_cmds_start = _bl_static_cli_cmds_start );
  PROVIDE( _ld_bl_static_cli_cmds_end   = _bl_static_cli_cmds_end );
  /* blog */
  PROVIDE( _ld_bl_static_blogcomponent_code_start = _bl_static_blogcomponent_code_start );
  PROVIDE( _ld_bl_static_blogcomponent_code_end   = _bl_static_blogcomponent_code_end );
  PROVIDE( _ld_bl_static_blogfile_code_start = _bl_static_blogfile_code_start );
  PROVIDE( _ld_bl_static_blogfile_code_end   = _bl_static_blogfile_code_end );
  PROVIDE( _ld_bl_static_blogpri_code_start = _bl_static_blogpri_code_start );
  PROVIDE( _ld_bl_static_blogpri_code_end   = _bl_static_blogpri_code_end );
  PROVIDE( _ld_ram_size0 = LENGTH(flash) );
  PROVIDE( _ld_ram_addr0 = ORIGIN(flash) );
  PROVIDE( _ld_ram_size1 = LENGTH(ram_tcm) );
  PROVIDE( _ld_ram_addr1 = ORIGIN(ram_tcm) );
  PROVIDE( _ld_ram_size2 = LENGTH(ram_wifi) );
  PROVIDE( _ld_ram_addr2 = ORIGIN(ram_wifi) );
  /*BOOT2 sections*/
  PROVIDE ( __boot2_pt_addr_src = BOOT2_PT_ADDR );
  PROVIDE ( __boot2_flashCfg_src = BOOT2_FLASHCFG_ADDR ); 
  PROVIDE(__LD_CONFIG_EM_SEL = __EM_SIZE);
}

最后

以上就是舒服奇迹为你收集整理的bl602链接文件分析的全部内容,希望文章能够帮你解决bl602链接文件分析所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部