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

  • 相关阅读:
    任务Task系列之Parallel的静态For,ForEach,Invoke方法
    任务Task系列之使用CancellationToken取消Task
    泛型基础
    串的两种模式匹配算法
    数据结构之串类型
    c#基础知识之设计类型
    挣脱
    数据结构之栈和队列
    数据结构之线性表
    NGUI背包系统
  • 原文地址:https://www.cnblogs.com/wwjdwy/p/3079840.html
Copyright © 2011-2022 走看看