第二阶段
lib_arm/board.c 中.直接进入 void start_armboot(void)
1. init_fnc_t **init_fnc_ptr;
typedef int (init_fnc_t) (void);
|
其中 init_fnc_t 如下,它是一个函数类型,该类型的函数参数都为空(void),且都返回整型值(int)
init_fnc_t *init_sequence[] = {
//这里是一些函数名,即这个数组的成员
NULL,
};
|
init_fnc_t **init_fnc_ptr;
|
那么这里就定义了变量init_fnc_ptr,它是一个指针变量,其中存的是另一个变量B的地址,而变量B也是一个指针变量,其中存的是init_fnc_t类型的函数的地址.
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
if ((*init_fnc_ptr)() != 0) {
hang ();
} }
|
上面这个for语句,表可以用图来表示
init_fnc_ptr 数组,每个成员是某函数的地址
+---------+ +----------+
| | ----->| | ---------------> int fun1(void)
+---------+ +----------+
| | ---------------> int fun2(void)
+----------+
| | ---------------> int fun3(void)
+----------+
| | ---------------> int fun4(void)
+----------+
++init_fnc_ptr 便指向了数组内的下一个成员。
//来看下初始化都执行的各个函数
,其中除去了一些不会用到的函数
init_fnc_t *init_sequence[] = {
cpu_init, // cpu/arm920t/cpu.c 这里实际上是个空函数
board_init, // board/smdk2410/smdk2410.c 初始化时钟,初始各GPIO,
// 初始bd->bi_arch_number 、bd->bi_boot_params
interrupt_init, // cpu/arm920t/s3c24x0/interrupts.c
// 这里初始2410的定时器
env_init, // common/env_nand.c
// 这里环境变量存储在nand中,初始gd中环境相关成员
init_baudrate, // lib_arm/board.c,初始bd_t结构中的波特率成员
serial_init, // cpu/arm920t/s3c24x0/serial.c 初始串口
console_init_f, // common/console.c 初始gd_t中有关终端的成员
display_banner, // lib_arm/board.c 打印一些板级的信息
dram_init, // board/smdk2410/smdk2410.c
// 初始化内存,即初始bd_t结构中有关内存的成员
display_dram_config, //lib_arm/board.c 打印内存信息
NULL,
};
|
紧接着对上述函数体做一一的分析。
阅读(1008) | 评论(0) | 转发(0) |