打印

深入--单片机软复位(PC跳转)

[复制链接]
3645|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zyboy|  楼主 | 2009-5-20 11:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
对函数指针熟悉吗?熟悉一切都容易了!
好书推荐《C陷阱与缺陷》《C专家编程》看看就上个档次就不是菜鸟了,呵呵

(*(void(*)())0) ();   //就是它了!
晕了吗?没晕,不错不错,大哥,你扎这厉害呢!

((void(*)())0) ();   //如果这样写呢!

(**(void(*)())0) ();   //如果这样写呢!

有区别吗?看下面例子
 
#include<stdio.h>

void fun()
{
}

int main()
{
        printf("%p      %p      %p ", &fun, fun, *fun);
        return 0;
}
看看结果是否大吃一惊  // 没有,大哥你扎这厉害呀

假设fp是个float指针,声明如下
float * fp;
把0强制转换成一个float指针(把变量fp去掉就可以了)
(float *)0;

类似:
假设fp是函数指针为void类型的函数的指针),声明如下:
void (*fp)();      
把0强制转换成该函数指针(变量fp去掉就可以了)
(void(*)())0

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

(*(void(*)())0) ();


单片机我是这样写的
((void(code *)(void))0x0000)();   //简单,证实可以
(*(void(code *)(void))0x0000)();  //这样行吗

是不是看的很麻烦,typedef来帮忙呀(为复杂的声明定义一个新的简单的别名),这不这个大哥来了

typedef void (code *pfunction)(void);
//相当于pfunction变成了一个函数指针的类型(和float含义一样,只不过flaot表示的是一个指向浮点的指针,而pfunction表示一个指向函数的指针)

((function)0xE800)();   //这样行吗
(*(function)0xE800)(); //这样行吗

下面是我在ARM下用过的
typedef void (*pfunction)(void);

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

跳转PC,都是用来在线升级时候,什么什么你没用过,大哥你扎这幸运呢,想当初我带着烧写器做火车,一个电信机房一个电信机房的跑,痛苦呀!

注意:跳转复位PC危险!!!!它只是PC从000开始,内部寄存器并未回到复位值,所以程序初始化一定要彻底,一切系统资源都要初始化,哪怕未用!!!建议最好关狗,等RESET复位较安全(什么什么我用PC跳转没遇到问题啊?大哥你扎这幸运呢!^_^)






   




评分
参与人数 1威望 +1 收起 理由
ILIKESTM32MCU + 1

相关帖子

沙发
louyoung| | 2009-6-27 16:31 | 只看该作者

是啊,C缺陷与陷阱很不错啊。

使用特权

评论回复
板凳
li1yun9| | 2009-6-29 16:16 | 只看该作者

看到指针就头疼

我写程序用的都是简单的指针,能不用的就不用,只有优化的时候才考虑指针行不行。。。

使用特权

评论回复
地板
ILIKESTM32MCU| | 2012-8-31 11:53 | 只看该作者
找了好久总算被我找到了,THANKS A LOT

使用特权

评论回复
5
xfh168168| | 2012-9-25 12:22 | 只看该作者
呵呵  这个写过bootloader的人都知道,bootloader和application都这样跳来跳去的~~~~~~~~~~~~~~~

使用特权

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

本版积分规则

101

主题

356

帖子

0

粉丝