软件复位问题(跳转PC)

来源:本站
导读:目前正在解读《软件复位问题(跳转PC)》的相关信息,《软件复位问题(跳转PC)》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《软件复位问题(跳转PC)》的详细说明。
简介:深入讨论单片机软复位(PC跳转)。

#pragma asm

ljmp 0

#pragma endasm //C插入汇编实现

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

对函数指针熟悉吗?熟悉一切都容易了!

好书推荐《C陷阱与缺陷》《C专家编程》看看就上个档次就不是菜鸟了,呵呵

(*(void(*)())0) ();//就是它了!

晕了吗?没晕,不错不错,大哥,你扎这厉害呢!

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

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

有区别吗?看下面例子

#include<stdio.h>

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)》最后刷新时间 2024-03-14 01:07:44,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《软件复位问题(跳转PC)》该内容的真实性请自行鉴别。