详解typedef void (*IapFun)(void);

admin 2022年5月15日01:53:25安全开发评论3 views993字阅读3分18秒阅读模式

来源:知乎



在开发stm32单片机IAP功能时,注意到单片机在接受到新固件后,跳转运行新固件的代码如下:

typedef void (*IapFun)(void);
jump2app = (iapfun) * (vu32 *)(appxaddr + 4); //用户代码区第二个字为程序开始地址(复位地址)
MSR_MSP(*(vu32 *)appxaddr); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
jump2app(); //跳转到APP.

对这段代码有种熟悉的陌生感,遂特此记录,以供日后察看.

typedef的意义

typedef int a[10];          // a 类型是 int[10];(存放int型数据的数组)
a arr; // 定义一个数组:int arr[3];

typedef void (*p)(void); //p 类型是void ( * )void
p A; //是指void(*A)(void);


语法上typedef属于存储类声明说明符。
a[10]不是int的别名,(*p)(void)不是void的别名。
上面的语句把a声明为具有10个int元素的数组的类型别名,p是一种函数指针的类型别名。

定义一个函数指针类型。
比如原函数是

 void   func(void);


那么定义的函数指针类型就是

typedef void (*Fun)(void);


然后用此类型生成一个指向函数的指针:

Fun func1;


当func1获取函数地址之后,那么你就可以向调用原函数那样来使用这个函数指针:

func1(void);

函数指针对象赋值用法

两种用法

typedef void (*IapFun)(void);  //定义函数指针
void func(void); //定义函数
IapFun fun = func; //为函数指针对象赋值
fun(); //这里的fun()其实就相当于跳转到了func()


typedef void (* IapFun)(void);          //定义函数指针
IapFun jump2app; //定义函数指针对象
jump2app=(IapFun) * (vu32*)(appxaddr+4); //为函数指针对象赋值 appxaddr为函数指针地址,例如0x08000000
jump2app(); //调用函数


‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧  END  ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧

详解typedef void (*IapFun)(void);


原文始发于微信公众号(汇编语言):详解typedef void (*IapFun)(void);

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年5月15日01:53:25
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  详解typedef void (*IapFun)(void); http://cn-sec.com/archives/1007899.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: