OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2564|回复: 2

有一个回调的看不太懂其意义,大家来讨论一下

[复制链接]

58

主题

96

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2015-7-27
在线时间
21 小时
发表于 2016-6-2 11:32:09 | 显示全部楼层 |阅读模式
5金钱
大家好,

C文件里定义了一个
typedef void (*start_fn_t)(const sysparam_t *param);

另外,结构体的定义:
typedef struct {
    const char * bootver;
    uint32_t master_addr;
    uint32_t config_addr;
    const rsa_pub_key_t * key;
}sysparam_t;
extern const sysparam_t * sysparam;



最后,在一个函数里这样调用了一下
    ((start_fn_t)(*(uint32_t *)  (sysparam->master_addr + 4)))(sysparam);





这句话是函数的最后一句话,这句话看不懂啊。。貌似就是把一个地址强转成一个函数,然后带了个自己的参数,可是没有函数体啊。。函数使用typedef来定义的











最佳答案

查看完整内容[请看2#楼]

( (start_fn_t) ( * (uint32_t *) (sysparam->master_addr + 4) ) )(sysparam); sysparam->master_addr + 4这个地方我不明白 之前肯定有过赋值 总体上来说是函数指针的问题 函数本是存在flash里的地址 你这个地方给什么函数地址,就会跳转到什么函数 总的来说 参数是(const sysparam_t *param) 返回量是void的函数都可能被赋值到sysparam->master_addr + 4
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

22

主题

751

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1605
金钱
1605
注册时间
2015-6-10
在线时间
222 小时
发表于 2016-6-2 11:32:10 | 显示全部楼层
本帖最后由 止天 于 2016-6-2 13:43 编辑

  (  (start_fn_t)   (    *   (uint32_t *)      (sysparam->master_addr + 4)    )    )(sysparam);


sysparam->master_addr + 4这个地方我不明白  之前肯定有过赋值

总体上来说是函数指针的问题   
函数本是存在flash里的地址
你这个地方给什么函数地址,就会跳转到什么函数

总的来说    参数是(const sysparam_t *param)   返回量是void的函数都可能被赋值到sysparam->master_addr + 4
回复

使用道具 举报

58

主题

96

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2015-7-27
在线时间
21 小时
 楼主| 发表于 2016-6-2 13:44:03 | 显示全部楼层
止天 发表于 2016-6-2 13:39
(  (start_fn_t)   (    *   (uint32_t *)      (sysparam->master_addr + 4)    )    )(sysparam);


...

我知道了,谢谢!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 16:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表