版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、評(píng)語(yǔ)學(xué)號(hào) 成績(jī) DSP技術(shù)課程論文 題目 CCS中DSP/BIOS工具的使用 作 者 班 級(jí) _ 院 別 專(zhuān) 業(yè) _ 完成時(shí)間 目錄一、 DSP/BIOS簡(jiǎn)介1二、 DSP/BIOS的組件構(gòu)成1三、DSP/BIOS的啟動(dòng)順序 2四、DSP/BIOS的配置 2五、基礎(chǔ)類(lèi)的DSP/BIOS API調(diào)用15六、DSPBIOS的中斷、優(yōu)先級(jí) 22七、參考文獻(xiàn) 2323摘要:DSP/BIOS的靜態(tài)配置是利用CCS提供的配置工具完成,包括圖形化配置工具和文本配置工具。圖形化工具層次清晰,比較直觀,而文本工具更加靈活。一、 DSP/BIOS簡(jiǎn)介DSP/BIOS是CCS中集成的一個(gè)簡(jiǎn)易的嵌入式實(shí)時(shí)操作系統(tǒng),能
2、夠大大方便用戶(hù)編寫(xiě)多任務(wù)應(yīng)用程序。DSP/BIOS擁有很多實(shí)時(shí)嵌入式操作系統(tǒng)的功能,如任務(wù)的調(diào)度,任務(wù)間的同步和通信,內(nèi)存管理,實(shí)時(shí)時(shí)鐘管理,中斷服務(wù)管理等。有了它,用戶(hù)可以編寫(xiě)復(fù)雜的多線程程序,并且會(huì)占用更少的CPU和內(nèi)存資源。DSP/BIOS是一個(gè)可用于實(shí)時(shí)調(diào)度、同步,主機(jī)和目標(biāo)機(jī)通信,以及實(shí)時(shí)分析系統(tǒng)上的一個(gè)可裁減實(shí)時(shí)內(nèi)核,它提供了搶占式的多任務(wù)調(diào)度,對(duì)硬件的及時(shí)反應(yīng),實(shí)時(shí)分析和配置工具等。同時(shí)提供標(biāo)準(zhǔn)的API接口,易于使用。它是TI的eXpressDSP實(shí)時(shí)軟件技術(shù)的的一個(gè)關(guān)鍵部分。 二、 DSP/BIOS的組件構(gòu)成DSP/BIOS在一個(gè)主機(jī)/目標(biāo)機(jī)環(huán)境中的組件分布如下所示:
3、Ø DSP/BIOS API:編寫(xiě)的程序可以調(diào)用API接口函數(shù);Ø DSP/BIOS配置:創(chuàng)建的配置文件定義了程序使用的靜態(tài)BIOS對(duì)象;Ø DSP/BIOS分析工具:集成在CCS上的一些BIOS分析工具可以對(duì)運(yùn)行與目標(biāo)設(shè)備上的程序進(jìn)行監(jiān)測(cè),包括CPU負(fù)載、時(shí)間、日志、線程執(zhí)行狀態(tài)等。 DSP/BIOS分為很多模塊,提供的所有API函數(shù)都按照模塊分類(lèi),以模塊名加下劃線開(kāi)頭來(lái)命名,如圖 40所示為DSP/BIOS的全部模塊。圖 40 三、DSP/BIOS的啟動(dòng)順序當(dāng)DSP/BIOS的應(yīng)用程序啟動(dòng)時(shí),一般遵循下面的步驟:(一)
4、初始化DSP:DSP/BIOS程序從C/C+環(huán)境入口c_int00開(kāi)始運(yùn)行。對(duì)于C6000平臺(tái),在c_int00開(kāi)始處,系統(tǒng)棧指針(B15)和全局頁(yè)指針(B14)被分別設(shè)置在堆棧斷的末尾和.bss斷的開(kāi)始??刂萍拇嫫鰽MR、IER、CSR等被初始化;(二) 初始化.bss段:當(dāng)堆棧被設(shè)置完成后,初始化任務(wù)被調(diào)用,利用.cinit的記錄對(duì).bss斷的變量進(jìn)行初始化;(三) 調(diào)用BIOS_init初始化用到的各個(gè)模塊:BIOS_init調(diào)用MOD_init對(duì)配置用到的各個(gè)模塊進(jìn)行初始化,包括HWI_init、HST_init、IDL_init等;(四) 處理.pinit表:.pinit表包含一些指
5、向初始化函數(shù)的指針,對(duì)C+程序,全局對(duì)象類(lèi)的創(chuàng)建也在此時(shí)完成;(五) 調(diào)用用戶(hù)程序的main函數(shù):用戶(hù)main函數(shù)可以是C/C+函數(shù)或者匯編語(yǔ)言函數(shù),對(duì)于匯編函數(shù),使用_main的函數(shù)名。由于此時(shí)的硬件、軟件中斷還沒(méi)有被使能,所以在用戶(hù)主函數(shù)的初始化中需要注意,可以使能單獨(dú)的中斷屏蔽位,但是不能調(diào)用類(lèi)似HWI_enable的接口來(lái)使能全局中斷;(六) 調(diào)用BIOS_start啟動(dòng)DSP/BIOS:BIOS_start在用戶(hù)main函數(shù)退出后被調(diào)用,它負(fù)責(zé)使能使用的各個(gè)模塊并調(diào)用MOD_startup啟動(dòng)每個(gè)模塊。包括CLK_startup、PIP_startup、SWI_startup、HWI
6、_startup等。當(dāng)TSK管理模塊在配置中被使用時(shí),TSK_startup被執(zhí)行,并且BIOS_start將不會(huì)結(jié)束返回;(七)執(zhí)行idle循環(huán):有兩種方式進(jìn)入idle循環(huán)。當(dāng)TSK管理模塊使能時(shí),任務(wù)調(diào)度器運(yùn)行的TSK_idle任務(wù)調(diào)用IDL_loop在其它任務(wù)空閑時(shí)進(jìn)入idle循環(huán);當(dāng)TSK模塊未被使用時(shí),BIOS_start調(diào)用將返回,并執(zhí)行IDL_loop進(jìn)入永久的idle循環(huán),此時(shí)硬件和軟件中斷可以搶占idle循環(huán)得到執(zhí)行。由于idle循環(huán)中管理和主機(jī)的通信,因此主機(jī)和目標(biāo)機(jī)之間的數(shù)據(jù)交互可以進(jìn)行了。 四、DSP/BIOS的配置DSP/BIOS的靜態(tài)配置是利用CCS提供的
7、配置工具完成,包括圖形化配置工具和文本配置工具。圖形化工具層次清晰,比較直觀,而文本工具更加靈活。通常使用圖形化的配置方法,下面對(duì)主要的模塊配置做一些介紹。(一) Global Setting Properties右鍵點(diǎn)擊“Global Settings”,點(diǎn)擊“Whats This”,會(huì)彈出幫助窗口,該文件中有Global Setting Properties的各項(xiàng)設(shè)置說(shuō)明。下面介紹的其他如MEM、LOG等配置都可以用同樣的方法得到相應(yīng)的幫助。選擇彈出菜單中的“Properties”,如圖 41所示。圖 41彈出如圖 42所示對(duì)話框:圖 42一般選擇默
8、認(rèn)設(shè)置即可,CLKOUT項(xiàng)需要根據(jù)DSP硬件單板提供的工作時(shí)鐘設(shè)置,Himalaya通常運(yùn)行在1GHz頻率。DSP Endian Mode 項(xiàng)根據(jù)實(shí)際情況設(shè)置。 (二) MEM設(shè)置MEM模塊設(shè)置中可以根據(jù)具體情況設(shè)置不同的內(nèi)存段,其中存在一個(gè)默認(rèn)的IRAM片內(nèi)內(nèi)存段。需要注意的是,首先必須在IRAM段上設(shè)置一個(gè)heap段落,用于BIOS的內(nèi)部使用。設(shè)置方法是在IRAM段上右鍵選擇“Properties”,彈出如圖 43對(duì)話框,必須設(shè)置紅線框中的選項(xiàng),heap size可根據(jù)情況具體設(shè)置。圖 43接下來(lái)配置MEM全局屬性,右鍵點(diǎn)擊配置窗口中的“MEM”,如
9、圖 44所示:圖 44點(diǎn)擊“Properties”,彈出如圖 45所示窗口:圖 45如圖紅線框中,兩個(gè)heap段都要選擇為IRAM,“Stack Size”項(xiàng)需要根據(jù)實(shí)際情況設(shè)置最大的棧大小,其他使用缺省設(shè)置即可。在圖 44的菜單中,點(diǎn)擊“Insert MEM”可創(chuàng)建新的內(nèi)存段。在新的內(nèi)存段名上右鍵選擇“Properties”彈出如圖 43窗口,根據(jù)情況設(shè)置base(基地址)、len(段長(zhǎng)度)、heap size(用于MEM動(dòng)態(tài)內(nèi)存分配的堆大小)。 (三) LOG設(shè)置LOG用于輸出和記錄一些打印信息,默認(rèn)存在一個(gè)LOG_sy
10、stem對(duì)象,是系統(tǒng)內(nèi)部用來(lái)處理打印信息的,不需要去設(shè)置??梢栽黾有碌腖OG對(duì)象,用來(lái)在應(yīng)用程序中輸出打印信息。如圖 46,在LOG標(biāo)簽上右鍵選擇“Insert LOG”,填寫(xiě)對(duì)象名LOG_test即建立了一個(gè)新的LOG對(duì)象。圖 46在LOG_test標(biāo)簽上右鍵選擇“Properties”,彈出如圖 47窗口,可對(duì)此LOG對(duì)象屬性作一些設(shè)置。具體設(shè)置含義可通過(guò)Help查看。圖 47 (四) CLK設(shè)置在CLK屬性中通常選擇定時(shí)器Timer0作為DSP/BIOS的基準(zhǔn)時(shí)鐘,計(jì)時(shí)分辯率設(shè)置為每秒1000次中斷,在1GHz系統(tǒng)時(shí)鐘下,近似為
11、每次定時(shí)中斷間隔999.996微秒。Timer Mode選擇為32bit unchained模式,即使用TCI6482的TMR0的TIMLO作為T(mén)imer0,而TIMHI還可以作其它用途使用。CLK屬性配置界面如圖 48所示:圖 48 (五) HWI設(shè)置HWI(硬中斷)中包含HWI_INT4到HWI_INT15可用來(lái)定義用戶(hù)自己的硬件中斷,HWI_RESET、HWI_NMI和HWI_RESERVED不要去改動(dòng)。如圖 49,每個(gè)硬HWI的優(yōu)先級(jí)從上到下逐漸降低。圖 49選擇HWI_INT10為例,來(lái)設(shè)置EMAC/MDIO的中斷,需要填寫(xiě)中斷事件號(hào)
12、17,并且填寫(xiě)中斷服務(wù)程序名(C函數(shù)前面需要加下劃線)如圖50所示:圖 50在Dispatcher頁(yè)面,選擇“Use Dispatcher”由BIOS代理控制中斷的確認(rèn)和清除,不需要用戶(hù)中斷服務(wù)程序干預(yù),比較簡(jiǎn)便。如圖51:圖 51 (六) SWI設(shè)置SWI(軟中斷)的優(yōu)先級(jí)在HWI之后,但是比TSK高,可以通過(guò)右鍵菜單中的“Insert SWI”創(chuàng)建一個(gè)SWI對(duì)象,可以指定SWI內(nèi)部?jī)?yōu)先級(jí),從0(最低)到14(最高)。如圖 52:圖 52(七) TSK設(shè)置在TSK Manager(任務(wù)管理器)中可以根據(jù)需要?jiǎng)?chuàng)建各種任務(wù)
13、,任務(wù)間是根據(jù)優(yōu)先級(jí)搶占策略來(lái)進(jìn)行調(diào)度的,TSK提供有多種優(yōu)先級(jí)別,包括-1(Suspend)、0(Idle)、1(最低)到15(最高)。如圖 53:圖 53在TSK Manager上右鍵選擇“Insert TSK”并填寫(xiě)任務(wù)名稱(chēng)后就可以創(chuàng)建一個(gè)任務(wù),在相應(yīng)任務(wù)上右鍵選擇“Properties”可對(duì)任務(wù)屬性進(jìn)行設(shè)置,如圖 54:圖 54Stack Size(最大堆棧大?。┖蚉riority(優(yōu)先級(jí))需要根據(jù)任務(wù)的具體情況進(jìn)行設(shè)置。在頁(yè)面,填寫(xiě)任務(wù)實(shí)體函數(shù)名(C函數(shù)前面加一個(gè)下劃線),如圖 55:圖 55
14、0;(八) Synchronization設(shè)置DSP/BIOS中任務(wù)間的通信和同步可由SEM、MBX、QUE、LCK四個(gè)模塊完成:Ø SEM(信號(hào)量):用于任務(wù)同步和互斥,有計(jì)數(shù)功能,根據(jù)需要使用;Ø MBX(郵箱):也用于任務(wù)同步,可以傳遞少量數(shù)據(jù),根據(jù)需要使用;Ø QUE(隊(duì)列):可實(shí)現(xiàn)任務(wù)同步和資源的共享,根據(jù)需要使用;Ø LCK(資源鎖):實(shí)現(xiàn)對(duì)共享資源的互斥,根據(jù)需要使用。四種同步模塊對(duì)象都可以通過(guò)各自的右鍵菜單中“Insert ”來(lái)創(chuàng)建,并可對(duì)其屬性作相應(yīng)的設(shè)置。如圖 56所示:圖 56 (九) Input/Ou
15、tput設(shè)置這里可以設(shè)置一些輸入/輸出相關(guān)的高級(jí)設(shè)置,具體可通過(guò)CCS的幫助項(xiàng)來(lái)了解。一般不需要進(jìn)行設(shè)置。只有RTDX(實(shí)時(shí)數(shù)據(jù)交換),需要根據(jù)目標(biāo)環(huán)境的情況對(duì)數(shù)據(jù)交換模式進(jìn)行一下選擇,用來(lái)在調(diào)試中主機(jī)和目標(biāo)機(jī)進(jìn)行數(shù)據(jù)交換??梢允欠抡嫫鳝h(huán)境的JTAG模式,或者是模擬器環(huán)境的Simulator模式。如圖 57所示:五、基礎(chǔ)類(lèi)的DSP/BIOS API調(diào)用(一)時(shí)鐘管理CLK1.Uns ncounts = CLK_countspms(void) 返回每毫秒的定時(shí)器高分辨率時(shí)鐘的計(jì)數(shù)值2.LgUns currtime = CLK_gethtim
16、e(void) 返回高分辨率時(shí)鐘的計(jì)數(shù)值 超過(guò)32bit歸零 高分辨率時(shí)鐘是DSP時(shí)鐘除以(TDDR+1)3.LgUns currtime = CLK_getltime(void) 返回低分辨率時(shí)鐘的計(jì)數(shù)值 超過(guò)32bit歸零 高分辨率時(shí)鐘是DSP時(shí)鐘除以(TDDR+1)再除以(PRD+1)4.Uns period = CLK_getprd(void) 返回CLK管理器周期寄存器的值 (二)周期函數(shù)PRD1.LgUns num
17、 = PRD_getticks(void) 返回32位周期函數(shù)管理計(jì)數(shù)值2.void PRD_start(PRD_Obj* period) 啟動(dòng)PRD模塊計(jì)數(shù)器,一般地,mode=one-shot3.void PRD_stop(PRD_Obj* period) 關(guān)閉PRD模塊計(jì)數(shù)器4.void PRD_tick(void) 對(duì)周期模塊的計(jì)數(shù)器加1,以便周期模塊管理器確定哪個(gè)周期性函數(shù)得以運(yùn)行 (三)軟件中斷管理SWI1.void SWI_andn(SWI_Obj* swi,
18、Uns mask) mask 屏蔽字參數(shù) 將郵箱值與mask做與運(yùn)算,并用結(jié)果代替以前的郵箱值,若為0,啟動(dòng)軟件中斷,恢復(fù)郵箱初始值2.void SWI_andn(SWI_Obj* swi) 將郵箱值減1,并用結(jié)果代替以前的郵箱值,若為0,啟動(dòng)軟件中斷,恢復(fù)郵箱初始值3.void SWI_disable(Void) 禁止軟件中斷4.void SWI_enable(Void) 使能軟件中斷5.Uns num = SWI_getmbox(void) 返回當(dāng)前SWI對(duì)象
19、在被執(zhí)行的郵箱值,若中斷已經(jīng)開(kāi)始執(zhí)行,DSP/BIOS會(huì)先保存此值6.Uns key = SWI_getpri(SWI_Obj * swi) 返回指定的SWI對(duì)象的優(yōu)先級(jí)7.void SWI_inc(SWI_Obj * swi) 將指定的SWI對(duì)象的郵箱值加1,同時(shí)啟動(dòng)軟件中斷,就算用戶(hù)調(diào)用多次,最終執(zhí)行一次。8.void SWI_or(SWI_Obj* swi, Uns mask) mask 屏蔽字參數(shù) 將啟動(dòng)指定的軟件中斷,并將此軟件中斷的郵箱值與mask做與運(yùn)算,并用結(jié)果代替以前的郵箱值,等到中斷完成
20、之后,郵箱值恢復(fù)為初始值,一般地,調(diào)用SWI_getmbox獲得觸發(fā)此軟件中斷的郵箱值9.void SWI_post(SWI_Handle swi) 啟動(dòng)指定的SWI對(duì)象的軟件中斷,此函數(shù)不受郵箱值的影響,也不影響郵箱值。一般地,周期性低啟動(dòng)一個(gè)軟件中斷,將_SWI_post填入PRD對(duì)象的函數(shù)設(shè)置欄,啟動(dòng)軟件中斷的參數(shù)寫(xiě)入arg010.Uns key = SWI_raisepri(Uns mask) 提高SWI軟件中斷的優(yōu)先級(jí),一般地 key = SWI_raisepri(SWI_getpri(&swi_1);
21、0; -access shared resouces- SWI_restorepri(key)11.void SWI_restorepri(Uns key) 恢復(fù)原來(lái)的優(yōu)先級(jí)12.SWI_Obj * swi = SWI_self(void) 當(dāng)前執(zhí)行的SWI對(duì)象的軟件中斷的地址 (四)信息輸出管理LOG1.void LOG_disable(LOG_Obj * log) 關(guān)閉指定對(duì)向的日志功能2.void LOG_enable(LOG_Obj * log)
22、;開(kāi)啟指定對(duì)向的日志功能3.void LOG_error(String format, Arg arg0) void LOG_message(String format, Arg arg0) 前一個(gè)函數(shù)可以將一個(gè)事件、數(shù)據(jù)或出錯(cuò)信息按照指定的格式串寫(xiě)入系統(tǒng)日志,不受TRC跟蹤管理模塊的影響,后一個(gè)函數(shù)類(lèi)似于前一個(gè)函數(shù),但是受到TRC跟蹤管理模塊的影響4.void LOG_event(LOG_Obj * log, Arg arg0, Arg arg1, Arg arg2) 將未格式化的事件消息寫(xiě)入日志中5.void LOG_pri
23、ntf(LOG_Obj * log, String format, int arg0, int arg1) 指定的LOG窗口顯示消息 %d %x %o %s6.void LOG_reset(LOG_Obj * log) 復(fù)位日志緩沖區(qū) (五)存儲(chǔ)器管理MEM1.void * addr = MEM_alloc(int segid,Uns size,Uns align) 指定存儲(chǔ)段分配連續(xù)塊,返回起始地址 segid = 存儲(chǔ)段的標(biāo)識(shí)符或者ID號(hào) size 塊大小 等
24、于多少個(gè)字 align 邊界條件 只為0或2的冪 若align為0、1 則無(wú)約束2.void * addr = MEM_calloc(segid, size, align) 分配內(nèi)存并初始化為03.int segid = MEM_define(Ptr base, Uns length, MEM_Attrs* attrs) 定義一個(gè)新的存儲(chǔ)段。返回值為存儲(chǔ)段的ID標(biāo)號(hào),attr參數(shù)為NULL,會(huì)按照默認(rèn)參數(shù)進(jìn)行配置,段的參數(shù)由結(jié)構(gòu)體type MEM_Attrs規(guī)定,此函數(shù)僅在main函數(shù)中使用 base: 新
25、段的基地址 length:段長(zhǎng)度 attrs:段屬性4.bool status = MEM_free(segid,addr,size) 釋放申請(qǐng)的動(dòng)態(tài)內(nèi)存 不能在SWI和HWI中調(diào)用,調(diào)用之前,用LCK中API查看內(nèi)存塊的鎖定情況5.void MEM_redefine(segid,base,length) 重新定義一個(gè)存儲(chǔ)段,只能在main中調(diào)用6.bool status = MEM_stat(int segid, MEM_Stat * statbuf) segid 存儲(chǔ)段標(biāo)識(shí)符
26、60; statbuf 狀態(tài)緩存區(qū)指針 struct mem_stat Uns size;/存儲(chǔ)段大小 Uns used;/已經(jīng)使用的數(shù)量 Uns length;/最大連續(xù)存儲(chǔ)塊長(zhǎng)度 同理:若segid有效,則MEM_stat返回TRUE 不能在SWI和HWI中使用,應(yīng)判斷鎖定情況7.void * addr = MEM_valloc(int segid, Uns size, Uns align, char value) 先申請(qǐng)內(nèi)存,初始化為指
27、定的值value(六)C6000專(zhuān)用模塊C64x1.Uns oldmask = C64_diableIER(Uns mask) 關(guān)閉相應(yīng)的中斷 返回值實(shí)際屏蔽的中斷2.void C64_enableIER(Uns oldmask) 開(kāi)放相應(yīng)的中斷 Uns oldmask; oldmask = C64_disableIER(0x1); / disable INT0 C64_enableIER(oldmask);
28、60;/ enable INT03.void C64_plug(int vecid, Fxn fxn, int dmachan) 插入一個(gè)中斷向量 int vecid: 中斷序號(hào) Fxn fxn: 中斷服務(wù)程序的函數(shù)指針 int dmachan: 插入操作使用的DMA通道 將ISFP寫(xiě)到中斷服務(wù)表IST中。若IST在外部RAM,則CPU復(fù)制代替DMA,此時(shí)DMA為-1 IST在片內(nèi)RAM時(shí),使用DMA方式,是0,1,2,3 用戶(hù)保證在函數(shù)調(diào)用時(shí)該DMA通道有效
29、160; (七)統(tǒng)計(jì)模塊STS1.void STS_add(STS_Obj * sts, LgInt value) 使用我們提供的數(shù)據(jù)更新STS統(tǒng)計(jì)對(duì)象的Total,Count,Max等參數(shù) 傳入一個(gè)32位參數(shù),Count加1,Total累加傳遞的32位參數(shù),MAX記錄傳遞參數(shù)的最大值2.void STS_delta(STA_Obj * sts, LgInt value) 每個(gè)對(duì)象都包含有初始值,該初始值由配置文件指定或者由STS_set函數(shù)設(shè)置 STS_delta先計(jì)算當(dāng)前傳遞參數(shù)與先前初始值只
30、差,然后調(diào)用STS_add更新統(tǒng)計(jì)累加值 一般和STS_set一起用 eg: STS_set(&sts,CLK_gethtime(); STS_delta(&sts,CLK_gethtime();3.void STS_reset(STS_Obj * sts) 復(fù)位統(tǒng)計(jì)對(duì)象中的累加值。Count和Total設(shè)置為0.MAX成為最大的負(fù)值。 4.void STS_set(STS_Obj * sts, LgInt value)
31、160; 監(jiān)視或統(tǒng)計(jì)程序的執(zhí)行時(shí)間(八)統(tǒng)計(jì)類(lèi)模塊TRC1.TRC_LOGCLK 日志記錄定時(shí)器中斷2.TRC_LOGPRD 日志記錄周期時(shí)隙和周期函數(shù)的開(kāi)始3.TRC_LOGSWI 日志記錄軟件中斷的啟動(dòng)和完成4.TRC_LOGTSK 日志記錄任務(wù)處于準(zhǔn)備好、開(kāi)始、停止、繼續(xù)執(zhí)行、終止等事件5.TRC_STSHWI 收集關(guān)于HWI統(tǒng)計(jì)數(shù)據(jù)6.TRC_STSPIP 寫(xiě)管道和讀管道幀進(jìn)行計(jì)數(shù)7.TRC_STSPRD 執(zhí)行期間CLK時(shí)隙個(gè)數(shù)的統(tǒng)計(jì)數(shù)據(jù)8.TRC_STSSWI SWI執(zhí)行時(shí)間的統(tǒng)計(jì)數(shù)據(jù)9.TRC_STSTSK TSK執(zhí)行時(shí)間的統(tǒng)計(jì)數(shù)據(jù) 從TSK準(zhǔn)備好到調(diào)用TSK delta
32、time都要收集10.TRC_USER0 AND TRC_USER1 和TRC_query一起用 執(zhí)行和忽略結(jié)果的設(shè)備調(diào)用11.TRC_GBLHOST 執(zhí)行所有的隱藏儀器功能,此比特位能夠開(kāi)始或停止收集所有開(kāi)啟的跟蹤類(lèi)型12.TRC_GBLTARG 執(zhí)行所有的隱藏儀器功能,此比特位只能被目標(biāo)程序設(shè)置(九)任務(wù)管理 TSK任務(wù)管理模塊1. void TSK_checkstacks(TSK_Handle oldtask,TSK_Handle newtask) 無(wú)論是新任務(wù)還是老任務(wù),如果堆棧的最后位置上都沒(méi)有RG_STACKSTAMP標(biāo)識(shí),那么TSK_checkstacks就
33、會(huì) 報(bào)錯(cuò)SYS_abort,出現(xiàn)這種情況可能是由于上一個(gè)任務(wù)堆棧溢出或無(wú)效的存儲(chǔ)占用了新任務(wù)的堆棧 一般地,用TSK_checkstacks(TSK_self(),TSK_self()來(lái)檢查堆棧 定義Switch函數(shù),這樣在任務(wù)切換時(shí)自動(dòng)調(diào)用堆棧檢查函數(shù): void myswitchfxn(TSK_Handle oldtask, TSK_Handle newtask) . TSK_
34、checkstacks(oldtask,newtask); . 2. TSK_Handle task = TSK_create(Fxn fxn, TSK_Attrs * attr, Arg arg,.) 創(chuàng)建一個(gè)調(diào)用函數(shù)fxn的任務(wù)對(duì)象,返回新對(duì)象的句柄,失敗返回NULL。 調(diào)用此函數(shù)是動(dòng)態(tài)創(chuàng)建,而在配置工具中創(chuàng)建是靜態(tài)創(chuàng)建,二者效果一樣。 靜態(tài)創(chuàng)建的任務(wù)對(duì)象,創(chuàng)建函數(shù)將在BIOS_start函數(shù)中自動(dòng)調(diào)用。BIOS_start函數(shù)在main函數(shù)之后,
35、;在后臺(tái)IDL循環(huán)之前運(yùn)行。而動(dòng)態(tài)創(chuàng)建的任務(wù)處于Ready狀態(tài)。函數(shù)參數(shù)最多不超過(guò)8個(gè)。 任務(wù)對(duì)象函數(shù)fxn返回時(shí),自動(dòng)調(diào)用TSK_exit函數(shù)。 解析:TSK_Attrs * attrs 任務(wù)參數(shù)指針 struct TSK_Attrs int priority; Ptr stack; Uns stacksize; #ifdef _64_ / imitate C55 series. to check
36、0; Uns sysstacksize; #endif Uns stackseg; Ptr environ; String name; bool exitflag; 3. void TSK_delete(TSK_Handle task) 從所有內(nèi)部隊(duì)列里面刪除這個(gè)任務(wù),并且調(diào)用MEM_free釋放任務(wù)對(duì)象和堆棧。 只能刪除處于結(jié)束狀態(tài)的任務(wù),也可調(diào)用刪
37、除的鉤子函數(shù)。 void myDeleteFxn(TSK_Handle task);4. void TSK_deltatime(TSK_Handle task) 累計(jì)從任務(wù)準(zhǔn)備好到執(zhí)行此函數(shù)時(shí)候的時(shí)間差 如果未調(diào)用此函數(shù),那么就算打開(kāi)任務(wù)統(tǒng)計(jì)累加器選項(xiàng),統(tǒng)計(jì)對(duì)象也不會(huì)更新 一般地,統(tǒng)計(jì)時(shí)先用TSK_settime函數(shù)記錄起始點(diǎn),此函數(shù)記錄終點(diǎn)。5. void TSK_settime(TSK_Handle task) 設(shè)定統(tǒng)計(jì)初始值 void task()
38、; -do some startup work- TSK_settime(TSK_self); for(;) SIO_get(.); -process data- TSK_deltatime(TSK_self); 假如流式IO沒(méi)有準(zhǔn)備好,那么該API函數(shù)會(huì)阻塞(Bl
39、ocked),任務(wù)切換,一段時(shí)間后,流式IO數(shù)據(jù) 準(zhǔn)備好了,此時(shí)發(fā)出READY信號(hào),將本任務(wù)置為ready狀態(tài),此時(shí)TSK_settime會(huì)重新記錄時(shí)間。6. void TSK_disable(void) 全局關(guān)閉內(nèi)核調(diào)度機(jī)制,Busy-Shutting-Down狀態(tài)。只有當(dāng)前任務(wù)可行,其余所有任務(wù)禁止。 此函數(shù)不會(huì)禁止中斷,所以在中斷開(kāi)始前需要調(diào)用此函數(shù)保證中斷發(fā)生時(shí)不會(huì)發(fā)生任務(wù)切換。 可以嵌套,但是調(diào)用幾次TSK_disable,就得相應(yīng)調(diào)用幾次TSK_enable7. void TSK_enable(
40、void) 全局開(kāi)啟內(nèi)核調(diào)度機(jī)制8. void TSK_exit(void) 終止當(dāng)前任務(wù)運(yùn)行。如果所有任務(wù)都被終止,則DSP/BIOS會(huì)調(diào)用SYS_exit終止程序。 無(wú)論什么時(shí)候,任務(wù)從頂層函數(shù)返回時(shí),都是自動(dòng)調(diào)用此函數(shù)。 可以注冊(cè)一個(gè)退出輔助函數(shù) void myExitFxn(void) 這樣,在任務(wù)被設(shè)置為T(mén)SK_TERMINATED模式之前,會(huì)調(diào)用這個(gè)輔助函數(shù)。9. Ptr environ = TSK_getenv(TSK_Handle task) 返回
41、任務(wù)環(huán)境指針,這個(gè)指針指向一個(gè)該任務(wù)可以訪問(wèn)的全局屬性的結(jié)構(gòu)。 若程序定義多個(gè)鉤子對(duì)象,那么HOOK_getenv函數(shù)可以獲取設(shè)置的環(huán)境指針。10. void TSK_setenv(TSK_Handle task, Ptr environ) 設(shè)置指定任務(wù)的環(huán)境指針。 若程序定義多個(gè)鉤子對(duì)象,那么HOOK_setenv函數(shù)可以為每個(gè)鉤子和任務(wù)對(duì)象的組合體設(shè)置獨(dú)立的環(huán)境指針。11. int errno = TSK_geterr(TSK_Handle task) 每個(gè)任務(wù)對(duì)象都有一個(gè)包含任務(wù)錯(cuò)誤號(hào)的存儲(chǔ)單元。初始
42、值為SYS_OK12. void TSK_seterr(TSK_Handle task, int errno) 改變錯(cuò)誤號(hào)13. String name = TSK_getname(TSK_Handle task) 返回任務(wù)的名字。 對(duì)于靜態(tài)對(duì)象來(lái)說(shuō),必須打開(kāi)Allocate Task Name on Target 對(duì)于動(dòng)態(tài)對(duì)象來(lái)說(shuō),TSK_getname返回字段14. int priority = TSK_getpri(TSK_Handle task) 返回優(yōu)先級(jí)
43、15. int oldpri = TSK_setpri(TSK_Handle task, int newpri) 設(shè)置優(yōu)先級(jí) 設(shè)置優(yōu)先級(jí)對(duì)于TSK_BLOCKED狀態(tài)任務(wù)只是優(yōu)先級(jí)改變,而不會(huì)改變狀態(tài); 對(duì)于TSK_READY狀態(tài)的任務(wù)而言,可能會(huì)改變運(yùn)行狀態(tài)。16. STS_Handle sts = TSK_getsts(TSK_Handle task) 獲得統(tǒng)計(jì)對(duì)象句柄,以便查看數(shù)據(jù)17. void TSK_sleep(Uns nticks) 暫停任務(wù)的時(shí)鐘個(gè)數(shù),此時(shí)鐘數(shù)可能比真實(shí)
44、的暫停時(shí)鐘少一個(gè)時(shí)鐘(告警時(shí)鐘)18. void TSK_itick(void) 對(duì)告警時(shí)鐘加1,以便讓TSK_sleep或者SEM_pend函數(shù)暫停執(zhí)行的任務(wù)恢復(fù)到ready。 一些暫停的任務(wù)可能會(huì)隨著告警時(shí)鐘的增加而超時(shí),從而就緒。19. void TSK_tick(void) 對(duì)告警時(shí)鐘加1,以便讓TSK_sleep或者SEM_pend函數(shù)暫停執(zhí)行的任務(wù)恢復(fù)到ready。 一些暫停的任務(wù)可能會(huì)隨著告警時(shí)鐘的增加而超時(shí),從而就緒。 可以在中斷服務(wù)程序和當(dāng)前任務(wù)中調(diào)用,后者在控制超時(shí)
45、非常有用。20. Uns currtime = TSK_time(void) 返回系統(tǒng)告警時(shí)鐘的當(dāng)前值。(由于延遲,只能得到一個(gè)大概的系統(tǒng)時(shí)鐘)21. TSK_Handle currtask = TSK_self(void) 返回當(dāng)前任務(wù)對(duì)象的句柄22. void TSK_stat(TSK_Handle task,TSK_Stat * statbuf) 返回任務(wù)的屬性參數(shù)和狀態(tài)信息 struct TSK_Stat TSK_Attrs attrs;/任務(wù)參數(shù)
46、60; TSK_Mode mode; /任務(wù)執(zhí)行模式 Ptr sp; /任務(wù)當(dāng)前堆棧指針 Uns used; /任務(wù)堆棧曾經(jīng)使用的最大值 注意:任務(wù)比HWI和SWI中斷優(yōu)先級(jí)要低,所以當(dāng)任務(wù)被中斷時(shí),還是返回TSK_RUNNING, 因?yàn)橹袛嗤瓿珊笕蝿?wù)繼續(xù)運(yùn)行。23. void TSK_yield(void) 強(qiáng)制任務(wù)切換,請(qǐng)注意,任務(wù)可以被中斷,但是,任務(wù)之間必須依靠切換來(lái)進(jìn)行,就是說(shuō), 即便當(dāng)前有高優(yōu)先級(jí)任務(wù)就緒,它不能被執(zhí)行,除非切換。
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《眾人行管理咨詢(xún)網(wǎng)》課件
- 運(yùn)動(dòng)器材銷(xiāo)售工作總結(jié)
- 2013年高考語(yǔ)文試卷(湖北)(空白卷)
- 租車(chē)服務(wù)員工作總結(jié)
- 2006年江西高考語(yǔ)文真題及答案
- 驅(qū)動(dòng)未來(lái)新型汽車(chē)
- 2023年-2024年項(xiàng)目管理人員安全培訓(xùn)考試題附解析答案可打印
- 2023年-2024年項(xiàng)目部管理人員安全教育培訓(xùn)試題及參考答案【A卷】
- 2023-2024安全培訓(xùn)考試題及答案【名校卷】
- 2023年-2024年項(xiàng)目部安全培訓(xùn)考試題答案完美
- 排水管渠及附屬構(gòu)筑物
- 養(yǎng)豬場(chǎng)施工噪聲環(huán)境影響分析
- Windows-Server-2012網(wǎng)絡(luò)服務(wù)架構(gòu)課件(完整版)
- 2022版義務(wù)教育語(yǔ)文課程標(biāo)準(zhǔn)(2022版含新增和修訂部分)
- 形位公差_很詳細(xì)(基礎(chǔ)教育)
- 手榴彈使用教案
- 600MW機(jī)組除氧器水位控制系統(tǒng)
- 史上最全的涉稅風(fēng)險(xiǎn)
- 初中數(shù)學(xué)問(wèn)題情境的創(chuàng)設(shè)
- 電力設(shè)備典型消防規(guī)程.ppt
- 北京興昌達(dá)博房地產(chǎn)開(kāi)發(fā)有限公司重整計(jì)劃
評(píng)論
0/150
提交評(píng)論