《電子技術應用》
您所在的位置:首頁 > 可編程邏輯 > 業(yè)界動態(tài) > DSP編程技巧之:運行時模型以及鉤子函數(shù)與庫函數(shù)

DSP編程技巧之:運行時模型以及鉤子函數(shù)與庫函數(shù)

2015-09-18

  在前面幾期中,,我們了解到DSP編程技巧之:編譯流程與處理器選項,、程序優(yōu)化,、調(diào)試與路徑選項,、控制與語言選項以及預處理與診斷,,今天為大家講解運行時模型以及鉤子函數(shù)與庫函數(shù),。
  當我們在PC運行一些C/C++編寫程序的時候,,如果缺少必要的庫文件或者說一些dll文件之類的,,程序會崩潰并在各種崩潰聲音的提示下彈出一堆對話框,提示我們“run-time error”,,缺少xxxx運行庫文件等等,。那運行庫文件是做什么的呢?它里面主要包含了C/C++的庫函數(shù),編譯器內(nèi)建的一些功能函數(shù),、浮點數(shù)的算數(shù)運算函數(shù),,以及編譯器所支持的C語言中一些與I/O操作有關的函數(shù)等。在DSP中運行里面運行我們的程序時,,同樣需要相關的實時運行庫文件的支持;所以我們要配置一些相關的運行庫選項,,使得編譯器知道我們希望使用什么樣的方法來使用實時運行庫,這就是運行時模型(run-time error),,它主要定義了代碼在特定選項之下的運行方式,,這些選項如表1所示。
  鉤子函數(shù)(hook function)是在進入程序中的函數(shù)或者退出函數(shù)時調(diào)用的程序,。它們的用途包括:調(diào)試(debug),、跟蹤(trace)、評估(profile)以及堆棧溢出的檢測等,。我們可以通過表1中的選項對鉤子函數(shù)的使用進行控制,。
  DSP編程技巧之:運行時模型以及鉤子函數(shù)與庫函數(shù)

  關于鉤子函數(shù),在CCS的編譯器里還有以下的幾個規(guī)則可以補充說明一下:
  1. 使能鉤子函數(shù)選項的話,會默認使用表1中的定義方法創(chuàng)建鉤子函數(shù)的隱式聲明,。此時如果我們要聲明或者定義鉤子函數(shù)的功能的話,,必須與這個隱式聲明使用相同的定義方式。
  2. 在C++編程的時候,,鉤子函數(shù)被聲明為外部的C函數(shù),,這時候我們可以使用C語言或者匯編語言來編寫鉤子函數(shù)的程序,因為使用的是extern C的調(diào)用方法,,所以我們不用擔心會違反C++的函數(shù)名字改編(name mangling)規(guī)則而產(chǎn)生編譯錯誤,。
  3. 鉤子函數(shù)可以被聲明為inline內(nèi)聯(lián)類型的,此時編譯器把它們與其它的內(nèi)聯(lián)函數(shù)按照相同的規(guī)則進行處理,,例如函數(shù)優(yōu)化等選項對它們起相同的作用,。
  4. 入口鉤子函數(shù)和出口鉤子函數(shù)是互相獨立的,我們可以只使用它們中的一個,,或者同時使用它們,。
  5. 我們要避免對鉤子函數(shù)的遞歸調(diào)用,也就是說在鉤子函數(shù)中不要調(diào)用其它包含了對鉤子函數(shù)本身進行調(diào)用的函數(shù)(有點小拗口),。為了防止這種潛在bug的發(fā)生,,編譯器對鉤子函數(shù)的產(chǎn)生有一些限制,例如對于內(nèi)聯(lián)類型的函數(shù)或者鉤子函數(shù)本身,,我們都無法為它們產(chǎn)生一個鉤子函數(shù),。
  那如果在優(yōu)化選項的作用下,編譯器把某些函數(shù)自動優(yōu)化為內(nèi)聯(lián)函數(shù)的話,,我們已經(jīng)為它們產(chǎn)生的鉤子函數(shù)會不會導致錯誤呢?此時我們要使用--remove_hooks_when_inlining選項把編譯器自動內(nèi)聯(lián)的函數(shù)的入口/鉤子出口函數(shù)給優(yōu)化掉。
  6. 如果我們不希望產(chǎn)生鉤子函數(shù)的話,,在編程時可以直接使用與處理指令阻止產(chǎn)生鉤子函數(shù),。在C語言編程時,使用方法為#pragma NO_HOOKS ( func );
  在C++編程時,,使用方法#pragma NO_HOOKS;(話說C++的語法經(jīng)常比C的要簡短一些),。
  鉤子函數(shù)相關的控制選項并不多,不過其使用時的條條框框卻真不少,。下面我們換個輕松點的看看,,比如庫函數(shù)選項。庫函數(shù)一般是指編譯器提供的可在C/C++源程序中調(diào)用的函數(shù),??煞譃閮深悾活愂荂語言標準規(guī)定的庫函數(shù),,一類是編譯器特定的庫函數(shù),。庫中存放函數(shù)的名稱和對應的目標代碼,以及連接過程中所需的重定位信息,一般情況下廠家不會向我們開放庫函數(shù)的內(nèi)容,。當然,,在CCS編程中,如果我們我們需要分享某個功能給別人,,但是又不想讓他們知道函數(shù)的內(nèi)容,,也可以把我們的函數(shù)甚至程序封裝為一個庫函數(shù)(CCS一般情況下我們用它產(chǎn)生.out二進制文件,此外還可以產(chǎn)生.lib庫文件)就行了,。
  庫函數(shù)大家都不陌生,,比如在C2000 DSP的編程中,為了使用定點數(shù)學庫的相關函數(shù),,我們要把IQmath.lib加入到工程里;為了使用FPU相關的浮點函數(shù)庫,,我們需要調(diào)用C28x_FPU_Lib_Beta1.lib等。在CCS編譯環(huán)境下,,庫函數(shù)的相關選項并不多,,也不復雜,如表2,、表3所示,。
  DSP編程技巧之:運行時模型以及鉤子函數(shù)與庫函數(shù)
  在使用編譯器的--opt_level=3優(yōu)化級別(即-O3,文件級別的優(yōu)化)的情況下,,編譯器會對已知的庫函數(shù)利用已有的優(yōu)化規(guī)則直接輸出優(yōu)化結果,。但是如果我們對標準的庫函數(shù)進行重定義,即標準庫函數(shù)的定義發(fā)生了改變的話,,則對它的優(yōu)化將失效,。
  DSP編程技巧之:運行時模型以及鉤子函數(shù)與庫函數(shù)

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,,并不代表本網(wǎng)站贊同其觀點,。轉(zhuǎn)載的所有的文章、圖片,、音/視頻文件等資料的版權歸版權所有權人所有,。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認版權者。如涉及作品內(nèi)容,、版權和其它問題,,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,,避免給雙方造成不必要的經(jīng)濟損失,。聯(lián)系電話:010-82306118;郵箱:[email protected],。