關於typedef int (init_fnc_t) (void);理解
來源:http://blog.chinaunix.net/uid-22979746-id-2590215.html
位於lib_arm/board.c
typedef int (init_fnc_t) (void); //自定義新的資料型別init_fnc_t,這個資料型別是引數為空,返回值為int的函式
PS:注意init_fnc_t並不是函式指標!!! 如果這樣寫就表示函式指標 typedef int (*init_fnc_t) (void);
//init_sequence是一個指標陣列(陣列元素為指標變數),指向的是init_fnc_t型別的函式(為什麼是函式呢?因為指向的新的資料型別init_fnc_t是引數為空,返回值為int的函式)
init_fnc_t *init_sequence[] = { //int *init_sequence[i]表示指標陣列,也就是陣列元素是指標變數(函式的入口地址)!!!
#if defined(CONFIG_ARCH_CPU_INIT)
arch_cpu_init, /* basic arch cpu dependent setup 基本的處理器相關配置 -- cpu/s3c44b0/cpu.c */
#endif
board_init, /* basic board dependent setup 基本的板級相關配置 -- board/samsung/smdk2410/smdk2410.c */
#if defined(CONFIG_USE_IRQ)
interrupt_init, /* set up exceptions 初始化例外處理 -- cpu/s3c44b0/interrupt.c */
#endif
timer_init, /* initialize timer */
env_init, /* initialize environment 初始化環境變數 -- common/env_flash.c */
init_baudrate, /* initialze baudrate settings 初始化波特率設定 -- lib_arm/board.c*/
serial_init, /* serial communications setup 串列埠通訊設定 -- cpu/s3c44b0/serial.c */
console_init_f, /* stage 1 init of console 控制檯初始化階段1 -- common/console.c*/
display_banner, /* say that we are here 列印u-boot資訊 -- lib_arm/board.c*/
#if defined(CONFIG_DISPLAY_CPUINFO)
print_cpuinfo, /* display cpu info (and speed) */
#endif
#if defined(CONFIG_DISPLAY_BOARDINFO)
checkboard, /* display board info */
#endif
#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
init_func_i2c,
#endif
dram_init, /* configure available RAM banks 配置可用的RAM -- board/samsung/smdk2410/smdk2410.c*/
#if defined(CONFIG_CMD_PCI) || defined (CONFIG_PCI)
arm_pci_init,
#endif
display_dram_config, //顯示RAM的配置大小 -- lib_arm/board.c
NULL,
};
//init_fnc_t 為指向函式指標的指標
init_fnc_t **init_fnc_ptr; //init_fnc_ptr是函式指標的指標,"函式指標"表示指向的內容;後面的"指標"表示init_fnc_ptr本身為一個指標變數
/*init_fnc_ptr初始化指向init_sequence指標陣列,下 面的迴圈遇到NULL結束*/
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
if ((*init_fnc_ptr)() != 0) { /*(*init_fnc_ptr)()為C中呼叫指標指向的函式,例如 arch_cpu_init()*/
hang (); //列印錯誤資訊並死鎖
}
}
PS:指標陣列和指向指標的指標 兩者的主要區別(現在只悟到了這麼一點)
就是,指標陣列的陣列名不能進行++操作(因為陣列名僅僅代表一個地址!是一個常量!!),而指向指標的指標是可以++的(因為它是一個變數!),所以這段原始碼中,重新定義了一個指向函式指標的指標init_fnc_ptr來對指標陣列(init_sequence)進行操作. 操作也就是將各個準備初始化的函式的入口地址依次賦給init_fnc_ptr!而*init_fnc_ptr就正好對應arch_cpu_init這些東西了,那麼(*init_fnc_ptr)()就相當於arch_cpu_init()了.
PS:函式指標就是函式的入口地址,指標就是地址,貌似可以這麼來理解