3847|5

39

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

深入--单片机软复位(PC跳转) [复制链接]

对函数指针熟悉吗?熟悉一切都容易了!
好书推荐《C陷阱与缺陷》《C专家编程》看看就上个档次就不是菜鸟了,呵呵
(*(void(*)())0) ();   //就是它了!
晕了吗?没晕,不错不错,大哥,你扎这厉害呢!
((void(*)())0) ();   //如果这样写呢!
(**(void(*)())0) ();   //如果这样写呢!
有区别吗?看下面例子

#include
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跳转没遇到问题啊?大哥你扎这幸运呢!^_^)
此帖出自单片机论坛

最新回复

那不是主动的跳转,是被动的,主动跳转到00会有问题么,跳转不正确?  详情 回复 发表于 2010-3-30 15:49
点赞 关注
 

回复
举报

2130

帖子

0

TA的资源

五彩晶圆(中级)

沙发
 
KEIL自带的启动代码很可靠,自动把一切都初始化,包括看门狗,因此不会发生PC跳转式软复位故障问题。
此帖出自单片机论坛
 
 

回复

6366

帖子

4929

TA的资源

版主

板凳
 
原帖由 leang521 于 2010-3-29 21:39 发表
KEIL自带的启动代码很可靠,自动把一切都初始化,包括看门狗,因此不会发生PC跳转式软复位故障问题。


会的,wo,
此帖出自单片机论坛
 
 
 

回复

2130

帖子

0

TA的资源

五彩晶圆(中级)

4
 
那故障会发生在哪里呢。以前真没遇到过
此帖出自单片机论坛
 
 
 

回复

6366

帖子

4929

TA的资源

版主

5
 
原帖由 leang521 于 2010-3-30 09:01 发表
那故障会发生在哪里呢。以前真没遇到过




晕,我的帖子怎么不完整呢,

前一段讨论过的那个,主程序里不加while死循环,程序就会一直复位
此帖出自单片机论坛
 
 
 

回复

2130

帖子

0

TA的资源

五彩晶圆(中级)

6
 
那不是主动的跳转,是被动的,主动跳转到00会有问题么,跳转不正确?
此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

开源项目 更多>>
    随便看看
    查找数据手册?

    EEWorld Datasheet 技术支持

    相关文章 更多>>
    关闭
    站长推荐上一条 1/10 下一条

     
    EEWorld订阅号

     
    EEWorld服务号

     
    汽车开发圈

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表