linux内核学习初笔记(3)u-boot执行第二阶段typedef int (init_fnc_t) (void)解释

学习到u-boot的第二阶段,在borad.c文件中看到这个类型定义。有些迷惑,C语言功底本来就一般,再加上学习前面的东西被ARM的汇编代码已经搞的头脑乱七八糟了,就没法分析清楚这个东东的真正含义了,不过咱们有强大的网络支持,谷歌和度娘查一炮,啥都清楚了。

首先,typedef int (init_fnc_t) (void)本质就是个类型定义,定义的就是一个新的数据类型init_fnc_t,这个数据类型是参数为空,返回值为int的函数。即我们typedef int (init_fnc_t) (void)类型就是定义了一种数据类型,这种类型是一种函数,这种函数是一种参数为空,返回值为int的函数。

那下面的程序就不难理解了:

/*init_sequence是一个指针数组,指向的是init_fnc_t类型的函数*/
init_fnc_t *init_sequence[] = {
cpu_init, /* basic cpu dependent setup */
board_init, /* basic board dependent setup */
interrupt_init, /* set up exceptions */
env_init, /* initialize environment */
init_baudrate, /* initialze baudrate settings */
serial_init, /* serial communications setup */
console_init_f, /* stage 1 init of console */
display_banner, /* say that we are here */
dram_init, /* configure available RAM banks */
display_dram_config,
#if defined(CONFIG_VCMA9) || defined (CONFIG_CMC_PU2)
checkboard,
#endif
NULL,
};

/*init_fnc_ptr为指向函数指针的指针*/
init_fnc_t **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中调用指针指向的函数*/
hang ();
}
}

C语言调用函数指针的方式:

有两种:

void test(int);

main(){
void (*fp)(int);
fp=test;
(*fp)(9);

fp(9);
return 0;
}

void test(int a)
{
printf( "%d\n", a );
}

这两种形式是等价的,都是为ANSI C所接受的。

自然,我们上面的例子是使用了第二种。首先要明白,我们的定义init_fnc_t **init_fnc_ptr;是定一个指针init_fnc_ptr,该指针指向的内容还是一个指针1,而指针1的类型是init_fnc_t类型的指针,即指针1指向一个init_fnc_t类型的数据,这个数据其实是我们定义的一种参数为空,返回值为int的函数。那后面我们使用*init_fnc_ptr是取出了init_fnc_ptr指针所指向的内容,自然这个内容就是指针1,在for循环中,这个指针1就会分别是数组中的每个值,即函数指针,那么for循环语句口号中的*init_fnc_ptr就是检查数组中是否还有值,如果没值,则为NULL,则停止循环。而后面的if((*init_fnc_ptr)()!= 0),则是因为*init_fnc_ptr就是数组中的每个值,即函数指针fp=*init_fnc_ptr,而根据上面分析,函数指针的第二种用法,则fp()=(*init_fnc_ptr)()。

至此,将这个问题搞明白了!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值