使用C++在(zài)AURIX Development Studio裏開發TC275 - 新聞資訊 - 雲南小程序開發|雲南軟件開發|雲南網站建設-昆明融晨信息技術有限公司

159-8711-8523

雲南網建設/小程序開發/軟件開發

知識

不(bù)管是(shì)網站,軟件還是(shì)小程序,都要(yào / yāo)直接或間接能爲(wéi / wèi)您産生價值,我們在(zài)追求其視覺表現的(de)同時(shí),更側重于(yú)功能的(de)便捷,營銷的(de)便利,運營的(de)高效,讓網站成爲(wéi / wèi)營銷工具,讓軟件能切實提升企業内部管理水平和(hé / huò)效率。優秀的(de)程序爲(wéi / wèi)後期升級提供便捷的(de)支持!

您當前位置>首頁 » 新聞資訊 » 技術分享 >

使用C++在(zài)AURIX Development Studio裏開發TC275

發表時(shí)間:2020-10-19

發布人(rén):融晨科技

浏覽次數:190

背景:我自己有個(gè)庫 是(shì)用C++寫的(de),隻用了(le/liǎo)C with class,爲(wéi / wèi)的(de)就(jiù)是(shì)在(zài)單片機上(shàng)用繼承的(de)功能,編寫高質量的(de)代碼。

以(yǐ)前在(zài)ARM單片機上(shàng)面用的(de)很好,現在(zài)要(yào / yāo)在(zài)TC275單片機(Tricore核心的(de)單片機,就(jiù)像STM32是(shì)ARM核心的(de)單片機一樣)上(shàng)跑。所以(yǐ)要(yào / yāo)搞一下Tricore C++

AURIX DS for Tricore是(shì)使用的(de)免費的(de)Tasking編譯器,其實該編譯器是(shì)支持C++的(de)。但是(shì)從啓動文件來(lái)看 ,隻初始化了(le/liǎo)c環境的(de)東西:bss data等段,通過生成的(de)elf 文件來(lái)看是(shì)生成了(le/liǎo)Cpp全局構造函數初始化的(de)函數的(de)。也(yě)就(jiù)是(shì)說(shuō)生成了(le/liǎo)類似的(de)代碼:

//file1.cpp: 會生成下面這(zhè)樣一個(gè)函數(函數最後幾位是(shì)變化的(de),這(zhè)個(gè)我們不(bù)需要(yào / yāo)管):
void __sti___11_file1_cpp_ea7c0589(void)
{
    執行對象A的(de)構造函數(構造函數參數1,構造函數參數2,.....);//對象A是(shì)在(zài)file1.cpp中定義的(de)
    執行對象B的(de)構造函數(構造函數參數1,構造函數參數2,.....);//對象b是(shì)在(zài)file1.cpp中定義的(de)
}

//file2.cpp: 會生成下面這(zhè)樣一個(gè)函數:
void __sti___11_file2_cpp_77448855(void)
{
    執行對象C的(de)構造函數(構造函數參數1,構造函數參數2,.....);//對象c是(shì)在(zài)file2.cpp中定義的(de)
    執行對象C的(de)構造函數(構造函數參數1,構造函數參數2,.....);//對象d是(shì)在(zài)file2.cpp中定義的(de)
}

如果我們能獲取到(dào)上(shàng)面函數地(dì / de)址 ,我們手動調用這(zhè)些函數 那麽就(jiù)可以(yǐ)完成C++的(de)對象初始化。可悲的(de)是(shì),這(zhè)些函數都生成在(zài).text段下。沒法通過鏈接腳本區分。。。

以(yǐ)我們換個(gè)思路,既然Tasking編譯器生成的(de)elf,在(zài)mian函數之(zhī)前初始化了(le/liǎo)c環境,那麽是(shì)不(bù)是(shì)也(yě)有初始化c++的(de)環境?我們看下bss和(hé / huò)data段是(shì)怎麽初始化的(de):_START函數->_Core0_start函數->Ifx_C_Init函數->_c_init函數,執行完這(zhè)個(gè)函數後,bss和(hé / huò)data段全部就(jiù)有效了(le/liǎo)。這(zhè)個(gè)函數位于(yú):C:\Infineon\AURIX-Studio-1.2.0\plugins\com.infineon.aurix.tools_1.2.0\build_system\tools\Compilers\Tasking_1.1r4\ctc\lib\tc16x\libcs_fpu.a

這(zhè)裏拼人(rén)品的(de)時(shí)候到(dào)了(le/liǎo):我發現有很多的(de)lib ,我分析_fpu的(de)是(shì)使用硬件浮點,而(ér)275帶fpu,所以(yǐ)我應該選擇和(hé / huò)libcs_fpu.a一樣,選擇帶有_fpu.a的(de)庫,又C++ 這(zhè)個(gè)++的(de)英文單詞是(shì)plus ,所以(yǐ)我大(dà)概率推斷應該是(shì)libcps_fpu.a libcpsx_fpu.a libcpx_fpu.a 。這(zhè)些個(gè)庫中應該包含有C++全局對象初始化的(de)函數,經過反編譯查看,果然都有_Z12__call_ctorsv函數。

那麽至于(yú)選擇哪個(gè)庫 可以(yǐ)斷定是(shì)選擇libcps_fpu.a,因爲(wéi / wèi)之(zhī)前看過一篇tasking的(de)文檔。這(zhè)些庫帶x的(de)是(shì)帶c++異常的(de),我不(bù)用他(tā)。所以(yǐ)選擇libcps_fpu.a

選好libcps_fpu.a後,我們要(yào / yāo)添加在(zài)編譯選項中,在(zài)linker參數添加:-lcps_fpu

然後你在(zài)main函數一開始處添加_Z12__call_ctorsv的(de)調用即可。

這(zhè)裏我爲(wéi / wèi)什麽沒放到(dào)main開始處,因爲(wéi / wèi)我在(zài)做測試,實際應用中放到(dào)main函數的(de)第一行,或者放到(dào)_c_init函數的(de)後面

一切正常了(le/liǎo)!世界是(shì)多麽美好啊!

完畢。散花~~~

相關案例查看更多