1 向导生成的crt代码
在使用vdsp5的向导创建一个新的工程时,它会默认生成一个*_basiccrt.s的文件,其中的*号为工程的名称。这就是在AB两个核中使用的crt文件了,然后通过ldf文件中的相应设置将crt代码放在两个核各自的起始位置上(A核为0xffa0 0000,B核为0xff60 0000)。下面就是ldf文件中的相应内容:
// 添加doj文件到A核工程中
$OBJECTS_CORE_A =
"./Debug/u-boot_basiccrt.doj"
, RT_LIB_NAME(profile561)
, $COMMAND_LINE_OBJECTS {!DualCoreMem("CoreB")}
, "cplbtab561a.doj"
, RT_OBJ_NAME(crtn561)
…
PROCESSOR p0
{
…
// 指定将basiccrt.doj的第一行程序写入到0xFFA00000,其中start为*_basiccrt.s中第一行语句的标号
RESOLVE(start, 0xFFA00000)
KEEP(start,_main)
…
SECTIONS
{
…
L1_code
{
…
// 将basiccrt.s中的代码放到L1_cache中
INPUT_SECTIONS($OBJECTS_CORE_A(program) $LIBRARIES_CORE_A(program))
…
} > MEM_A_L1_CODE
…
} // SECTIONS
…
}
B核的代码与此相似,不做分析。
2 在A核中使用u-boot提供的CRT
u-boot使用的crt文件为u-boot-1.1.6-2008R1/cpu/blackfin/start.s,我们希望用此文件来替换vdsp向导生成的u-boot_basiccrt.s。
1. 将start.s添加到corea.dlb工程中,由于编译器的不同,此处需要做一些适当的修改,参见前几篇文章的说明。
2. 在ldf文件中删除A核对u-boot_basiccrt.s的引用:
$OBJECTS_CORE_A =
/*$VDSG<insert-user-objects-for-coreA-beginning> */
/* Text inserted between these $VDSG comments will be preserved */
/*$VDSG<insert-user-objects-for-coreA-beginning> */
//"./Debug/u-boot_basiccrt.doj" // 注释掉这行,还要删除下一行的逗号
, RT_LIB_NAME(profile561)
, $COMMAND_LINE_OBJECTS {!DualCoreMem("CoreB")}
, "cplbtab561a.doj"
, RT_OBJ_NAME(crtn561)
3. 因为u-boot_basiccrt.s中入口为start,而start.s中的入口为_start,所以还必须修改如下两行:
RESOLVE(start, 0xFFA00000)
KEEP(start,_main)
将之修改为
RESOLVE(_start, 0xFFA00000)
KEEP(_start,_main)
经过上述修改,u-boot会提示链接错误,如下所示:
[Error li1021] The following symbols referenced in processor 'p0' could not be resolved:
'_bss_end [__bss_end]' referenced from 'corea.dlb[start.doj]'
'_bss_start [__bss_start]' referenced from 'corea.dlb[start.doj]'
'cpu_init_f [_cpu_init_f]' referenced from 'corea.dlb[start.doj]'
'initcode [_initcode]' referenced from 'corea.dlb[start.doj]'
但是这已经标志着我们开始迈出第一步了,不是吗?