在u-boot中有部分代码需要放在L1中,因此在u-boot.lds.s中定义的两个段:
.text_l1 :
{
. = ALIGN(4);
__stext_l1 = .;
*(.l1.text)
. = ALIGN(4);
__etext_l1 = .;
} >l1_code AT>ram
__stext_l1_lma = LOADADDR(.text_l1);
.data_l1 :
{
. = ALIGN(4);
__sdata_l1 = .;
*(.l1.data)
*(.l1.bss)
. = ALIGN(4);
__edata_l1 = .;
} >l1_data AT>ram
__sdata_l1_lma = LOADADDR(.data_l1);
一个代码段和一个数据段,相应的,我在u-boot.ldf中为其添加两个段:
.text_l1
{
INPUT_SECTION_ALIGN(4)
__stext_l1 = .;
__stext_l1_lma = .;
INPUT_SECTIONS($LIBRARIES_UBOOT(.l1.text))
INPUT_SECTION_ALIGN(4)
__etext_l1 = .;
} > MEM_A_L1_CODE
.data_l1
{
INPUT_SECTION_ALIGN(4)
__sdata_l1 = .;
__sdata_l1_lma = .;
INPUT_SECTIONS($LIBRARIES_UBOOT(.l1.data))
INPUT_SECTIONS($LIBRARIES_UBOOT(.l1.bss))
INPUT_SECTION_ALIGN(4)
__edata_l1 = .;
} > MEM_A_L1_DATA_A
这里需要注意的是
__stext_l1_lma和
__sdata_l1_lma两个地址的定义。这两个地址仅当BF561不使用方式1启动时才有效果,在此种情况下,要放到L1中的内容刚开始是存放在FLASH上的,u-boot初始化时会将要这些代码或数据复制到L1中的相应位置,而
__stext_l1_lma和
__sdata_l1_lma两个地址分别指向了这些代码或者数据在FLASH上的存储位置。但是由于我的板子使用的是方式1,因此就直接将这两个值指向L1段起始的位置。