Movidius軟件手冊閱讀 2017-09-04


選取了部分內容進行記錄,主要用於理解總體框架。水平有限,如有理解錯誤,歡迎指正!

2LEON:

2.3.1尋址范圍:

完全權限,但OS在CSS,RT在MSS.直接到各自區域地址更好.

2.3.2啟動:

OS從ROM開始執行固件,固件從flash、其他存儲或通過SPI連接的核加載應用代碼。加載之后,boot loader將權限交給應用程序的Leon入口點,進行一些基本的初始化操作,然后調用main()或者POSIX_Init()。
啟動必須從OS開始,即便只是為了啟動RT或者SHAVE。
可以通過SPI、I2C、EBI等方式開始啟動。

2.3.3對數據緩存的注意:

多個核的同步讀寫問題

2.3.4Leon工具:

用gcc和binutile編譯和連接,用elf格式做object和可執行文件。均存在於sparc-elf-gcc包內。

2.3.6中斷處理:

中斷處理入口都在SPARC匯編中指定並優化以確保中斷處理開銷盡可能低。注意:浮點寄存器在終端服務程序中不能正確保存,因此不安全。OS和RT有各自的中斷控制器。

2.3.7計時器:

每個核都有獨自的計時器塊。有8個通用計時器,一個自由計數器/一個隨機數生成器/一個看門狗計時器。通過預分頻系統時鍾使計時器運行在較低速度。每個通用計時器都可以產生獨立的中斷給對應的Leon核中斷控制器。

2.3.8輔助狀態寄存器(ASR):

特殊說明ASR17,因為ASR17可以定制Leon處理器。

2.4OS的應用:

OS雖然能處理數值計算,但是在這方面能力明顯弱於SHAVES。OS更適合於管理外圍器件,數據流控制及應用狀態管理,所有的計算應用趨向於在SHAVES內完成。

2.4.1OS內存特點:

OS擁有256KB的L2緩存,適用於運行小的操作系統,即使操作系統代碼存儲在DDR內存中。L1緩存有32KB(指令和數據各自),可以更快加速OS。
OS可以通過CMX或者DDR來執行。系統設計針對DDR運行做了緩存大小的優化使其更小耗費。

3SHAVE:

包含寬且深的寄存器堆及超長指令字。在功能單元和處理器級別上具有高並行性核高通量。包含IRF和VRF兩個寄存器堆。

3.1.1整數寄存器堆IRF:

32X32bit,主要做整數操作,也可用於讀寫指令。IAU和SAU對這些寄存器進行操作。

3.1.2向量寄存器堆VRF:

32X128bit。

3.1.3整數運算單元IAU:

整數操作及移位和邏輯運算

3.1.4標量運算單元SAU:

浮點操作,除普通計算外,也支持一些復雜浮點運算:求倒,sine,均方根,對數,指數等。該單元也支持IRF的整數操作,以便更好的實現並行。

3.1.6比較移動單元CMU:

用於從一個寄存器復制和移動數據到另一個。可以任意組合並支持多種長度。同時用於比較不同數據類型。通過設定條件代碼寄存器與多個輸入進行比較。允許在VRF寄存器上一次比較多個數據。

3.1.7存取單元LSU:

對兩個寄存器堆進行數據存取操作。可與其他單元配合進行操作,見SHAVE和ISA文檔。

3.1.8分支單元BRU:

提供分支,SHAVE有5個周期的延遲,可以用來填充其他指令。

3.1.9預測執行單元PEU:

有助於完成條件分支或者LSU和VAU單元的條件存儲。

3.2.1指令代碼注意:

SHAVE對L1和L緩存都有權限。L1緩存包含1KB數據緩存和2KB指令緩存。

3.2.2數據使用注意:

SHAVE可使用1KB的L1數據緩存和256KB的L2緩存。L2配置為16X16KB,LSU可以分配到任意部分。L2緩存行為64bits。寫數據默認使用回寫機制(write-back)而不是直接寫到內>>>存。可以通過申明 sve_writethru 信號來強制執行直寫機制(write-through)。

3.3標准庫支持:C/C++

3.4互斥器Mutexes:

多核共享資源,Mutexes塊允許單個處理器獨占資源。
8個獨立互斥器,SHAVE可以預測互斥器是否可用以避免繁忙等待,Leon可以輪流查閱狀態或者enable互斥器中斷。互斥器一般用於讀寫數據結構,如任務鏈表,或者訪問共享資源。

3.4.2使用方法:

獲得互斥器,運行互斥過程,返回互斥,在結束SHAVE運行前確保互斥器被釋放。

3.5SHAVE匯編

3.6SHAVE典型用法:

看eample代碼

3.6.1SIPP:

有一種典型的SIPP用法是與SIPP引擎結合使用。SIPP見SIPP User Guide。

4內存

4.2內存范圍:

CMX 2MB LEON訪問花費低 SHAVE花費低;DDR 128MB/512MB Leon花費高 SHAVE L1低 L2一般 隨機訪問花費高。

4.3CMX:

鏈接矩陣,由16X128KB片段(slice)組成,共2MB。
每個SHAVE對其自己的slice訪問時有更高的帶寬和更低的功耗;slice12-15不與任何SHAVE配對,可用於其他用途。slice歸屬是一種很弱的概念,每個SHAVE都能以相同的花費訪問CMX的其他slice。但是slice之間的路由資源是有限的,同時訪問各自歸屬的slice更節省功耗。

4.3.3CMX配置:

兩種配置:config0 for 硬件測試;config1 for應用開發。所有slice都是同樣的配置。

4.4數據布局優化:

防止SHAVE程序運行時阻塞。

4.4.2阻塞源及緩解方法

4.5帶寬:

4.5.1DDR帶寬:

MA2150使用DDR2 533MHz,理論帶寬為4GB/s.(533MHz*64bits?)

4.5.2片上帶寬:

獨立讀寫128/64bit意味着片上帶寬很少可能是限制因素。

4.6內存映射:

見debugger documentation。

5MDK 系統

5.1介紹:

概括描述編譯系統。編譯系統提供了建立應用的主要方法,含配置和功能目標。主要功能在共用makefiles中已經完成,但是小的操作還是必要的。

5.2編譯流程:

需要注意的是SHAVE代碼需要對每個工程分別編譯,每個工程可以有一個或者多個SHAVE應用。SHAVE C源文件通過內部開發的工具moviCompile編譯。

5.3主編譯目標:

MDK編譯系統包含一套可用的目標,以建立最終的執行文件。

5.3.2可用的目標:

目標按照各自的角色被分到不同文件。generic.mk,generalsettings.mk…等

5.3.3Mvlibs:

5.4Makefile:Leon code

5.4.1推薦的開始方法:

5.4.2包含MDK預先編譯流程功能:

每個應用程序的Makefile必須包含如下的共用定義(generic.mk)。

5.4.3調整編譯選項:

如果必要,直接在Makefile的末尾增加。

5.4.4包含組件:

組件可以簡單的通過在ComponentList變量中枚舉進行包含。如果組件中有SHAVE代碼需要在連接前包含到庫中,可以通過說明進行操作:SHAVE_COMPONENTS=yes

5.5Makefile:SHAVE代碼

5.5.1添加SHAVE代碼:

開始添加代碼時需要首先決定哪些應用程序(apps)是必要的。一旦apps被定義,對於每一個app,可能都需要從現存的例子中復制一套規則,比如從ShaveHelloWorld中復制。其中的一部分內容需要修改,可見此章說明。

5.5.2SHAVE應用程序的編譯規則:

不需要使用編譯庫和SHAVE組件的apps,需要遵循的規則;需要使用編譯庫和SHAVE組件的apps,需要遵循的規則。

5.6Makefiles:連接SHAVE apps到核:

一旦apps打包到各.mvlib文件中,這些apps就會放入核內並產生SHAVE庫,如例子shXlib,shvXuniqlib。並且需要枚舉這些mvlib到SHAVE_APP_LIBS變量內。
編譯SHAVE庫需要的規則都在通用makefiles內,用戶只需要定義要用的SHAVE_APPS。
每個SHAVE應用可以映射到任意SHAVE或者多個SHAVES。一個SHAVE可以用於多個SHAVE應用。

5.6.1使用shvXlib:

使用絕對地址和獨立符號防止apps到核內,需要使用shvXlib名稱增加該apps給每個SHAVE。例如:

5.6.2使用shvXuniqlib:

這個庫用於將符號合並到一個並共享。當使用shvXuniqlib文件,一個額外的規則需要放置到文件內。

5.7編譯系統功能目標:

除了編譯系統和提供配置選項,MDKmakefile結構也允許編譯一些功能目標來簡化開發。

5.7.1make help:

顯示幫助信息,包含剪短的目標描述

5.7.2make all:

發生改變后編譯目標

5.7.3make run:

編譯所有項並通過moviDebug在一個目標上運行。
…其他功能

6RTEMS:

講述集成到MDK內的RTEMS,如何在Myriad2上開發RTEMS應用,如何定制和擴展RTEMS。

6.3目錄結構

6.4寫RTEMS應用程序:

寫RTMES應用和寫普通MDK應用類似。
兩個附加變量需要被設置到RTEMS應用中:MV_SOC_OS和RTEMS_BUILD_NAME。
MV_SOC_OS變量用於通知編譯系統我們正在使用RTEMS。該變量默認設置為‘none’。對於RTEMS應用,變量值需要設置為‘rtems’。
RTEMS_BUILD_NAME用於選擇RTEMS編譯類型。目前提供兩種編譯類型:預編譯(prebuild)和定制編譯(custom)。選擇prebuild編譯類型時將使用prebuild RTEMS庫和頭文件來編譯應用程序,可以通過設置變量值為‘b-prebuild’來實現;設置變量值為‘b-custom’將使用從RTEMS源文件編譯得到的庫文件和頭文件。
注意:custom編譯只能在編譯完成RTEMS源文件后使用。否則編譯所需的這些庫文件和頭文件將無法找到。

6.4.1POSIX API(可移植操作系統接口API):

RTEMS實現了大部分的POSIX1003.1標准。支持許多POSIX過程,用戶及SUSP(Single-USer,Single Process)方式中的面向群的過程(group oriented routines)。
RTEMS可應用的完整的POSIX部分標准可參考RTEMS網站上的POSIX完整指南。
POSIX應用程序的默認程序入口點是POSIX_Init()。它可以通過定義變量CONFIGURE_POSIX_INIT_THREAD_ENTRY_POINT為其他值做更改。
POSIX應用所需的RTEMS對象的最大數量需要通過配置進行提供,配置變量為:CONFIGURE_MAXIMUM_POSIX_THREADS,CONFIGURE_MAXIMUM_POSIX_SEMAPHORES。
如果使用超過配置的對象數量將會導致運行錯誤。
注意:除了POSIX API外還可以使用經典的RTEMS API。其配置參數名與POSIX類似,需要注意不能使用錯誤。POSIX配置宏的名稱總是包含‘POSIX’,未包含的應該是經典RTEMS API。

6.4.2應用程序配置:

對於每個使用RTEMS的應用程序,至少需要提供一個基本的配置。配置信息包含:每個時鍾周期的長度,可創建的RTEMS對象最大數目,初始化任務,及應用程序的設備驅動。該信息存放於會在系統初始化時傳遞給RTEMS的數據結構中。樣表見文檔該章。

6.5線程處理:

通過POSIX API允許線程創建、配置和同步,RTEMS提供多線程支持。

6.5.1線程配置:

線程屬性可以通過傳輸pthread_attr_t結構給pthread_create函數來配置。C type可以用於控制調度策略。pthread_attr_t的成員不能被直接訪問,他們只能被設置或者通過POSIX API提供的函數來查詢。
RTEMS應用的兩種常用調度策略是:SCHED_FIFO和SCHED_RR。
SCHED_FIFO是一種先進先出調度策略,開始新線程前每個線程要依次運行完。
SCHED_RR是時間片輪流調度策略。每個線程有一個分配的時間片,一旦線程開始,它將運行直到分配時間結束或者被其他原因阻塞。線程配置的例子見本章文檔。

6.5.2線程示例程序:

MDK中有兩個例子使用POSIX線程:
mdk/examples/myriad2/HowTo/rtems_apps/simpleRTEMS_posix:一個運行兩個線程的簡單的應用程序,展示用時間片的方式切換線程。
mdk/examples/myriad2/HowTo/rtems_apps/simpleRTEMS_shave_async:一個示例展示如何從RTEMS線程中啟動SHAVES。示例中對一張圖片的上半部分和下半部分使用了兩種不同的處理方法。兩種方法運行在不同的SHAVES上,每個SHAVE從不同的線程開始。
第二個示例同時展示了阻塞正在運行的SHAVE線程的一種方法。這樣其他線程只能等到SHAVE返回的結果后才能繼續運行。為實現該方法,線程在使用旗語異步開啟SHAVE后被阻塞。可見本章文檔示例。
當表示SHAVE完成工作的中斷信號出現時,線程將被重回准備狀態。在中斷處理程序調用sem_post時,將會釋放旗語並喚醒阻塞的線程。

6.6編譯系統:

RTEMS的源代碼在MDK中已經包含並允許客戶修改。一些步驟需要被遵循以從源代碼中編譯RTEMS:make all、make compile- 、make all ENABLE_DEBUG=yes、make install等。具體見本章文檔。

6.7在兩個LEONs上運行RTEMS:

為在兩個LEONs上運行RTEMS,RTEMS_ON_BOTH_LEONS需要被設置為‘yes’。如果RTEMS_BUILD_NAME被設置為‘b-custom’使用兩個LEONs的應用程序將使用二進制文件路徑為:mdk/common/rtems/prebuiltcustom/build/myriad2:LeonOS需要使用的庫和包含文件來自於b-los路徑;LeonRT使用的來自於b-lrt路徑。
如果RTEMS_BUILD_NAME變量設置為‘b-prebuild’,兩個Leons將使用同樣的RTEMS庫mdk/common/rtems/prebuilt。

7MDK軟件:

MDK包含的通用代碼包括驅動、組件及示例應用。

7.2示例應用程序:

示例程序分為幾個子路徑:myriad1,myriad2和移動部分(portable)。Myriad1和Myriad2路徑有四個類別的示例:Demo,HowTo,Progressive and SIPP;portable路徑下不包含Demo。

7.2.2Progressive:

Progressive類別用於培訓學習。這些例子從簡單的Leon或者Shave打印開始,發展到復雜的並行計算或者DMA優化使用。

7.2.3HowTo:

該類別的示例展示了實現各種MDK軟件開發目的的例子。

7.2.4Demo:

僅包含MaxFlops示例,展示如何運行卷積核處理圖像,使用的SHAVE匯編代碼。

7.2.5SIPP:

包含基於SIPP的示例。具體可見SIPP用戶手冊。

7.3包含測試數據到應用程序:

Sparc-elf-objcopy用於包含原始數據到elf文件。

7.3.2步驟:

見文檔該章

7.4處理器內部通信:

LeonOS,LeonRT和12個SHAVES如何相互通信及在應用程序開發中需要跟蹤哪些東西。

7.4.2從SHAVE訪問Leon變量:

如果變量在Leon中被申明(int myvar[4]),SHAVE訪問它的方法是簡單的通過變量名:extern int myvar[4] (變量在OS中申明)或者extern int lrt_myvar[4](變量在RT中被申明),然后可以跟其他變量一樣使用。

7.4.3從leon訪問SHAVE變量:

假設同樣的變量myvar被連接到mvlib文件的應用程序所申明,並被放置到Shave3中。這樣,當從Leon訪問該變量時,需要使用的方法是:extern u32 someapp3_myvar[4]。然后使用someapp3_myvar如其他變量一樣。

7.4.4使用統一符號:

有時需要多個SHAVES使用相同物理地址的同一個變量。例如一個特殊的SHAVE函數或者變量需要被所有的SHAVEs共享。這樣可以通過統一符號來實現。這樣需要在SHAVE的mvlib文件中定義的變量不需要在shave3和shave4中定義為extern u32 someapp3_myvar[4],extern u32 someapp4_myvar[4]。而是將這個變量定義為myvar通過創建symuniq文件並用規則創建shvXuniqlib文件。可以參考Makefile規則的相關部分來了解使用細節。

7.4.5從Leon來使用SHAVE入口函數:

7.4.6LeonOS-LeonRT:

RT的入口函數作為RT的starting執行點,可以在OS側訪問,如:extern u32 lrt_start。

7.4.7LeonOS-LeonRT-SHAVES:

OS調用RT,RT調用SHAVE的方法。更詳細的信息在編譯過程中的創建mvlib部分。

7.5同步SHAVE運行函數和異步SHAVE運行函數:

同步運行需要調用如下函數void swcStartShave(),void swcStartShaveCC()。異步運行需要調用函數:void swcStartShaveAsync(),void swcStartShaveAsyncCC()。

7.6動態加載:

動態加載代碼到SHAVE核運行

7.6.2動態加載文件類型:

兩類可動態加載:‘Mbin’文件和‘shvdlib’文件。動態加載由庫函數swcShaveLoader完成。

8分析應用程序:

該部分主要目標是以分析執行速度信息為例提供一個基本的指導,涉及MDK軟件包的可選項並解釋其中的一些限制。該部分不提供所有的分析內容,比如:功率消耗分析,指令級並行等。

8.2分析myriad2 SHAVEs的硬件支持:

SHAVE處理器有2個64bit的硬件計數器可以配置用來計數各個指標。

8.3分析myriad2 SHAVEs的軟件支持:

swcTestUtils,使用詳細信息可以在doxygenated MDK文檔中找到。因為只有兩個計數器可用,為了計數所有指標必須多次執行相同的代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM