



免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
pc实现跳转。函数指针与绝对地址的跳转c实现uboot的拷贝,pc实现跳转。函数指针与绝对地址的跳转!2011-05-26 15:10(1)void(*theUboot)(void);theUboot=(void(*)(void)(0x 30700000);theUboot();(2)(*(void(*)(void)(0x 30700000)();精彩C语言赏析:函数指针与绝对地址跳转一小段精彩的C语言,1和2实现相同的功能,欢迎大伙跟帖呵(特别感谢trio老师)1 void(*theUboot)(void);。theUboot=(void(*)(void)(0x 30700000);theUboot();。2(*(void(*)(void)(0x 30700000)();aokikyon发表于2008-9-10 21:00看不懂。ToT讲解下好吗shixq发表于2008-9-11 09:13呵呵,强制类型转换,将一个绝对地址转换为一个函数指针,并调用这个函数以跳转到前面提到的绝对地址.翻译成汇编就是:mov r0,0x 30700000;mov pc,r0 trio老师说了,会用函数指针就可以成为C语言高手.目前尚处于模仿阶段,还没有领会函数指针的精髓,继续修炼中.shixq发表于2008-9-11 09:16原来用2的方式实现要加一个括号.看来对优先级的领会还是不够,当天少加了一个括号,编译死活通不过,没办法才用1的方法,先定义了一个空指针.trio发表于2008-9-11 10:10(*(void(*)(void)(0x 30700000)();可以这样理解首先(void(*)(void)是一个强制类型转换符,他将后面的0x 30700000这个无符号整数强制转化为一个函数指针,该函数指针所指向的函数入口参数为void,返回值也是void。如果到这步你看懂了,那么设(void(*)(void)(0x 30700000)为fp;那么上面的表达式就可以简化为(*fp)();OK,这下就清楚了吧,我们将上面转化好的函数指针进行引用(也就是调用函数指针指向的函数)。space发表于2008-9-11 17:25:)感谢大师trio和大侠shixq的精彩回复aii 7780967发表于2008-9-11 17:45浩子加油我看不懂不懂就要问呵呵athon发表于2008-11-8 16:06看不懂,以后得好好学习c语言了。老师和学长都很厉害。ender发表于2008-11-8 18:11又进步了今天又有收获啦!多谢老师和学长:loveliness:shixq发表于2008-11-8 18:58呵呵,这是NandFlash烧写启动代码里的一段程序。原程序主要实现将0x 30100000处512+16字节的内容烧写到NandFlash的第一页,将0x 30101000处的512字节的内容烧写到NandFlash的第二页。然后程序跳转到0x 30700000,开始执行UBOOT的代码,然后在UBOOT的提示符下将0x 30600000(与0x 30700000处的代码完全相同)的内容烧写到NandFlash指定的位置。以上完成NandFlash启动的UBOOT烧写。下面再简单介绍一下NandFlash启动的流程:系统重新上电后,首先执行NandFlash第一页的代码,初始化CPU各必要的寄存器,然后跳转到0x 30000000外执行几条汇编,将第二页的代码搬运到0x 30001000,然后跳转到0x 30001000处执行第二页的代码,将UBOOT从NandFlash搬运到0x 30700000处,然后跳转到0x 30700000处,执行UBOOT代码,完成系统启动.楼主的帖子里的语句完成的就是烧写过程中跳转到0x 30700000处这个动作,这个动作用汇编实现非常简单,用C来实现可能感觉高深了一些。函数指针是一个非常有用的东东!:)shuangsefengye发表于2009-2-21 20:20昨天老师刚讲了下,貌似现在才有些理解了,嘿嘿。fpmystar发表于2009-2-22 21:10这个对函数指针的理解太恰当了,得收藏下august发表于2009-6-11 16:36一般情况是第一种写法qiu1123发表于2009-6-16 16:47:Q:Q:Q:Q:Q moral发表于2009-7-17 15:41我承认我没有看懂,假如要强制转换成long格式呢,应该怎么写?moral发表于2009-7-17 16:52好吧,我自己来回答自己吧.unsigned long*SPITDR;SPITDR=(long(*)(0xfffc800c);SPITDR=0x000c0001;trio发表于2009-7-17 20:05我认为上面的代码是错误的!,第二行代码就有问题,你将一个函数指针赋值给了一个指向整数的指针,这个语句是什么意思呢?第三行代码则又将一个整数(0x000c001)赋值给了这个指向整数的指针,赋值两边的数据类型都不一样!shixq发表于2009-7-17 20:51如果我理解没错的话,15楼的意思应该是将一个32位的数转换为一个地址,然后再写这个地址。和函数指针是没有关系的。我想应该这么来做:*(unsigned long*)(0xFFFC800C)=0x000C0001 jusistda发表于2009-7-18 18:16quote原帖由imoral/i于2009-7-17 16:52发表url=好吧,我自己来回答自己吧.unsigned long*SPITDR;SPITDR=(long(*)(0xfffc800c);SPITDR=0x000c0001;/quote是32位的数0xfffc800c转化成32位的地址,然后往这个地址写0x000C0001吧?(*)这个括号是不是可以不加呀?关键是指针赋值的时候要加*吧?unsigned long*SPITDR;SPITDR=(unsigned long*)(0xfffc800c);*SPITDR=0x000c0001;i本帖最后由jusistda于2009-7-18 18:23编辑/izzwuyu发表于2009-9-17 16:15quote原帖由ijusistda/i于2009-7-18 18:16发表url=是32位的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 餐饮装修维修合同范本
- 云南廉价租房合同范本
- 西方飞机租赁合同范本
- 住房公积金管理中心创建市文明单位申报材料
- 乡镇2025年防止返贫动态监测帮扶集中排查工作方案
- 2025年安全工器具题库及答案
- 2025年山西省朔州市事业单位工勤技能考试考试题库及参考答案
- 2025年山东省烟台市事业单位工勤技能考试题库及答案
- CN120269323A 冷却器的拆装装置及方法 (华能澜沧江水电股份有限公司)
- 轨道交通考试试题及答案
- 核能质保监查员考试题及答案
- 9.3纪念抗日战争胜利80周年阅兵式观后感
- 2025年70周岁以上老年人换长久驾照三力测试题库(含答案)
- 2025年广西公需科目答案02
- 电力工业技术监督历史沿革及现状分析-
- GB/T 2423.22-2012环境试验第2部分:试验方法试验N:温度变化
- 最新低压电工安全培训课件
- 水土保持工程质量评定表
- 整机部整机出货检验重点标准
- 人像摄影:户外人像摄影课件
- 美丽中国中英文字幕
评论
0/150
提交评论