您的位置 首页 国产IC

软件复位问题(跳转PC)

#pragmaasmljmp0#pragmaendasm//C插入汇编实现深入–单片机软复位(PC跳转)对函数指针熟悉吗?熟悉一切都容易了!好书推荐《C陷阱…

#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.

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/ic/276721.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部