打印
[牛人杂谈]

(*(void(*)())0) ()讲解-单片机另类的复位

[复制链接]
903|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
DreamofOven|  楼主 | 2016-3-29 21:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
硬件地址跳到0处
(*(void(*)())0) ();

预备知识
float (*h)();
表示h是一个指向返回值float类型的函数的指针
(float(*)())
表示一个"指向返回值float类型的函数的指针"的类型转换符


假设fp是一个函数指针,那么如何调用fp所指向的函数,调用方法如下:
(*fp)();

按照人们的惯性思维,那么我们可以这样写
(*0)();

上式不能生效,因为运算符*必须要一个指针来做操作数,而且这个指针还必须是个函数指针。所以我们必须要把0强制转换成一个函数指针(指向返回值为void类型的函数的指针)

假设fp是个float指针,声明如下
float * fp;

把0强制转换成一个float指针(把变量fp去掉就可以了)
(float *)0;

类似:
假设fp是函数指针为void类型的函数的指针),声明如下:
void (*fp)();      

把0强制转换成该函数指针(变量fp去掉就可以了)
(void(*)())0

最后用(void(*)())0代替fp,从而得到调用的用法
(*(void(*)())0) ();




可用typedef简化函数指针
例如:
typedef char * string;

string test="hello";

类似
typedef void(*func)();   //这样func就表示一个函数指针的类型

(*(func)0)();


例子
方法一:
typedef void (*pfunction)(void);

void FMI_Jump(void)
{   
  pfunction jump;
  jump=(pfunction)(0x80000);
  jump();
  
}

方法二:
((void(code *)(void))0xF400)();

沙发
zhuotuzi| | 2016-3-29 23:03 | 只看该作者
这些变态的使用方法,实在是难以理解。

使用特权

评论回复
板凳
捉虫天师| | 2016-3-30 11:33 | 只看该作者
函数指针是指向函数的指针变量。 因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。函数指针有两个用途:调用函数和做函数的参数。

使用特权

评论回复
地板
lovecat2015| | 2016-4-1 20:31 | 只看该作者
这个属于什么类型的复位呢,硬件bug?

使用特权

评论回复
5
戈卫东| | 2016-4-2 19:32 | 只看该作者
这个并不是真的复位,只不过是跳转到复位向量,如果把这个当复位用可能带来问题。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

178

帖子

0

粉丝