完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在jumptable_init 函数中用函数指针gd->jt[XF_get_version]来进行初始化一些常用函数,但是XF_get_version却不知道是在哪里定义?若是枚举也没找到是在哪里定
void start_ARMboot (void) { ..................... jumptable_init (); ........................ } void jumptable_init (void) { int i; gd->jt = (void **) malloc (XF_MAX * sizeof (void *)); for (i = 0; i < XF_MAX; i++) gd->jt = (void *) dummy; gd->jt[XF_get_version] = (void *) get_version; gd->jt[XF_malloc] = (void *) malloc; gd->jt[XF_free] = (void *) free; gd->jt[XF_getenv] = (void *) getenv; gd->jt[XF_setenv] = (void *) setenv; gd->jt[XF_get_timer] = (void *) get_timer; gd->jt[XF_simple_strtoul] = (void *) simple_strtoul; gd->jt[XF_udelay] = (void *) udelay; #if defined(CONFIG_I386) || defined(CONFIG_PPC) gd->jt[XF_install_hdlr] = (void *) irq_install_handler; gd->jt[XF_free_hdlr] = (void *) irq_free_handler; #endif /* I386 || PPC */ #if (CONFIG_COMMANDS & CFG_CMD_I2C) gd->jt[XF_i2c_write] = (void *) i2c_write; gd->jt[XF_i2c_read] = (void *) i2c_read; #endif /* CFG_CMD_I2C */ } |
|
相关推荐
1个回答
|
|
不知道你是看的哪个version的Uboot,我从差不多2012.04的版本看到是这样的:arch/arm/lib/borad.c:
board_init_r jumptable_init commom/exports.c: #include #define EXPORT_FUNC(sym) gd->jt[XF_##sym] = (void *)sym; ...... void jumptable_init(void) { gd->jt = malloc(XF_MAX * sizeof(void *)); #include <_exports.h> } include/exports.h: enum { #define EXPORT_FUNC(x) XF_ ## x , #include <_exports.h> #undef EXPORT_FUNC XF_MAX }; 那么以上代码就很明显了,你贴的jumptable_init代码和上面 jumptable_init的实现是一个意思,XF_get_version就是在exports.h里面定义的枚举变量。 这函数应该仅仅是对结构体进行函数指针的填充而已,每个函数的实现可以在uboot中找到。 至于英语挂科的大牛贴出来的 在stubs.c中: #define EXPORT_FUNC(x) asm volatile ( " .globl " #x "n" #x ":n" " movl %0, %%eaxn" //将枚举量*指针大小 ---> eax " movl jt, %%ecxn" //将基地址 jt 写入 ---> ecx " jmp *(%%ecx, %%eax)n" //基址寻址,通过jmp指令跳过去那个函数 (such as : jt + (XF_ger_version * sizeof(void *)) ,去调用到 get_version函数) : : "i"(XF_ ## x * sizeof(void *)) : "eax", "ecx"); 这个宏实现的功能也就是函数的调用而已,具体代码中有没有用这样的方式去调用代码,这要看具体实现了。 我猜居然填充到了gd->xxx 里面了,就没必要用这种方式调用,你可以自己看下,没深究 以上我的见解,有错误请指出,相互学习 |
|
|
|
只有小组成员才能发言,加入小组>>
197个成员聚集在这个小组
加入小组为什么点亮LED的例子放在NORFlash上跑会出现奇怪的现象?
2160 浏览 6 评论
1968 浏览 5 评论
韦东山老师推出的《玩转ARM裸机实战》课程将帮你以上问题一扫而光!
4523 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 09:00 , Processed in 0.615921 second(s), Total 79, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号