c/c++语言开发共享指向ROM中的function

我有微控制器,我正在与他合作。 调试时,必须调用ROM中硬编码的函数。 技术参考显示了如何执行此操作:

# define Device_cal (void(*)(void))0x3D7C80 

和调用过程看起来像这样:

 (*Device_cal)() 

我无法理解这里究竟发生了什么,所以我的问题是:它是如何工作的?

    #define导致(*Device_cal)()在编译之前立即扩展到此:

     (*(void(*)(void))0x3D7C80)() 

    void(*)(void)是一个函数指针的声明,它接受void并返回void类型。 (*())表示表达式中下一个标记的0x3D7C800x3D7C80 )。 因此,这要求将位置0x3D7C80处的数据视为一个函数。 final ()调用没有参数的函数。

    void (*) (void)是一种类型。 它是一个指向函数的指针,该函数不带参数并返回void

    (void(*)(void)) 0x3D7C800x3D7C80整数转换为此函数指针。

    (*Device_cal)()调用该函数。

    (Device_cal)()将完全相同。

    *Device_calDevice_cal周围的括号是必需的,否则对整数的*Device_cal Device_cal将不具有更高的优先级。

    好吧,你“定义”一个指向函数的指针,然后调用它。 void(*)(void)表示指向函数的指针,它不带参数,并返回void 。 如果将0x3D7C80转换为该类型并调用它,则基本上调用其地址为0x3D7C80的函数。

    这不是一个答案(已经令人满意地完成),但有些建议:

    我建议使用以下方法:

     typedef void (*tVOID_ROMFUNCTION_VOID)( void ) ; tVOID_ROMFUNCTION_VOID Device_cal = (tVOID_ROMFUNCTION_VOID)0x3D7C80 ; Device_cal() ; 

    这样,您可以在初始化时创建任意数量的全局函数指针,而调用看起来像普通的静态链接函数。 并且您可以避免同时混淆预处理器宏voodoo。

    通过创建具有不同签名的不同函数指针类型,编译器也可以为您执行一些参数类型检查。

    粘贴符号,在其中创建一个指向固定内存位置的函数的临时(未命名)指针,然后通过解除引用来调用它。

      以上就是c/c++开发分享指向ROM中的function相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/545084.html

      (0)
      上一篇 2021年1月10日
      下一篇 2021年1月10日

      精彩推荐