使用C++在AURIX Development Studio裡開發TC275 - 新聞資(zī)訊 - 雲南小程序開發|雲南軟件開發|雲南網站(zhàn)建設-西山區知普網絡科技工作室

159-8711-8523

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

知識

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

您當前位置>首頁 » 新聞資(zī)訊 » 技術(shù)分享 >

使用C++在AURIX Development Studio裡開發TC275

發表時間:2020-10-19

發布人:葵宇科技

浏覽次數:119

背景:我自己有個(gè)庫 是用C++寫的,隻用了C with class,為的就是在單片機上用繼承的功能,編寫高質量的代碼。

以前在ARM單片機上面用的很好,現在要在TC275單片機(Tricore核心的單片機,就像STM32是ARM核心的單片機一樣)上跑。所以要搞一下(xià)Tricore C++

AURIX DS for Tricore是使用的免費的Tasking編譯器(qì),其實該編譯器(qì)是支持C++的。但是從啟動(dòng)文(wén)件來看 ,隻初始化了c環境的東西:bss data等段,通(tōng)過生成的elf 文(wén)件來看是生成了Cpp全局構造函數初始化的函數的。也就是說生成了類似的代碼:

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

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

如(rú)果我們能獲取到上面函數地址 ,我們手動(dòng)調用這些函數 那麼就可(kě)以完成C++的對象初始化。可(kě)悲的是,這些函數都生成在.text段下(xià)。沒法通(tōng)過鍊接腳本區分。。。

以我們換個(gè)思路(lù),既然Tasking編譯器(qì)生成的elf,在mian函數之前初始化了c環境,那麼是不是也有初始化c++的環境?我們看下(xià)bss和(hé)data段是怎麼初始化的:_START函數->_Core0_start函數->Ifx_C_Init函數->_c_init函數,執行完這個(gè)函數後,bss和(hé)data段全部就有效了。這個(gè)函數位于: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

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

那麼至于選擇哪個(gè)庫 可(kě)以斷定是選擇libcps_fpu.a,因為之前看過一篇tasking的文(wén)檔。這些庫帶x的是帶c++異常的,我不用他。所以選擇libcps_fpu.a

選好libcps_fpu.a後,我們要添加在編譯選項中(zhōng),在linker參數添加:-lcps_fpu

然後你(nǐ)在main函數一開始處添加_Z12__call_ctorsv的調用即可(kě)。

這裡我為什麼沒放到main開始處,因為我在做測試,實際應用中(zhōng)放到main函數的第一行,或者放到_c_init函數的後面

一切正常了!世界是多麼美好啊!

完畢。散花(huā)~~~

相關(guān)案例查看更多