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

  • 相关阅读:
    二叉树的建立和遍历
    canvas基础入门(一)canvas的width、height于css样式中的宽高区别
    js实现放大镜效果
    ios中页面底部输入框,position:fixed元素的问题
    js input复选框选中父级同时子级也选中
    js apply和call
    javascript闭包理解
    vue.js vue-jsonp解决跨域问题
    vue.js请求数据(axios)
    vuex
  • 原文地址:https://www.cnblogs.com/wwjdwy/p/3079840.html
Copyright © 2020-2023  润新知