IT技術(shu)互(hu)動(dong)交流平jiao)/h4>

安徽11选5官网

來源︰IT165收集  發布日期︰2020-04-02 15:13:23
IPC是SYS/BIOS處理核(he)間通信的組件 IPC的幾(ji)種應(ying)用(yong)方式(下面中文名字是自行(xing)翻(fan)譯,旁邊(bian)有英文=_=,另外下面的配圖中的藍色(se)表示需要調(diao)用(yong)模塊的APIs,而紅色(se)模塊表示僅僅需要配置(如(ru)在.cfg中配置),而灰色(se)模塊表示是非(fei)必須的)︰ (1)最小使用(yong)(Minimal use)︰這種情況是通過核(he)間的通知機(ji)制(zhi)(notification)來實施的,而一個通知所攜(xie)帶(dai)的信息是非(fei)常小的(一般(ban)是32bits),所以(yi)稱為最小使用(yong)。這種方式一般(ban)是用(yong)于處理核(he)間的簡(jian)單同步,卻無法處理復雜的消息傳遞(di)。
 這種情況下,需要利用(yong)到Notify模塊的APIs函數,比如(ru)通過Notify_sendEvent()函數給某個特定核(he)傳遞(di)一個事件,我們可(ke)以(yi)給特定事件動(dong)態注冊反饋函數。由于一個通知(notification)所攜(xie)帶(dai)的信息是極少的,所以(yi)只能給處理器發送一個事件號,而這個事件號所代表的反饋函數決定之(zhi)後的動(dong)作(zuo)。另外一些數據(ju)以(yi)函數參數方式,也bu)ke)以(yi)被送出。 (2)增加數據(ju)通路(lu)(Add data passing)︰這種情況是在前面的最小使用(yong)機(ji)制(zhi)下,在核(he)間增加了一個傳遞(di)鏈(lian)表元素的數據(ju)通路(lu),這個鏈(lian)表的實施一般(ban)是使用(yong)共享內容並通過門(men)(gates)來管理同步。
這種情況是在最小使用(yong)上(shang),增加了一個ListMP模塊用(yong)于共享鏈(lian)表元素。 ListMP模塊是一個雙向鏈(lian)表,另外ListMP需要用(yong)到jiao)怖 詿媯 yi)SharedRegion模塊也需要被使用(yong),另外ListMP通過NameServer模塊中來管理名稱/值,同時使用(yong)GateMP模塊來防(fang)止鏈(lian)表元素被多個處理器同時讀取。 (3)增加動(dong)態分(fen)配(Add dynamic allocation)︰這種情況下,增加了從堆中動(dong)態分(fen)配鏈(lian)表元素的功能。
這種情況在上(shang)種情況下,增加了一個Heap*MP模塊,這個模塊主要用(yong)于從堆中給鏈(lian)表動(dong)態分(fen)配內存 (4)強大(da)但易用(yong)的消息機(ji)制(zhi)(Powerful but easy-to-use messaging)︰這種情況下利用(yong)MessageQ模塊來傳遞(di)消息。
除了Notify通知機(ji)制(zhi),還可(ke)以(yi)利用(yong)MessageQ來實現(xian)更(geng)為復雜的核(he)間通信,在這種情況下,只需要配置MultiProc和SharedRegion模塊就(jiu)可(ke)以(yi)了,而Ipc_start()函數將自動(dong)為我們實現(xian)上(shang)面灰色(se)模塊的配置。 本節,我們暫時只以(yi)一個簡(jian)單的最小使用(yong)(Minimal use)情況為例,分(fen)析CCS自帶(dai)一個多核(he)通信例子,這個例子在八核(he)之(zhi)間相互(hu)傳遞(di)信息,之(zhi)後我們總結核(he)間傳遞(di)方法實現(xian)步驟,實現(xian)一個主從核(he)之(zhi)間傳遞(di)信息的功能。
一、打(da)開CCS自帶(dai)例程 打(da)開CCS自帶(dai)例程的方法和新建CCS項目是一致,只是需要在Project templates and examples中選擇(ze)我們需要的例子,這里的例子是在IPC and I/O Examples中選擇(ze)C6678 Examples中的Notify,然後輸入項目名稱後,CCS會自行(xing)將例子復制(zhi)到項目下。
二、生成(cheng)項目後,編譯調(diao)試查(cha)看運行(xing)結果 (1)點擊編譯後,查(cha)看有無出錯 (2)導入目標配置文件.ccxml,這里選擇(ze)的仍然是C6678 Device Functional Simulator, Little Endian. (3)點擊調(diao)試,選擇(ze)所有的核(he) (4)全選所有的核(he)(通過Shift),然後Groups
(5)選中Group,點擊運行(xing) 三、分(fen)析運行(xing)結果 這個例程除了調(diao)用(yong)Notify模塊,在核(he)間傳遞(di)消息,通過反饋函數觸(chu)發核(he)的動(dong)作(zuo),同時通過Semaphore模塊來保證(zheng)核(he)間依次執行(xing),防(fang)止搶佔,這里每個核(he)都(du)有一個信號量,來表明(ming)其當前是否執行(xing)或等待(dai)其它核(he)執行(xing)完成(cheng)。 (1)各核(he)打(da)印
這段是在main()中出現(xian)的結果,每個核(he)都(du)會執行(xing)各自的main()。
各核(he)注冊事件,並表明(ming)其反饋函數
(2)核(he)0執行(xing)同時釋tou)判藕帕浚 諍he)0釋tou)判藕帕emHandle之(zhi)前,其他核(he)都(du)處理等待(dai)信號量釋tou)胖
核(he)0通過給核(he)1發送事件,觸(chu)發反饋函數,在反饋函數中semHandle歸一,注意(yi)這個激活的信號量是在核(he)1中的
激活核(he)1的信號量後,核(he)0打(da)印結果,並等待(dai)其信號量的結果,所有核(he)的信號量都(du)初始為0
(3)以(yi)下是總共八個核(he),分(fen)別執行(xing)了NUMLOOPS次(這里設置的是10次)
下一個核(he)信號被激活,開始執行(xing)
同時通過反饋函數將當前核(he)的下一個核(he)激活
完成(cheng)發送事件
(4)退(tui)出任(ren)務循環,同時退(tui)出當前核(he)的BIOS

四、多核(he)IPC的配置 (1)IPC的啟動(dong)非(fei)常簡(jian)單,在導入Ipc頭(tou)文件後,在main()函數中調(diao)用(yong)Ipc_start()就(jiu)能根據(ju).cfg文件中配置啟動(dong)IPC所需要的模塊,比如(ru)默認情況下Ipc_start()會調(diao)用(yong)Notify_start()之(zhi)類(lei),不過要啟動(dong)這些模塊,需要保證(zheng)提前在.cfg中添加了這些模塊(如(ru)右擊模塊,選擇(ze)Use) (2)IPC的配置是在.cfg中完成(cheng)的,配置IPC首先需要申明(ming),當前Notify等相關模塊也需要提前申明(ming),這里如(ru)果不清(qing)楚IPC所需要的相關模塊,最好使用(yong)自帶(dai)IPC例程作(zuo)為模塊。 var Ipc = xdc.useModule('ti.sdo.ipc.Ipc'); (3)設置同步的核(he)數 Ipc.procSync = Ipc.ProcSync_ALL; 這里Ipc.ProcSync_ALL 表示Ipc_start會自動(dong)將所有的核(he)都(du)啟動(dong)了 Ipc.ProcSync_PAIR 表示只啟動(dong)部(bu)分(fen)核(he),需要啟動(dong)的核(he)要通過Ipc_attach()來啟動(dong),這個默認選項 Ipc.ProcSync_NONE 表示Ipc_start()不huan)嵬 餃ren)何核(he) (4)核(he)間的連接方法Ipc_attach()及Ipc_detach() 這兩(liang)個函數的使用(yong),需要.cfg文件中配置了Ipc.ProcSync_PAIR Ipc_attach的使用(yong)方法非(fei)常簡(jian)單,在Ipc_start()之(zhi)後直接輸入︰ Ipc_attach(#coreID),#coreID表示需要連接的核(he)ID號,如(ru)Ipc_attach(0)表示連接核(he)0。 不過需要注意(yi)的是︰ a) 核(he)的連接一定要按照ID號從小到大(da)的順序進行(xing),比如(ru)當前核(he)必須先連接了核(he)0,才能連接核(he)1,之(zhi)後才能連接核(he) b) 另外兩(liang)核(he)之(zhi)間的相互(hu)連接必須先滿足ID號小的先連接ID號大(da)的,比如(ru)只有當核(he)0連接核(he)1後,核(he)1才能連接到核(he)0 c) 由于核(he)的連接並不是一次就(jiu)能成(cheng)功的,所以(yi)一般(ban)需要加一個循環等待(dai)的過程,一般(ban)使用(yong)方法如(ru)下︰ while(Ipc_attach(#coreID)<0){ Task_sleep(1); } Ipc_detach()的使用(yong)方法同Ipc_attach()是類(lei)似的,不過它的功能是解除連接。
五(wu)、主從核(he)之(zhi)間的通信 前面介紹IPC核(he)間通信例子,是每個核(he)同所有核(he)之(zhi)間都(du)有連接,而各核(he)之(zhi)間連接都(du)是相同且雙向,而在很多情況下,我們並不需要如(ru)此多的核(he),或者許多核(he)間連接也是不必要的,這些情況下使用(yong)Ipc.ProcSync_ALL未(wei)免太(tai)不高效。 下面我們介紹的例子是核(he)間的主從通信,選擇(ze)三個核(he),選擇(ze)一個主核(he),另外兩(liang)個是副(fu)核(he),主核(he)core0同副(fu)核(he)之(zhi)間有相互(hu)連接,而副(fu)核(he)core1與副(fu)核(he)core2之(zhi)間沒有連接,這個主從通信主要完成(cheng)以(yi)下事件 a) 主核(he)向兩(liang)從核(he)發送事件,激活從核(he),使其執行(xing)任(ren)務 b) 兩(liang)核(he)完成(cheng)任(ren)務後,向主核(he)發送事件,主核(he)繼續(xu)執行(xing)其任(ren)務。 這個例程主要有如(ru)下內容︰ (1)在.cfg文件中設置procSync 改(gai)為Ipc.procSync = Ipc.ProcSync_PAIR;
(2)定義主從核(he)ID
(3)在main()函數Ipc_start()後增加如(ru)下代碼(ma)︰
a) 這里主要根據(ju)主核(he)和從核(he)的角色(se)分(fen)別添加連接任(ren)務︰主核(he)同兩(liang)個從核(he)都(du)有連接,而從核(he)只與主核(he)有鏈(lian)接 b) 在添加核(he)間連接後,分(fen)別給核(he)間連接注冊事件 (3)在任(ren)務函數tsk0_func內分(fen)別根據(ju)主核(he)及從核(he)的角色(se)添加發送與接收函數,下面是以(yi)主核(he)為例
主核(he)在給從核(he)分(fen)別發送事件後,通過Semaphore_pend等從核(he)將主核(he)的信號量激活,之(zhi)後繼續(xu)主核(he)任(ren)務。 同時只有當主核(he)通過給從核(he)發送事件,從核(he)的注冊函數激活信號量,從核(he)才能開始任(ren)務。 (4)仿(fang)真調(diao)試的結果
從結果上(shang)看,當從核(he)分(fen)別收到了來自主核(he)的事件時,同時開始任(ren)務,當從核(he)任(ren)務全部(bu)完成(cheng)後,主核(he)才開始ji)淙ren)務
Tips: a) 這里需要注意(yi)的是在注冊函數內不要加System_printf()函數,這個函數會導致如(ru)下錯誤產生︰ ti.sysbios.gates.GateMutex: line 97: assertion failure: A_badContext: bad calling context. See GateMutex API doc for details. xdc.runtime.Error.raise: terminating execution b) 上(shang)面的代碼(ma)並不是全部(bu) 例程代碼(ma)下載地址︰https://github.com/tostq/EasyMulticoreDSP/tree/master/6.IPC_notify
Tag標簽︰多核(he)  實例分(fen)析  
  • 安徽11选5官网

About IT165 - 廣告服務 - 隱私聲明(ming) - 版權申明(ming) - 免責條款 - 網站地圖 - 網友(you)投(tou)稿 - 聯系方式
本站內容來自于互(hu)聯網,僅供用(yong)于網絡技術(shu)學習,學習中請(qing)遵循相關法律法規
安徽11选5官网 | 下一页