bl602_flash.ld 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. /****************************************************************************************
  2. * @file map.txt
  3. *
  4. * @brief This file is the map file (gnuarm or armgcc).
  5. *
  6. * Copyright (C) BouffaloLab 2018
  7. *
  8. ****************************************************************************************
  9. */
  10. /* configure the CPU type */
  11. OUTPUT_ARCH( "riscv" )
  12. /* link with the standard c library */
  13. /*INPUT(-lc)*/
  14. /* link with the standard GCC library */
  15. /*INPUT(-lgcc)*/
  16. /* configure the entry point */
  17. ENTRY(__start)
  18. StackSize = 0x0400; /* 1KB */
  19. HeapSize = 0x1000; /* 4KB */
  20. MEMORY
  21. {
  22. fw_header_memory (rx) : ORIGIN = 0x23000000 - 0x1000, LENGTH = 4K
  23. xip_memory (rx) : ORIGIN = 0x23000000, LENGTH = 1024K
  24. itcm_memory (rx) : ORIGIN = 0x22010000, LENGTH = 16K
  25. dtcm_memory (rx) : ORIGIN = 0x42014000, LENGTH = 48K
  26. ram_memory (!rx) : ORIGIN = 0x42020000, LENGTH = 176K
  27. }
  28. SECTIONS
  29. {
  30. PROVIDE(__metal_chicken_bit = 0);
  31. .fw_header :
  32. {
  33. KEEP(*(.fw_header))
  34. } > fw_header_memory
  35. .text :
  36. {
  37. . = ALIGN(4);
  38. __text_code_start__ = .;
  39. KEEP (*(SORT_NONE(.init)))
  40. KEEP (*(SORT_NONE(.vector)))
  41. *(.text)
  42. *(.text.*)
  43. /* section information for finsh shell */
  44. . = ALIGN(4);
  45. __fsymtab_start = .;
  46. KEEP(*(FSymTab))
  47. __fsymtab_end = .;
  48. . = ALIGN(4);
  49. __vsymtab_start = .;
  50. KEEP(*(VSymTab))
  51. __vsymtab_end = .;
  52. . = ALIGN(4);
  53. /* section information for modules */
  54. . = ALIGN(4);
  55. __rtmsymtab_start = .;
  56. KEEP(*(RTMSymTab))
  57. __rtmsymtab_end = .;
  58. /* section information for initialization */
  59. . = ALIGN(4);
  60. __rt_init_start = .;
  61. KEEP(*(SORT(.rti_fn*)))
  62. __rt_init_end = .;
  63. /*put .rodata**/
  64. *(EXCLUDE_FILE( *bl602_glb*.o* \
  65. *bl602_pds*.o* \
  66. *bl602_common*.o* \
  67. *bl602_sf_cfg*.o* \
  68. *bl602_sf_cfg_ext*.o* \
  69. *bl602_sf_ctrl*.o* \
  70. *bl602_sflash*.o* \
  71. *bl602_sflash_ext*.o* \
  72. *bl602_xip_sflash*.o* \
  73. *bl602_xip_sflash_ext*.o* \
  74. *bl602_ef_ctrl*.o*) .rodata*)
  75. *(.rodata)
  76. *(.rodata.*)
  77. *(.srodata)
  78. *(.srodata.*)
  79. . = ALIGN(4);
  80. __text_code_end__ = .;
  81. } > xip_memory
  82. . = ALIGN(4);
  83. __itcm_load_addr = .;
  84. .itcm_region : AT (__itcm_load_addr)
  85. {
  86. . = ALIGN(4);
  87. __tcm_code_start__ = .;
  88. *(.tcm_code.*)
  89. *(.tcm_const.*)
  90. *(.sclock_rlt_code.*)
  91. *(.sclock_rlt_const.*)
  92. *bl602_glb*.o*(.rodata*)
  93. *bl602_pds*.o*(.rodata*)
  94. *bl602_common*.o*(.rodata*)
  95. *bl602_sf_cfg*.o*(.rodata*)
  96. *bl602_sf_cfg_ext*.o*(.rodata*)
  97. *bl602_sf_ctrl*.o*(.rodata*)
  98. *bl602_sflash*.o*(.rodata*)
  99. *bl602_sflash_ext*.o*(.rodata*)
  100. *bl602_xip_sflash*.o*(.rodata*)
  101. *bl602_xip_sflash_ext*.o*(.rodata*)
  102. *bl602_ef_ctrl*.o*(.rodata*)
  103. . = ALIGN(4);
  104. __tcm_code_end__ = .;
  105. } > itcm_memory
  106. __dtcm_load_addr = __itcm_load_addr + SIZEOF(.itcm_region);
  107. .dtcm_region : AT (__dtcm_load_addr)
  108. {
  109. . = ALIGN(4);
  110. __tcm_data_start__ = .;
  111. *(.tcm_data)
  112. . = ALIGN(4);
  113. __tcm_data_end__ = .;
  114. } > dtcm_memory
  115. /* .heap_dummy section doesn't contains any symbols. It is only
  116. * used for linker to calculate size of heap sections, and assign
  117. * values to heap symbols later */
  118. .heap_dummy (NOLOAD):
  119. {
  120. . = ALIGN(0x4);
  121. . = . + HeapSize;
  122. . = ALIGN(0x4);
  123. } > dtcm_memory
  124. _HeapBase = ORIGIN(dtcm_memory) + LENGTH(dtcm_memory) - StackSize - HeapSize;
  125. _HeapSize = HeapSize;
  126. /* Check if data + heap + stack exceeds RAM limit */
  127. ASSERT(_HeapBase >= __tcm_data_end__, "region RAM overflowed with stack")
  128. /*************************************************************************/
  129. /* .stack_dummy section doesn't contains any symbols. It is only
  130. * used for linker to calculate size of stack sections, and assign
  131. * values to stack symbols later */
  132. .stack_dummy (NOLOAD):
  133. {
  134. . = ALIGN(0x4);
  135. . = . + StackSize;
  136. . = ALIGN(0x4);
  137. } > dtcm_memory
  138. /* Set stack top to end of RAM, and stack limit move down by
  139. * size of stack_dummy section */
  140. __StackTop = ORIGIN(dtcm_memory) + LENGTH(dtcm_memory);
  141. PROVIDE( __freertos_irq_stack_top = __StackTop);
  142. PROVIDE( __rt_rvstack = . );
  143. __StackLimit = __StackTop - SIZEOF(.stack_dummy);
  144. /* Check if data + heap + stack exceeds RAM limit */
  145. ASSERT(__StackLimit >= __tcm_data_end__, "region RAM overflowed with stack")
  146. /*************************************************************************/
  147. __ram_load_addr = __dtcm_load_addr + SIZEOF(.dtcm_region);
  148. /* Data section */
  149. RAM_DATA : AT (__ram_load_addr)
  150. {
  151. . = ALIGN(4);
  152. __ram_data_start__ = .;
  153. PROVIDE( __global_pointer$ = . + 0x800 );
  154. *(.data)
  155. *(.data.*)
  156. *(.sdata)
  157. *(.sdata.*)
  158. *(.sdata2)
  159. *(.sdata2.*)
  160. *(.nocache_ram)
  161. . = ALIGN(4);
  162. __bflog_tags_start__ = .;
  163. *(.bflog_tags_array)
  164. . = ALIGN(4);
  165. __bflog_tags_end__ = .;
  166. __ram_data_end__ = .;
  167. } > ram_memory
  168. .bss (NOLOAD) :
  169. {
  170. . = ALIGN(4);
  171. __bss_start__ = .;
  172. *(.bss*)
  173. *(.sbss*)
  174. *(COMMON)
  175. . = ALIGN(4);
  176. __bss_end__ = .;
  177. } > ram_memory
  178. .noinit_data (NOLOAD) :
  179. {
  180. . = ALIGN(4);
  181. __noinit_data_start__ = .;
  182. *(.noinit_data*)
  183. *(.nocache_noinit_ram)
  184. . = ALIGN(4);
  185. __noinit_data_end__ = .;
  186. } > ram_memory
  187. .heap (NOLOAD):
  188. {
  189. . = ALIGN(4);
  190. __HeapBase = .;
  191. /*__end__ = .;*/
  192. /*end = __end__;*/
  193. KEEP(*(.heap*))
  194. . = ALIGN(4);
  195. __HeapLimit = .;
  196. } > ram_memory
  197. __HeapLimit = ORIGIN(ram_memory) + LENGTH(ram_memory);
  198. }