關於DSP/BIOS的筆記__IOS

來源:互聯網
上載者:User
這些是關於DSP/BIOS的筆記,注意是針對CCS3.0和DSP/BIOS 5.31的
1、  建立的platform必須存為platforms.tci而不是協助文檔裡說的某個特殊的名字
2、  線程與中斷(包括軟、硬中斷)之間不能使用semaphores來互動的傳遞資訊,因為在中斷中不能調用SEM_PEND這個函數;任務(task)線程若想終止中斷函數的運行,必須調用HWI_enable、HWI_disable、SWI_enable、SWI_disable這些函數。
3、  非強制中斷和任務(task)的主要區別是,非強制中斷不能暫停運行來等待某個條件達到要求再繼續運行。當非強制中斷被優先順序更高的中斷打斷時,它將停止運行並在需要時重新運行;而任務通常是在迴圈中運行並允許掛起。
4、  非強制中斷由相關函數觸發,例如SWI_post()。
5、  不能調用DSP/BIOS定義的MOD_F_這一類型的函數,例如CLK_F_isr,因為他們僅僅能作為定義的變數。
6、  使用者不能定義MOD_ 、MOD_F開頭的變數和函數名,這是系統保留的。
7、  在程式中使用DSP/BIOS定義的模組(module)的對象(object),要使用extern來說明,例如:extern LOG_obj trace
8、  在程式中必須包含<program>.cfg.h這個標頭檔,這是由DSP/BIOS自動產生的相關C標頭檔。
9、  靜態定義的對象(object)不能使用XXX_delete()這樣的函數來清除。
10、              絕大多數XXX_create()函數接收其被調用時的最後一個參數XXX_Attrs(注意字母的大小寫)作為其新定義的對象的屬性,當其為空白時則會按照預設屬性進行設定。
11、              可以在工程中的彙編檔案中使用一個_main函數來代替c檔案中的mian()函數。
12、              -u _symbol(例如 –u _malloc)通知連接器使用DSP/BIOS庫而不是運行支援庫(run time library)中的該函數。
13、              組合語言中,.asg與.set用法相似,二者區別是.set是將一個變數地定義為常數(並且不能再重新定義),而.asg是將一個字串定(包括常數)義為一個替代它的變數。
14、              由於main()函數沒有使能中斷,所以在這裡可以單獨使能某些中斷,但不能使用HWI_enable()來使能全部中斷。
15、              對於C5500系列DSP,允許軟體通過IVPD和IVPH兩個寄存器重新編寫中斷向量表的起始地址。如果要這樣做,必須在硬體啟動(hardware reset)之後將合適的地址值寫入這兩個寄存器然後進行軟體啟動(software reset)。 1、  對於C5500系列DSP,有三種棧模式(stack mode)可供選擇:C54X_TSK(預設模式)、USE_RETA、NO_RETA。若不使用預設模式則必須通過CCS的編譯工具正確的配置啟動向量(reset vector)的第28、29位。什麼時候使用哪種模式。
2、  可以-x來迫使連接器(linker)重新尋找庫檔案來找到第一次未能找到的函數。例如,C++中的new()和delete()函數不被DSP/BIOS庫所支援,在使用的時候可能產生一個串連錯誤,這時可以使用-x選項來避免這個錯誤。
3、  對於C55x和C6x系列DSP,所有的被DSP/BIOS調用的使用者函數都要遵守其相關的C編譯器的寄存器規則,無論是使用C還是彙編來編寫這些函數。
4、  由於main()函數執行的時候DSP/BIOS還沒有完全初始化完成,所以,在main()函數裡有相當一部分DSP/BIOS API函數不能調用。
其中,DSP/BIOS的初始化是由DSP_init和DSP_start兩部分組成的,在運行main()函數之前運行DSP_init,在之後運行DSP_start。
所以,在DSP_start當中進行初始化的模組,像中斷、定時器、調度(schdulers)等模組的相關函數就不能在main()中使用;而記憶體管理是在DSP_init中進行初始化的則可以,例如,動態分配記憶體(MEM_alloc、MEM_free)、動態產生和刪除模組對象(TSK_create、TSK_delete)。
5、  可以通過不使能GBL模組的全域屬性“Enable Real Time Analysis”來最佳化代碼量和執行速度。
6、  LOG對象的logtype屬性分為:fixed(固定)和circular(迴圈)兩種,其中,fixed表示當LOG對象的buffer儲存滿了資料以後則停止繼續儲存;circular表示當LOG對象的buffer儲存滿了以後自動覆蓋前面的內容,結果就是fixed對象所儲存的資料是第一次的資料而circularObject Storage Service的資料是最後一次對象的資料。
7、  LOG對象的buffer大小可以根據使用需要進行修改。例如,使用LOG_printf若是顯示足夠快,則將LOG對象buffer改小以後不會導致顯示左面的標號丟失則可以適當改小buffer。
8、  在使用DSP/BIOS架構的DSP工程中,CPU在工作時執行的是以下這些操作中的一種:
1)  硬體中斷服務程式
2)  軟體中斷服務或周期函數程式
3)  任務(task)函數
4)  在idle迴圈時的使用者定義的函數
5)  通過HST通道向主機傳輸資料
6)  將即時分析資料傳送到DSP/BIOS分析工具中 1、  可以通過給一個硬體中斷定義一個監視變數來跟蹤它被觸發的次數。DSP/BIOS會給每一個硬體中斷自動定義一個STS對象來。
2、  除了觀察硬體中斷和堆棧指標以外,還可以在硬體中斷時觀察任何一個寄存器和變數的情況。靜態對象在每次硬中斷時都會更新,這會耗費20到30個指令周期。
3、  觀察分配的堆棧是否超出的方法:
1)  在任一個硬體中斷函數設定中,使能implicit instrumentation。
2)  在HWI模組中選中該中斷對應的對象,設定其屬性為STS_delta(*addr)。
3)  在STS模組中找到該中斷相關的對象,設定其“prev”屬性為“0xBEEF”(5000和2800系列DSP)。
4)  載入並運行程式,使用Statistics View察看屬性的改變。
5)  任何超出堆棧的情況發生都會導致該對象出現非零值。
4、  可以通過設定來觀察定時器中斷的延遲,即中斷觸發標誌使能到第一條中斷指令之間的執行時間,具體設定見SPRU423F P84,5500系列DSP由於其定時器的訪問不在資料存放區空間,所以不能觀察。
5、  Kernel Object View不會通過idle線程自動更新,必須在斷點的時候或通過右鍵重新整理來更新其內容。
6、  Kernel Object View中的MEM選項主要是顯示heap的各種屬性。SPRU423F P93
7、  MADU:minimum addressable data unit,對於C5000系列DSP來說是16bit的word。
8、  基於DSP/BIOS架構的DSP軟體系統包括4中線程:硬體中斷(HWI,包括時鐘函數)、軟體中斷(SWI,包括周期(PRD)函數)、任務(TASK)、後台函數(IDL)。
9、  軟體中斷應當用於管理100ms或需要更多時間的事件。
10、              各種線程的選擇規則:
1)  HWI應該用於響應函數時間小於5ms,並且若不及時響應,其相關資料就有可能丟失的情況;SWI和TSK應當用於響應函數時間為100ms左右的情況。
2)  對於線程之間關係簡單的使用SWI,較複雜的使用TSK。TSK可以被掛起而SWI不能;SWI由於使用單獨的堆棧相對TSK更有記憶體使用量的效率。SWI在運行之前,其使用到的資料必須已經準備好,可以通過SWI對象的郵箱來通知它。
3)  IDL函數在系統不使用CPU的時候運行。
4)  CLK函數直接使用timer中斷觸發。基本的CLK函數:PRD_clock為周期函數產生一個tick,使用者可以增加運行在相同頻率的時鐘函數。由於這些函數時作為HWI來處理的,所以必須盡量減少已耗用時間。
PRD函數作為SWI處理,所有的PRD函數擁有相同的SWI優先順序 1、  可以通過HWI_disable、SWI_disable、TSK_disable等函數禁止這些線程的運行,並且噹噹前最高優先順序的線程是Task時,這個Task如果被阻塞(block),那麼將禁止其他的線程的運行。
2、  在使用HWI對象時,若其中斷處理函數使用C語言來編寫則一定不能使用interrupt關鍵字或INTERRUPT pragma,因為HWI對象調用的函數已經包含了這些功能。
3、  在SWI和TSK中可以通過調用HWI_disable()和HWI_enable()/HWI_restore()來禁止和使能HWI中斷函數。這些函數是通過操作INTM位來控制全域中斷。HWI_enable()函數是使能全域中斷,HWI_restore()函數是將調用HWI_disable()之前的值裝載進去。
4、  HWI產生時,需要在執行其ISR之前將它所用到的可能改變的寄存器保護起來,返回時要將這些值填寫回去。DSP/BIOS提供HWI_enter和HWI_exit宏來完成這兩種功能。
在使用C語言編寫ISR程式時,可以通過DSP/BIOS設定其HWI對象的屬性使用“HWI dispatcher”自動地完成這兩個步驟,也可以在自己的程式中調用HWI_enter和HWI_exit宏來完成這兩個功能。
5、  在DSP/BIOS架構下,若在處理中斷時不使用HWI dispatcher則應該調用中斷處理函數前後調用HWI_enter和HWI_exit進行相關處理。(SPRU423F example 4-3、4-4、4-5)
6、  非強制中斷(SWI)和基於一些類型的SWI指令是不一樣的,DSP/BIOS的SWI中斷是與DSP的類型無關的。SWI中斷是由類似SWI_post這樣的函數觸發的。SWI適合用於那些發生頻率較低的或對於即時性要求低於HWI中斷的任務。 1、  SWI可以由:SWI_andn
                        SWI_dec
                        SWI_inc
                        SWI_or
                        SWI_post
這些函數觸發。
2、  可以在HWI中觸發一個SWI,這個SWI要麼處於HWI_enter和HWI_exit之間,要麼由HWI_dispather調用。
3、  每一個SWI可以有兩個變數。
4、  動態定義SWI(調用SWI_create函數)只能是在task這一級,而不能在HWI和SWI中。
5、  SWI的優先順序0級最低,14級最高。
6、  系統堆棧(system stack)儲存了每一次SWI發生時需要儲存的寄存器內容,每增加一級SWI優先順序就會在其中分配一部分記憶體,所以,記憶體效率最高的用法是將所有的SWI設定為同一個優先順序,不過這是不可能的,所以應該盡量設定少的SWI優先順序來保證減少system stack的大小。
預設的system stack的大小是256words,可以通過設定.tcf檔案中MEM的屬性(點右鍵)改變,system stack的估計大小會顯示在.tcf檔案頂部的狀態列中。
7、  如果TSK管理器被使能,則在SWI模組中會有KNL_swi對象來管理task,而KNL_swi的SWI優先順序為最低:0級,其他的SWI對象不能被設定為這個最低的優先順序(0級)。
8、  相同優先順序的SWI的運行順序是不能設定的。
9、  當一個SWI的ISR程式從響應列表中移出的時候,它的mailbox的值會被重設為初始值(即在.tcf中設定的值);如果一個SWI的ISR程式在啟動並執行時候它被觸發,則該SWI的mailbox的值會被設定成這次觸發相關的值,但不會影響當前啟動並執行程式(包括在其中調用SWI_getmbox()時的傳回值)。
這就是說在一個SWI的ISR程式沒有完成時也能更新它的mailbox的值。 1、  觸發SWI的API函數有不同的功能:
1)如果SWI的ISR函數不論其是否在運行都必須對每次觸發都響應,則使用   SWI_inc函數。
2) SWI_andn(&swiHandle, data)可以檢驗其參數的data的某些位是否為“1”,是的話則運行ISR函數。
3)  SWI_or(&swiHandle, data)直接觸發ISR函數,在ISR程式中調用SWI_getmbox()函數得到data值,根據data的具體數值不同可以再使用switch-case語句運行不同的程式分支,注意,此前要在設定中將該SWI屬性中的mailbox參數設定為0,否則不能運行正確的程式分支。
4)        如果需要設定某一事件多次發生才觸發一次SWI的ISR函數則可以調用  SWI_dec()函數,這時,在SWI的該模組將其“mailbox”屬性設定為需要重複的次數,每調用一次SWI_dec()函數則該數字減少1,當減少到0的時候,運行ISR函數。
2、使用SWI的好處:
1)可以在所有HWI使能的時候運行。
例如,在一個HWI中定義一個共用資料結構,如要在一個task中改變它則要先禁止該HWI,這樣將會影響到系統的即時性;如果是在一個SWI中定義這個結構則不會存在這種問題。通常是將一個ISR分為兩個部分,需要嚴格遵守時間限制的放在HWI中,不那麼嚴格的放在SWI中。
2)  SWI可以調用一些函數而HWI不能。
因為在DSP/BIOS更新其內部資料結構時,SWI是不會啟動並執行。必須對限制哪些函數能在HWI中調用,哪些只能在SWI中調用非常熟悉。Functions Callable by Tasks, SWI Handlers, or Hardware ISRs in the TMS320 DSP/BIOS API Reference Guide for your platform that lists DSP/BIOS functions and the threads from which each function can be called.
SWI可以調用任何不會被阻塞的API函數,則任何能夠被阻塞的函數和調用這類函數的函數都不能被SWI調用。
3、當一個SWI中斷了另一個線程的時候,DSP/BIOS會自動儲存絕大部分的寄存器的值,所以不論是使用C或是彙編來編寫ISR程式都不必再儲存這些寄存器,當然,最保險的方法是在使用彙編的時候再將沒有儲存的寄存器儲存一下(對C54x來說是ar1、ar6和ar7)。對於HWI來說,必須使用HWI_enter和HWI_exit或是HWI dispatcher來儲存這些值。
Note:
An important side effect of SWI_disable is that task preemption is also
disabled. This is because DSP/BIOS uses software interrupts internally to
manage semaphores and clock ticks.
4、每一個task都有自己的堆棧來儲存其局部變數。可以在對象屬性中具體規定其堆棧的大小。
5、包含有semaphore、mailbox等資源的task不能被釋放,否則會導致錯誤。應該先釋放這些資源再釋放包含它們的task。
6、對於C55x DSP/BIOS將分配給task的記憶體平均分給系統和使用者。
7、如果希望一個task初始化以後不執行,等到需要時再運行,可以將它的優先順序設定為-1,再在程式中進行改變。
8、當一個task處於terminate態以後就不再運行。
9、一個task當其分配的堆棧不夠大時將佔用別的task的部分,這可能導致致命的錯誤,所以可以使用TSK_ceckstacks和TSK_stat來測試task的堆棧大小。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.