




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、3.1、NotifyNotify組件將硬件中斷抽象成多組邏輯事件,是一種簡單快捷的發(fā)送低于32bit信息的通信方式。Notify組件提供了以下接口:1. 初始化并配置Notify組件;Notify_attach();2. 注冊/注銷事件;Notify_registerEvent()/Notify_unregisterEvent()/Notify_registerEventSingle()/Notify_unregisterEventSingle()3. 發(fā)送帶參數(shù)的事件給某處理器;Notify_sendEvent()4. 通過回調(diào)函數(shù)接收事件;Notify_FnNotifyCbck()5. 使
2、能/禁用事件;Notify_diableEvent()/Notify_enableEvent()6. 其他邏輯接口;Notify_eventAvailable()/Notify_intLineRegistered()/Notify_numIntLines()/Notify_restore()注:1. 同一個中斷號可以注冊多個事件,同一個事件可以有多個回調(diào)函數(shù)或者多個宿主(可以是處理器、線程或者任務(wù)),事件被觸發(fā)后所有宿主都會被喚醒;2. 一個事件可以接收多個宿主發(fā)送來的通知(notification),事件所攜帶的參數(shù)最大支持32bit;3. 事件是有優(yōu)先級的,EventId越小優(yōu)先級越高,事
3、件0的優(yōu)先級最高,隨著EventId增大優(yōu)先級依次遞減;當(dāng)多個事件被觸發(fā),優(yōu)先級最高的會最先響應(yīng);4. Notify模塊使用硬件中斷,因此不能被頻繁調(diào)度。Notify組件常用于傳遞附帶消息少于32bit的場景,如信令傳遞、buffer指針傳遞等。在信令傳遞時使用高優(yōu)先級的事件,如事件0;而在傳遞buffer指針是可以使用低優(yōu)先級的事件,如事件30等。在Notify_sentEvent() API中帶有參數(shù)waitClear,該參數(shù)為可選參數(shù),如果waitClear為TRUE,這就意味著多宿主事件無法及時響應(yīng),必須等待前一宿主事件結(jié)束后才能響應(yīng)下一宿主;如果waitClear為FALSE,最好不
4、要為事件附帶參數(shù),否則多宿主事件可能會由于消息被覆蓋而出現(xiàn)丟消息的現(xiàn)象。該API最好不要在中斷服務(wù)程序(ISR)中調(diào)用(特別是waitClear = TRUE時),否則會導(dǎo)致中斷調(diào)度出現(xiàn)異常(表現(xiàn)之一:高優(yōu)先級的中斷響應(yīng)會延遲);此外該API不能再使用GateMP模塊鎖保護(hù)的程序段中調(diào)用,否則可能會導(dǎo)致操作系統(tǒng)死鎖。由于其他模塊使用了Notify機(jī)制,因此在SysLink中預(yù)留了部分事件號,這部分事件號用戶需要慎重選用(如果你沒有使用其他組建的話,可以考慮占用這部分事件號),在注冊事件前可以使用Notify_eventAvailable()來檢查該事件是否可用,即該中斷號上的該事件號是否被注冊
5、。ModuleEvent IdsFrameQBufMgr0FrameQ1MessageQ(TransportShm)2RingIO3NameServerRemoteNotify43.2、MessageQMessageQ,顧名思義,基于隊列的消息傳遞。MessageQ有以下特點(diǎn): 實現(xiàn)了處理期間變長消息的傳遞; 消息的傳遞都是通過操作消息隊列來實現(xiàn)的; 每個消息隊列可以有多個寫者,但只能有一個讀者;每個任務(wù)(task)可以對多個消息隊列進(jìn)行讀寫; 一個宿主在準(zhǔn)備接收消息時,必須先創(chuàng)建消息隊列,而在發(fā)送消息前,需要打開預(yù)定的接收消息隊列;MessageQ組件常用在滿足以下條件的場景中:1. 在消息
6、傳遞中有多個寫者,但僅有一個讀者;2. 所需要傳遞的消息超過32bit,且長度可變;讀寫者的緩沖區(qū)大小相同;3. 處理期間需要頻繁傳遞消息,在這種情況下,消息被依次放入隊列,能保證不會丟消息;4. 消息隊列為空時,調(diào)用MessageQ_get()獲取消息時會被阻塞,直到消息隊列被寫入消息;5. 支持處理器間移動消息隊列,在這種情況下,調(diào)用MessageQ_open()來定位隊列位置,而消息傳遞部分代碼不需要改動;MessageQ組件提供了以下幾個API:1. 消息隊列初始化:MessageQ_Params_init()2. 消息隊列創(chuàng)建/銷毀:MessageQ_create()/Message
7、Q_delete(),create創(chuàng)建消息隊列,并分配相應(yīng)存儲空間3. 消息隊列打開/關(guān)閉:MessageQ_open()/MessageQ_close(),open時會返回遠(yuǎn)程處理器上的QueID的地址。4. 為消息隊列分配堆內(nèi)存:MessageQ_alloc()/MessageQ_free()5. 為消息隊列注冊/注銷堆內(nèi)存:MessageQ_registerHeap()/MessageQ_unregisterHeap()6. 向消息隊列中放入/獲取消息:MessageQ_put()/MessageQ_get()7. 其他邏輯API: 獲取消息隊列ID:MessageQ_getQueueI
8、d() 獲取消息隊列中消息數(shù):MessageQ_count() 在消息隊列中嵌入消息:MessageQ_setReplyQueue() 為消息隊列解阻塞:MessageQ_unblock() 為調(diào)試消息隊列加入Trace:MessageQ_setMsgTrace()3.3、ListMPListMP實現(xiàn)了多宿主雙向循環(huán)鏈表,即該雙向循環(huán)鏈表為多個處理器共同擁有,可以由多個處理器共同維護(hù),共同使用。ListMP的實現(xiàn)區(qū)別于一般的雙向循環(huán)鏈表,因此它不僅具有雙向循環(huán)鏈表的特性外,還增添了其他的特性,比如以下幾點(diǎn): 實現(xiàn)了簡單的多宿主協(xié)議,支持多個讀寫者(multi-reader、multi-writ
9、ee); 使用Gate作為內(nèi)部保護(hù)機(jī)制,防止多個宿主處理器同時訪問該鏈表;ListMP的實現(xiàn)并未加入通知機(jī)制,如果需要的話,可以在外部封裝是引入Notify機(jī)制來實現(xiàn);使用ListMP機(jī)制來管理的buffers都需要從共享內(nèi)存區(qū)分配,包括從堆內(nèi)存分配的buffers以及動態(tài)分配的內(nèi)存。ListMP組件常用于滿足一下條件的場景中:1. 需要被多個宿主訪問并且需要頻繁傳遞消息或者數(shù)據(jù);2. 可用于無規(guī)則的消息傳遞,基于鏈表實現(xiàn),因此讀者可以遍歷所有對象,并選出需要的對象進(jìn)行處理;如果硬件支持快速隊列,則無法完成隊列遍歷操作(WHY);3. 可以自定義消息優(yōu)先級,同樣是基于鏈表實現(xiàn),讀者可以隨意的選
10、擇在鏈表頭部還是鏈表的尾部來插入消息或者實現(xiàn)鏈表對象的位置調(diào)整,進(jìn)而實現(xiàn)消息的優(yōu)先級選擇;如果硬件支持快速隊列,則無法完成隊列遍歷操作(WHY);4. 無內(nèi)置通知機(jī)制,可以靈活的外部通知機(jī)制來實現(xiàn)。譬如根據(jù)實際情況,選用Notify來實現(xiàn),亦或是使用選用MessageQ則可以使用最少的中斷資源實現(xiàn)性能優(yōu)良的通知機(jī)制,缺點(diǎn)是需要額外的代碼實現(xiàn)通知機(jī)制。ListMP組件提供了以下API接口:1. ListMP參數(shù)初始化:ListMP_Params_init()2. ListMP創(chuàng)建/銷毀:ListMP_create()/ListMP_delete()3. ListMP打開/關(guān)閉:ListMP_op
11、en()/ListMP_close()4. ListMP相關(guān)鏈表操作: 判斷鏈表空:ListMP_empty() 獲取保護(hù)鎖:ListMP_getGate() 獲取鏈表頭/表尾:ListMP_getHead()/ListMP_getTail() 鏈表插入操作:ListMP_insert() 獲取鏈表上游元素/下游元素:ListMP_next()/ListMP_prev() 插入元素到鏈表頭/尾:ListMP_putHead()/ListMP_putTail() 刪除元素:ListMP_remove()3.4、GateMPGateMP是針對于多處理器共享資源的一種保護(hù)機(jī)制,就如其名字一樣,把共享
12、資源比作房子,那么GateMP就是這個房子的門。GateMP組件實現(xiàn)了開關(guān)門的機(jī)制,用于保護(hù)共享資源一次只被一個處理器讀寫。根據(jù)SOC硬件資源配置的不同,GateMP的實現(xiàn)有所不同。對于硬件支持Hardware Spinlock的可以基于H/W spinlock來實現(xiàn)GateHwSpinlock;而對于沒有該硬件資源的系統(tǒng)中,則使用軟件方法(Peterson算法)來實現(xiàn)GatePeterson。GateMP組件框架如下:GateMP組件對用戶提供了以下API接口:1. GateMP初始化:GateMP_Params_init();2. GateMP創(chuàng)建/刪除:GateMP_create()/G
13、ateMP_delete();3. GateMP打開/關(guān)閉:GateMP_open()/GateMP_close();4. 進(jìn)入/離開GateMP保護(hù):GateMP_enter()/GateMP_leave();5. 獲取當(dāng)前GateMP的保護(hù)類型:GateMP_getLocalProtect()/GateMP_getRemoteProtect();注:如果某個處理器在想使用被某個GateMP保護(hù)的共享資源,那么該處理器會被阻塞,直到該資源被釋放(即GateMP_leave())。3.5、HeapMPHeapMP主要包括HeapBufMP和HeapMemMP,用于共享內(nèi)存區(qū)的堆內(nèi)存配置和管理。
14、HeapMP具備以下幾個特征: 支持多宿主,即無論是運(yùn)行HLOS的主處理器還是運(yùn)行SYS/BIOS的從處理器都可以配置和管理堆內(nèi)存; 可以將共享內(nèi)存區(qū)配置成緩沖池(buffer pools); 可以從共享內(nèi)存區(qū)分配和釋放緩沖區(qū);3.5.1、HeapBufMPHeapBufMP為用戶提供了固定大小的緩沖池管理接口;HeapBufMP組件為用戶提供的API接口如下:1. HeapBufMP創(chuàng)建/刪除:HeapBufMP_create();HeapBufMP_delete();2. HeapBufMP打開/關(guān)閉:HeapBufMP_open();HeapBufMP_close();3. HeapBu
15、fMP參數(shù)初始化:HeapBufMP_Params_init();4. HeapBufMP分配/釋放內(nèi)存:HeapBufMP_alloc();HeapBufMP_free();5. HeapBufMP獲取所有狀態(tài):HeapBufMP_getExtendedStats();HeapBufMP_getStats();3.5.2、HeapMultiBufMP在SysLink包中并沒有找到相關(guān)API,但SysLink UserGuide中有提到.HepMultiBufMP為用戶提供了可配置大小的緩沖池管理接口。3.5.3、HeapMemMPHeapMemMp為用戶提供了基于堆的可變大小的內(nèi)存管理機(jī)制。
16、HeapMemMp組件為用戶提供的接口如下:1. HeapMemMP參數(shù)初始化:HeapMemMP_Params_init();2. HeapMemMP創(chuàng)建/刪除:HeapMemMP_create()/HeapMemMP_delete();3. HeapMemMP打開/關(guān)閉:HeapMemMP_open()/HeapMemMP_close();4. HeapMemMP分配/釋放內(nèi)存:HeapMemMP_alloc()/HeapMemMP_free();5. HeapMemMP獲取內(nèi)存狀態(tài):HeapMemMP_getExtendedStats()/HeamMemMP_getStats();6.
17、HeapMemMP恢復(fù)內(nèi)存初始狀態(tài):HeapMemMP_restore();3.6、FrameQFrameQ是專門為傳遞視頻幀而設(shè)計出來的組件。FrameQ的基本數(shù)據(jù)結(jié)構(gòu)是可用于queue/dequeue數(shù)據(jù)的數(shù)據(jù)隊列,封裝了視頻幀緩存指針、幀數(shù)據(jù)類型、幀寬、幀高、時間戳等信息。對于FrameQ模塊具有以下特征: 支持多個讀者,但寫者唯一; 可以分配和釋放Frames; 可以對指向同一塊內(nèi)存區(qū)多次分配和初始化成新的幀buffer; FrameQ允許有多個隊列,在多通道的運(yùn)用中,視頻幀會根據(jù)通道號被分配到相應(yīng)的幀隊列中;FrameQ中用于buffer管理的模塊稱為FrameQBufMgr,該模塊
18、用于提供buffer管理接口和通知機(jī)制。FrameQ提供以下API接口:1. FrameQ組件初始化/銷毀:FrameQ_setup()/FrameQ_destroy();2. 創(chuàng)建/刪除FrameQ實例:FrameQ_create()/FrameQ_delete();3. 打開/關(guān)閉FrameQ實例:FrameQ_open()/FrameQ_close();FrameQ_openByAddr();4. 為FrameQ實例分配/釋放內(nèi)存:FrameQ_alloc()/FrameQ_free();FrameQ_allocv/FrameQ_freev();5. 插入/釋放FrameQ中幀:Fram
19、eQ_put()/FrameQ_get();FrameQ_putv()/FrameQ_getv();6. 復(fù)制給定的幀:FrameQ_dup();7. 注冊/注銷FrameQ通知:FrameQ_registerNotifier()/FrameQ_unregisterNotifier();8. 強(qiáng)制發(fā)送通知:FrameQ_sendNotify()9. 獲取FrameQ中有效幀數(shù)/已被釋放的幀數(shù):FrameQ_getNumFrames()/FrameQ_getNumFreeFrames(); FrameQ_getvNumFrames()/FrameQ_getvNumFreeFrames()10.
20、FrameQ控制:FrameQ_control()11. 獲取FrameQ的頭指針:FrameQ_getExtendedHeaderPtr();12. 獲取幀buffer/幀大小/幀數(shù):FrameQ_getFrameBuffer()/FrameQ_getFrameBufSize()/FrameQ_getNumFrameBuffers();13. 獲取空數(shù)據(jù)幀大小/位置:FrameQ_getFrameBufValidSize()/FrameQ_getFrameBufDataStartOffset();14. 設(shè)置空數(shù)據(jù)幀大小/位置:FrameQ_setFrameBufValidSize()/Fr
21、ameQ_setFrameBufDataStartOffset();15. 獲取FrameQ默認(rèn)設(shè)置:FrameQ_getConfig();3.7、RingIORingIO是基于數(shù)據(jù)流的環(huán)形緩沖buffer,而且針對于音視頻數(shù)據(jù)的特性做了優(yōu)化。RingIO支持一下特性: 僅支持一個讀者和一個寫者; 讀寫相對獨(dú)立,可以在不同的進(jìn)程或者處理器中同時進(jìn)行讀寫操作;RingIO為用戶提供了以下接口:1. RingIO參數(shù)初始化:RingIO_Params_init();2. 創(chuàng)建/刪除RingIO對象:RingIO_create()/RingIO_delete();3. 打開/關(guān)閉RingIO對象:R
22、ingIO_open()/RingIO_close();RingIO_openByAddr();4. 獲取共享內(nèi)存請求:RingIO_sharedMemReq();5. 注冊/注銷RingIO通知:RingIO_registerNotifier()/RingIO_unregisterNotifier();6. 強(qiáng)制發(fā)送RingIO通知:RingIO_sendNotify();7. 獲取RingIO通知類型:RingIO_setNotifyType();8. 設(shè)置/獲取水印標(biāo)志/通知類型:RIngIO_setWaterMark()/RIngIO_getWaterMark()9. 獲取/釋放Rin
23、gIO數(shù)據(jù):RingIO_acquire()/RingIO_release();10. 設(shè)置/獲取RingIO屬性:RingIO_setvAttribute()/RingIO_getvAttribute();11. 設(shè)置/獲取RingIO固定大小的屬性:RingIO_setAttribute()/RingIO_getAttribute();12. 刷新RingIO的buffer:RingIO_flush();13. 獲取有效/空buffer大?。篟ingIO_getValidSize()/RingIO_getEmptySize();14. 獲取有效/空屬性大?。篟ingIO_getValidA
24、ttrSize()/RingIO_getEmptyAttrSize();15. 獲取用戶需求buffer的大小/位置:RingIO_getAcquiredSize()/RingIO_getAcquiredOffset();4、公共組件(基礎(chǔ)組件)Utility Modules包括SharedRegion(IPC中屬于類庫ti.sdo.ipc.SharedRegion)、List、Trace、MultiProc、NameServer等,這些模塊是上層組件實現(xiàn)的基礎(chǔ)。在IPC包中,該組件對應(yīng)于類庫ti.sdo.utils.4.1、SharedRegion(非常重要,SysLink模塊最基礎(chǔ)的模塊)
25、4.1.1、SharedRegion總覽SharedRegion顧名思義,是共享內(nèi)存區(qū)的意思。SharedRegion模塊負(fù)責(zé)管理共享內(nèi)存區(qū)。在一個有共享內(nèi)存的多核架構(gòu)中,普遍會遇到共享內(nèi)存映射虛擬地址轉(zhuǎn)換問題,如下圖所示:SharedRegion有兩種配置方式,即靜態(tài)配置方法(對于SYS/BIOS側(cè)可以通過cfg腳本配置,而對于HLOS則當(dāng)從處理器被加載的時候會通過讀取SYS/BIOS共享內(nèi)存區(qū)配置信息來獲取,請參考內(nèi)核driver/dsp/syslink/notify_shmdriver/notify_shm_drv.c中實現(xiàn))和動態(tài)配置方法(通過SharedRegion模塊提供的API SharedRegion_setEntry()來設(shè)置,但值得注意的是這個API只是把入口信息
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 網(wǎng)絡(luò)安全產(chǎn)品銷售與技術(shù)支持服務(wù)合同
- 視頻改造技術(shù)協(xié)議書
- 貨車委托購買協(xié)議書
- 職工餐廳轉(zhuǎn)讓協(xié)議書
- 資料保密合同協(xié)議書
- 聘用律師解除協(xié)議書
- 簽訂器官捐獻(xiàn)協(xié)議書
- 股份解除合同協(xié)議書
- 貨物損壞索賠協(xié)議書
- 苗木意向采購協(xié)議書
- GB/T 13663.3-2018給水用聚乙烯(PE)管道系統(tǒng)第3部分:管件
- GB/T 12755-2008建筑用壓型鋼板
- GA 374-2019電子防盜鎖
- 人工髖關(guān)節(jié)置換術(shù)后的護(hù)理 課件
- 九州通集團(tuán)簡介
- 質(zhì)量工藝問題反饋單模板
- 2022-2023學(xué)年人教版選擇性必修3 3.4 第1課時 羧酸 學(xué)案
- 2022年浙江小升初科學(xué)試卷及評分標(biāo)準(zhǔn)答案
- 移液器(槍)容量內(nèi)部校核記錄
- 市場管理及產(chǎn)品規(guī)劃課件培訓(xùn)課件(PPT-202張)
- 標(biāo)準(zhǔn)作業(yè)指導(dǎo)書(SOP)培訓(xùn)PPT課件
評論
0/150
提交評論