软件复位问题(跳转PC)

发布者:码字探险最新更新时间:2016-07-01 来源: eefocus关键字:软件复位  跳转PC 手机看文章 扫描二维码
随时随地手机看文章
#pragma asm   
ljmp 0
#pragma endasm      //C插入汇编实现
深入--单片机软复位(PC跳转)

对函数指针熟悉吗?熟悉一切都容易了!
好书推荐《C陷阱与缺陷》《C专家编程》看看就上个档次就不是菜鸟了,呵呵

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

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

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

有区别吗?看下面例子

#include

void fun()
{
}

int main()
{
        printf("%p      %p      %p/n", &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跳转没遇到问题啊?大哥你扎这幸运呢!^_^)
 




 
上次搞一个51的IAP时,就是软件复位寄存器搞得不够彻底,导致程序运行一段时间后莫名其妙死掉...后来干脆不用软件去复位寄存器了,直接设置一个寄存器让系统复位(或者打开内狗),然后再判断该执行用户程序还是IAP程序,不再倒塌,问题解决...
当程序飞后,内部模块可能都乱了~~~
假定你根本未使用T2,那么你就不会考虑T2的初始化问题。
假定软件复位没进行ET2=0,TR2=0,且未未在T2Isr处加reti
则EA=1后,若跑飞时ET2=1,TR2=1,后果可知~~~
所以忠告大家:
初始化一定要彻底,一切系统资源都要初始化,哪怕未用!!!
有硬件看门狗时,最好while(1)自毁~~~
这样可对自己的有用模块再初始化,切记:所有中断向量表(程序)无用的都应该用reti.
关键字:软件复位  跳转PC 引用地址:软件复位问题(跳转PC)

上一篇:当主函数与中断函数共享变量问题
下一篇:单片机通过定时器来实现多任务

推荐阅读最新更新时间:2024-03-16 14:59

关于STM32软件复位代码编写
对于STM32来说软件复位有两种方式: 1)采用官方自带的软件库 在官方软件库的stm32f10x_nvic.c 文件里 直接提供了 系统复位的函数 /******************************************************************************* * Function Name : NVIC_GenerateSystemReset * Description : Generates a system reset. * Input : None * Output : None * Return : None ***********
[单片机]
STM8单片机软件判断复位
下面跟大家说一下STM32单片机的端口重映射,这里是以USART1的重映射为例. STM32上有很多I/O口,也有很多的内置外设想I2C,ADC,ISP,USART等,为了节省引出管脚,这些内置外设基本上是与I/O口共用管脚的,也就是I/O管脚的复用功能。但是STM32还有一特别之处就是:很多复用内置的外设的I/O引脚可以通过重映射功能,从不同的I/O管脚引出,即复用功能的引脚是可通过程序改变的. 三个红框交汇处.STM32F103VCT6 这个CPU的USART1接的是PB6/PB7 但是上电初始化后默认功能并非是USART1.所以想要用串口功能 .必须用端口重映射.. 大家知道,STM32的单片机每个功能模块有自己
[单片机]
STM8单片机<font color='red'>软件</font>判断<font color='red'>复位</font>源
浅谈单片机软件复位方法
有的单片机(如8098)有专门的复位指令,某些增强型MCS-51系统单片机虽然没有复位指令,但片内集成了WATCHDOG电路,故抗干扰也不成问题。而普及型MCS-51系列单片机(如8031和8032)既然无复位指令,又不带硬件WATCHDOS,如果没有外接硬件WATCHDOG电路,就必须采用软件抗干扰技术。常用的软件抗干扰技术有:软件陷阱、指令冗余、软件WATCHDOG等,它们的作用是在系统受干扰时能及时发现,再用软件的方法使系统复位。所谓软件复位就是用一系列指令来模仿复位操作,这就是MCS-51系列单片机所特有的软件复位技术。 现用一简单的实验说明,实验电路如附图所示。接于仿真插座P1.0的发光二极管LED0用来表示主程
[单片机]
浅谈单片机<font color='red'>软件</font><font color='red'>复位</font>方法
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved