函数指针的使用:使程序跳转到Flash指定位置

在学习原子的IAP实验,被一段跳转函数困惑

typedef  void (*iapfun)(void);    //定义一个函数类型的参数.

iapfun jump2app;

//跳转到应用程序段
//appxaddr:用户代码起始地址.
void iap_load_app(u32 appxaddr)
{
 if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法.
 {
  jump2app=(iapfun)*(vu32*)(appxaddr+4);  //用户代码区第二个字为程序开始地址(复位地址)  
  MSR_MSP(*(vu32*)appxaddr);     //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
  jump2app();         //跳转到APP.
 }
}

请教了好多人,找到一个答案:

typedef  void (*iapfun)(void); //定义一个函数类型,该函数无参数

iapfun jump2app; //定义一个函数类型指针。

u32 appxaddr=0xXXXX;//这句个地址应该是函数开头地址。

jump2app=(iapfun)*(vu32*)(appxaddr+4); //将地址+4的位置赋值给函数指针,为什么+4不知道

jump2app();//函数指针指向appxaddr+4,指针是函数类型,编译器自动把她当做函数,所以调用这句话后会执行appxaddr+4的代码

所以做了个空函数就是为了程序执行appxaddr+4的代码

又请教了一下:

void (*iapfun)(void);
iapfun=(void (*)(void))(appxaddr+4);
iapfun()

这样可能简单一点,自己还没验证,朋友测完说是没问题。

思路值得学习,对函数指针又多点了解,不过还是很模糊的感觉

自己调试发现一些问题,iapfun=(void (*)(void))(appxaddr+4);不能运行,

可以运行的方式:        void (*appstart)(void);  

                                appstart=(void (*)(void))(appxaddr+165);  

                                 appstart(); 

或者 appstart=(void (*)(void))*(vu32*)(appxaddr+4);

看来*(vu32*)很有用处,自己认为appxaddr+4并不是程序运行地址,而是它所指向的地方才是真正程序运行的地址

原文地址:https://www.cnblogs.com/wwjdwy/p/3079840.html