• AURIX TriCore C/C++ 混合编程


    AURIX TriCore C/C++ 混合编程

    AURIX™ Development Studio IDETriCore单片机架构下,写比较大型的工程时强烈需要C++的Class来支持面向对象的思路来组织代码,进行C和C++的混合编程。

    软件环境配置

    AURIX™ Development Studio IDE中,打开菜单:Project->Properties,然后右侧边栏选择C/C++ Build->Settings,然后在左侧Tool Settings标签页下选择TASKING C/C++ Compiler,修改Command,添加-lcpsx_fpu,例如:

    ${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT}  ${INPUTS}  -lcpsx_fpu -cs --dep-file="$(@:.src=.d)" --misrac-version=2012 -N0 -Z0 -Y0 2>&1;
    

    然后选择TASKING C/C++ Compiler->Language,修改C++ standards(如ISO C++ 14)

    应用,完成修改。

    然后我们找到代码文件/Libraries/infineon_libraries/Infra/Platform/Tricore/Compilers/ComplierTasking.c

    Ifx_C_Init函数里添加

    extern void _Z12__call_ctorsv(void);
    _Z12__call_ctorsv();
    

    例如:

    void Ifx_C_Init(void)
    {
        extern void _c_init(void);
    
        _c_init();                  /* initialize data */
    
        // 添加C++初始化
        extern void _Z12__call_ctorsv(void);
        _Z12__call_ctorsv();
    
    }
    

    保存,完成。

    代码组织结构

    在IDE中,右键添加.cpp.h文件

    /*
     * mycpp.h
     *
     */
    
    #ifndef USER_MYCPP_H_
    #define USER_MYCPP_H_
    
    #ifdef __cplusplus
     extern "C" {
    #endif
    
    int get_test_class_a(void);
    void set_test_class_a(int);
    
    #ifdef __cplusplus
     }
    #endif
    
    
    #endif /* USER_MYCPP_H_ */
    
    
    /*
     * mycpp.cpp
     *
     */
    
    #include "mycpp.h"
    
    class test_class
    {
        public:
            int a;
            int b;
    } t;
    
    extern "C" int get_test_class_a(){
        return t.a;
    }
    
    extern "C" void set_test_class_a(int a){
        t.a = a;
    }
    
    

    上述代码利用了extern "C"__cplusplus宏等技巧,先让C++和C分别编译文件,然后再让C链接到C++已经编译好的函数,这样就可以直接在其他.c里面调用.cpp里面的函数了。

    例如:

    #include "headfile.h"
    #pragma section all "cpu0_dsram"
    int core0_main(void)
    {
        get_clk();
    	IfxCpu_emitEvent(&g_cpuSyncEvent);
    	IfxCpu_waitEvent(&g_cpuSyncEvent, 0xFFFF);
        enableInterrupts();
        while (TRUE)
        {
            // 调用cpp函数
            set_test_class_a(get_test_class_a()+1);
            printf("%d\n", get_test_class_a());
            systick_delay_ms(STM0, 1000);
        }
    }
    
    #pragma section all restore
    

    另外对于函数我的建议是,写专门的函数让.c调用,不让.c接触到诸如class等C++语言特性的东西。当然也有方法可以让.c文件操作class,但是很麻烦,极简式从C调用C++类方法

    参考

    AURIX C/C++混合编程_大DDDDD的博客-CSDN博客_c/c++ 混合编程

  • 相关阅读:
    【转】进程间通信方式总结(windows 和linux)
    Python-Analysis-Malware
    现场取证之流量分析总结
    木马通信与防护墙穿透
    【PE结构】恶意代码数字签名验证
    32位与64位架构上的区别
    【API】网络编程模型、多线程
    【API】遍历进程的几种方式
    【病毒取样】取证分析之逆向服务器提权开启3389远程连接工具
    【CTF WEB】XSS-https://alf.nu/alert1
  • 原文地址:https://www.cnblogs.com/santiego/p/16249838.html
Copyright © 2020-2023  润新知