分散加载:指定变量的加载空间

Load分散加载文件之前初始化外部SDRAM

从启动文件中可以看到.sct文件是在__main执行的时候加载的,所以需要在调用__main之前初始化SDRAM:

; Reset handler
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
        IMPORT  SystemInit
        IMPORT  __main
		;Import SDRA_Init function
		IMPORT  SDRAM_Init

                 LDR     R0, =SystemInit
                 BLX     R0
				 
				 LDR     R0, =SDRAM_Init	;Load SDRA_Init function to R0
                 BLX     R0					;Go to R0 for excuting
				 
                 LDR     R0, =__main		;Load __main function to R0
                 BX      R0					;Load .sct and excute main()
                 ENDP

Note1: SDRAM_Init函数中如果用到了变量,则它们必须在堆栈中,因为此时只有堆栈进行了初始化。

修改.sct文件,使变量自动分配到外部SDRAM

LR_IROM1 0x08000000 0x00100000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00100000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }
  RW_IRAM1 0x20000000 0x00030000  {  ; Internal RAM
  *.o(STACK)						 ; For Note1, paramters in SDRAM_Init ocupy STACK otherwise SDRAM
  }
  RW_ERAM1 0xD0000000 0x00800000  {  ; Extenal SDRAM
   .ANY (+RW +ZI)
  }
}

map文件如下:分散加载:指定变量的加载空间_第1张图片

分配单独的变量到指定的执行域

修改.sct文件如下:


LR_IROM1 0x08000000 0x00100000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00100000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }
  RW_IRAM1 0x20000000 0x00030000  {  ; RW data
    .ANY (+RW +ZI)  
  }
  RW_ERAM1 0xD0000000 0x00800000  {  ; Define a section
	.ANY (SelfDefinSection)			 ; Define how to access 
  }
}

在.c中这样调用:

#define _EXTERN 		__attribute__ ((section ("SelfDefinSection")))

uint32_t testValue _EXTERN =7 ;

map文件如下:
分散加载:指定变量的加载空间_第2张图片

你可能感兴趣的:(嵌入式)