1.4.3. bl clock_init

	bl clock_init1
        

1

在上面,经过计算,算出了堆栈的地址,然后赋值给了sp,此处,接着才去调用函数clock_init去初始化时钟。

其中此函数是在C文件:

u-boot-1.1.6_20100601\opt\EmbedSky\u-boot-1.1.6\board\EmbedSky\boot_init.c

中:

void clock_init(void)
{
...设置系统时钟clock的相关代码...
}
                

看到这里,让我想起,关于其他人的关于此start.S代码解释中说到的,此处是先去设置好堆栈,即初始化sp指针,然后才去调用C语言的函数clock_init的。

而我们可以看到,前面那行代码:

#ifndef CONFIG_SKIP_LOWLEVEL_INIT
	bl	cpu_init_crit
#endif
                

就不需要先设置好堆栈,再去进行函数调用。

其中cpu_init_crit对应的代码也在start.S中(详见后面对应部分的代码),是用汇编实现的。

而对于C语言,为何就需要堆栈,而汇编却不需要堆栈的原因,请参见本文后面的内容:第 3.6 节 “为何C语言(的函数调用)需要堆栈,而汇编语言却不需要堆栈”