使用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ì)多麽美好啊!
完畢。散花~~~