函数指针的使用:使程序跳转到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并不是程序运行地址,而是它所指向的地方才是真正程序运行的地址