-
pc
实现跳转。函数指针与绝对地址的
跳转
p>
c
实现
uboot
的拷贝,
pc
实现跳转。函数指针与绝对地址的跳转!
2011-
05-
26 15
:
10(1)void(*theUboot)(v
oid)
;
theUboot=(void(*)(void))(0x
30700000)
;
theUboot()
;
(2)(*(void(*)(void))(0x
30700000))()
;
精彩<
/p>
C
语言赏析:函数指针与绝对地址跳转
一小段精彩的
C
语言,
1
和
2
实现相同的功能,欢迎
大伙跟帖呵
(
特别感谢
trio
老师
)
1
void(*theUboot)(void)
;
。
theUboot=(void(*)(void))(0x
30700000)
;
theUboot()
;
。
2(*(void(*)(void))(0x
30700000))()
;
aok
ikyon
发表于
2008-9-10
21
:
00
看不懂。
ToT
讲解下好吗
shixq
发表于
2008-9-11
09
:
13
呵呵,强制类型转换,将
一个绝对地址转换为一个函数指针,并调用这个
函数以跳转到前面提到的绝对地址
.
翻译成汇编就是:
mov r0,0x
30700000
;
mov
pc,r0 trio
老师说了,会用函数指针就可以成为
C<
/p>
语言高手
.
目前尚处于模仿阶段,还没
有领会函数指针的精髓,继续修炼中
.
shixq
发表于
2008-9-11
09
:
16
原来用
< br>2
的方式实现要加一个括号
.
看来对优先级的领会还是不够,当天少加了一个括号,编译死活通不过,
没办法才用
p>
1
的方法,先定义了一个空指针
.
trio
发表于
2008-9-11
10
:
10
(*(void(*)(void))(0x
30700000))()
;
可以这样理解
首先
< br>(void(*)(void))
是一个强制类型转换符,他将后面的
0x 30700000
这
个无符号整数强制转化
为一个函数指针,该函数指针所指向的函数入口参数为
void
,返回值也是
void
。如果到这步你看懂了,那么设
(void(*)(void))(0x
30700000)
为
fp
;那么上面的表达式就可以简化为
(*fp)()
;
OK
,这下就清楚了
吧,我们将上面转化好的函数指针进行引用
(
也就是调用函数指针指向的函数
)
。<
/p>
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
指定的位置。以上完成
NandFla
sh
启动的
UBOOT
烧写。
下面再简单介绍一下
NandFlash
p>
启动的流程:
系统重新上电后,首先执行
NandFlash
第一页的代码,初始化
CPU
各必要
的寄存器,然后跳转到
0x
30000000
外执行几条汇编,将第二页的代码搬运到
0x
30001000
,然后跳转到
0x 30001000
处执行第二页的代码,将
UBOOT
从
NandFlash
搬运到
0x
30700000
处,然后跳转到
0x 30700000
p>
处,执行
UBOOT
代码,完成系统启动<
/p>
.
-
-
-
-
-
-
-
-
-
上一篇:【英语】中考英语书面表达
下一篇:极其简单好用的按键扫描程序C语言