|
前言
7 T! S/ `. I) p7 i3 {( \1 R! } d5 g/ f5 Y) @0 \/ W' F
​
. f5 N; O6 {& G$ y2 v) s1 E 嵌入式領(lǐng)域的處理器已向多核架構(gòu)迅速發(fā)展,ti公司的KeyStone架構(gòu)的TMS320C6678是目前市面上性能最高的多核DSP處理器。TMS320C6678集成8核C66x DSP處理器,每個(gè)內(nèi)核頻率高達(dá)1.25 GHz,提供每秒高達(dá)40 GMAC定點(diǎn)運(yùn)算和20 GFLOP浮點(diǎn)運(yùn)算能力;1片TMS320C6678提供等效達(dá)10 GHz的內(nèi)核頻率,單精度浮點(diǎn)并行運(yùn)算能力理論上可達(dá)160 GFLOP,是TS201S的50倍、C67x+的115.2倍,適合于諸如油氣勘探、雷達(dá)信號(hào)處理、圖像處理以及定位導(dǎo)航等對(duì)定浮點(diǎn)運(yùn)算能力及實(shí)時(shí)性有較高要求的超高性能計(jì)算應(yīng)用。
& ~3 Q6 x3 w8 H# K6 N
! Z- {0 n' ^; {; T2 B! v; R4 m0 O​. k; c% Y7 u; s0 n7 p
9 w. |3 z r$ y$ p. W 然而,核間通信是多核處理器系統(tǒng)所面臨的主要難點(diǎn),通信機(jī)制的優(yōu)劣直接影響多核處理器的性能,高效的通信機(jī)制是發(fā)揮多核處理器高性能的重要保障。
( s; Y- `: H, k. e 創(chuàng)龍科技(Tronlong)專注于DSP、ARM、FPGA多核異構(gòu)技術(shù)開發(fā),本文為您介紹TMS320C6678處理器開發(fā)中比較常用的兩種多核通信方式:TI-IPC和OpenMP,以及多核編程注意事項(xiàng)。
5 }' x1 Y) j! L. M$ T7 d8 U p- P+ t4 e3 U6 Z
1 硬件平臺(tái)! o' N4 a8 s' t
本文基于創(chuàng)龍科技TL6678-EasyEVM評(píng)估板進(jìn)行演示。3 ], F, z& x4 u) n
! z) U5 M3 a# O6 ^5 b0 C8 S
TL6678-EasyEVM是一款基于TI KeyStone架構(gòu)c6000系列TMS320C6678八核C66x定點(diǎn)/浮點(diǎn)高性能處理器設(shè)計(jì)的高端多核DSP評(píng)估板,由核心板與底板組成。核心板經(jīng)過專業(yè)的PCB layout和高低溫測(cè)試驗(yàn)證,穩(wěn)定可靠,可滿足各種工業(yè)應(yīng)用環(huán)境。* J: D# w# ]% Z% v& E g
評(píng)估板接口資源豐富,引出雙路千兆網(wǎng)口、SRIO、PCIe等高速通信接口,方便用戶快速進(jìn)行產(chǎn)品方案評(píng)估與技術(shù)預(yù)研。
' p! Q6 [8 S5 G( O1 o4 {3 R' s; J3 J
​
) D" ? F+ J9 k: c- V8 l7 v6 S$ e$ [0 G8 S
TL6678-EasyEVM評(píng)估板& f; w d/ ~9 B& f( }2 g3 E
: ~( j9 A8 c I6 S# l
開發(fā)案例主要包括:
0 `8 O b4 q* z: {% `(1) 裸機(jī)開發(fā)案例
( x& k, a0 W' k! y: y* j(2) RTOS(SYS/BIOS)開發(fā)案例
0 h8 s9 f( c- M(3) IPC、OpenMP多核開發(fā)案例5 b" h, q7 F }7 l% N1 _
(4) SRIO、PCIe、雙千兆網(wǎng)口開發(fā)案例% V) r2 N& }7 p" W3 T
(5) 圖像處理開發(fā)案例
; p# Q8 [: M d* V1 m; [( Z" n0 O(6) DSP算法開發(fā)案例, {- Y! S/ C/ c
(7) 串口、網(wǎng)絡(luò)遠(yuǎn)程升級(jí)開發(fā)案例# j2 }0 a- \* r# M' M$ j- ?5 D+ q
& I' h" R: N, {/ U2 E1 Q, ]# x
C66x DSP視頻教程、中文手冊(cè)、產(chǎn)品資料(用戶手冊(cè)、核心板硬件資料、產(chǎn)品規(guī)格書)可點(diǎn):site.tronlong.com/pfdownload 直接獲取。
8 t1 [7 S1 z: B" r: }' u5 V" A5 \# M
2 TI-IPC# g8 N* C% G c( }4 N! U! ?
2.1 簡介; h5 o6 t! v( [! ^
TI-IPC(Inter-Processor Communication)組件提供與處理器硬件無關(guān)的API,可用于多核處理器核間通信、同一處理器進(jìn)程間通信和設(shè)備間通信。API支持消息傳遞、流和鏈接列表,它們?cè)趩翁幚砥骱投嗵幚砥髦信渲镁杉嫒荨?/font>; n$ O4 ~9 k0 t# u5 |
TI-IPC被設(shè)計(jì)在運(yùn)行SYS/BIOS應(yīng)用程序的處理器上使用,一般為DSP處理器(如TMS320C6678、TMS320C6657),但在某些情況下亦可能是ARM處理器。
9 M$ Q1 M" I; ]. I+ r0 A
1 \ M" P/ ?0 j% |4 S​
7 v5 e8 L( Y8 n3 S6 A* ?* q, ^% m5 `! H* f1 c, ?1 K! L- v/ s& X8 K
IPC常見的通信模塊如下:
0 c8 E- i* D) H7 D$ e表1
- `4 N3 Z; i) e: ~5 ^: K1 K& [6 c. x5 lIpc
7 h+ J* ^0 b* e. m | 提供Ipc_start()函數(shù),并允許配置啟動(dòng)順序
+ N/ ?7 ]/ t4 \ | MessageQ
) ]+ F0 m5 h) w$ R) n# x | 大小可變的消息傳遞模塊/ z+ z! x3 [6 [; p
| Notify: r( r9 E( ~/ D' L5 S* w
| 以中斷方式實(shí)現(xiàn)輕量數(shù)據(jù)傳輸的模塊
- V+ \/ _# _: G | ListMp
5 f* F: Z! ]; F9 a7 D | 用于實(shí)現(xiàn)對(duì)鏈接列表的互斥訪問, D; V, C: K! W+ X; T/ L6 e
| GateMp* E# G I: A( C# f, Q, B
| 用于實(shí)現(xiàn)對(duì)共享資源的互斥訪問; p- f7 Q3 ]; `1 q7 L) }3 a
| HeapBufMp9 P( G) z0 J( T; q9 G4 \
| 大小固定的共享內(nèi)存堆6 k& Z$ v3 o+ N: O, L6 a
| HeapMenMp7 |' s2 k3 V+ R3 O
| 大小可變的共享內(nèi)存堆
7 R" p& C& l2 G, [4 a2 B& \* y | SharedRegion
( D9 `2 Q( P7 K/ c$ p | 用于維護(hù)共享內(nèi)存區(qū)域# Z+ k; B/ M4 c- Q1 O
| List* F$ I1 z) R' O+ Z* F' L
| 用于創(chuàng)建雙向鏈接列表
( X/ y; u+ |: \5 a1 a0 w | MultiProc+ C, ]$ i% h _* d: ?6 e% s
| 用于管理多核處理器核心ID2 u N h; p4 h* D' x
| NameServer, z. s4 d: i& a8 I1 @
| 用于應(yīng)用程序基于本地名稱檢索,以及存儲(chǔ)變量值
. p2 N6 r) C$ r5 q4 M | ; h9 T L; Z! e: z: L! |/ {
4 O; c; Q7 z7 T9 T" }$ K
​, \; u7 ^- c' j0 K) [
8 Y7 ?$ U! |# s5 O! a+ ]4 T D( g/ E; t( H) ~
5 ]) o! Z5 d+ i9 \$ x& d8 X
2.2 常用模塊+ v5 Q6 N+ d$ Q- l
2.2.1 MessageQ3 a" V6 I" f, E7 ^1 F+ K0 W
該模塊具有如下特點(diǎn):. L, j3 m+ S& |; |
(1) 兼容性強(qiáng),可在不更改運(yùn)行代碼的情況移植至另一個(gè)支持TI-IPC MessageQ的處理器或其他傳輸層(如Shared Memory、Multicore Navigator、SRIO)。
5 t i p% Y9 ^0 l3 R/ I(2) 支持可變長度消息的結(jié)構(gòu)化發(fā)送與接收。
" s2 C( [2 T1 k; T% r; u* ~- Z(3) 單個(gè)MessageQ隊(duì)列支持單個(gè)reader和多個(gè)writer。# H( W3 D% l7 E' |- K
(4) 消息接收支持超時(shí)機(jī)制。) [( F$ R8 h. E% ]: f
(5) reader可根據(jù)消息頭部信息對(duì)writer進(jìn)行確認(rèn)后再回復(fù)。4 t" s2 T7 S/ {% W4 H- H+ Q+ Q
(6) Ipc_start()會(huì)幫助用戶完成下圖中灰色框內(nèi)的功能,用戶僅需關(guān)注紅色框中的內(nèi)容即可。
+ t* S' Y y) J# ^8 G& t9 {' Q F( x7 I+ n) K6 r: h
​
+ M7 C/ N) E$ M
2 Q0 d4 p8 Y$ T: x4 E+ t& x MessageQ通過消息隊(duì)列發(fā)送和接收消息。reader是一個(gè)從消息隊(duì)列中讀取消息的線程,writer是一個(gè)將消息寫入消息隊(duì)列的線程。每個(gè)消息隊(duì)列都有一個(gè)reader,但可有多個(gè)writer。2 ^3 X( b/ n' M6 R; q! f, Y. D
■ reader:調(diào)用MessageQ_create()、MessageQ_get()、MessageQ_free()和MessageQ_delete()。9 r7 M4 N; [6 t! [& ?3 S6 y* u; k0 O
■ writer:調(diào)用MessageQ_open()、MessageQ_alloc()、MessageQ_put()和MessageQ_close()。
; g; q; z% I, ]' \# c* | MessageQ常見的工作流程如下所示。
4 \# D" S# G; O0 L2 k* V9 `. d/ P
​
4 L$ z4 X' f6 x: C& B6 h0 h7 A) a
- @- H: [5 c9 f6 V1 m* e2 j
下面以多核IPC通信的shmIpcBenchmark案例為例,分析代碼中MessageQ的使用,見圖中注釋。% f& w# c9 I# i& |3 K' v
0 H) U8 w; z: C& V5 v
$ R \* u5 d3 f3 L1 s
​) `6 R/ b1 D! s& k; D6 s
5 E( n' j2 N ~( I* n x
4 k( z: a$ g9 g) ?7 y0 A9 i4 x- B​
& U+ r/ h, T+ O. |5 \
" o0 f2 k/ Q# X2 F) b1 f3 J. V; M" C
2.2.2 Notify1 B" O$ h8 T. U$ ]
該模塊具有如下特點(diǎn):0 X; [; _0 q9 g/ o# ^9 D1 T
( D7 V6 S: y8 [$ {+ [4 r
(1) 可獨(dú)立于MessageQ模塊進(jìn)行使用。
; @; B2 T z& S- E- k(2) 著重于多核通知功能,是更為簡單的多核通信形式。
" ^" d% r. b. s
2 n! b- r# y! Q L e4 J​
0 Z- q: M* L5 j8 Z& W# O4 o' N0 Q" n% Z' O/ `& R" X, R
(3) 僅可基于Shared Memroy方式進(jìn)行使用。
# x0 x3 N/ f P, b1 U+ d1 u! G# m( U' q- Z m
​0 X) v3 f1 P5 P! W7 L5 d
% ~% _& h4 r1 V" Q9 Z4 T9 I$ J6 b Notify通過硬件中斷傳輸消息,Receiver注冊(cè)Notify事件中斷,Sender通過Notify發(fā)送事件中斷,從而實(shí)現(xiàn)通知并攜帶小量消息的目的。
5 W5 p0 T& N' b% _% p7 u7 b
* l. Q. x6 C# F6 l4 |- Z- ^/ L■ Receiver:調(diào)用Notify_registerEvent()注冊(cè)事件中斷服務(wù)函數(shù)。
" R4 M8 s# X4 U# f■ Sender:調(diào)用Notify_sendEvent()發(fā)送事件中斷。
0 I: t7 c# x# h7 H" |- u* A8 c9 d' A8 y
Notify常見的工作流程如下所示。+ r) w. @& b9 X" g
( _7 H1 B% B, J1 T8 ? Z! S: F: b​
! x4 N+ K. z3 a0 ]6 S. q# |4 W) h/ B- e6 \
- A. m) l- |5 T: U7 ~2.3 物理傳輸方式 [, D) W0 L: Q/ |6 E
TI-IPC的數(shù)據(jù)傳輸需結(jié)合特定物理硬件與底層驅(qū)動(dòng),方可實(shí)現(xiàn)兩個(gè)線程在同一個(gè)設(shè)備或跨設(shè)備間進(jìn)行通信。常用三種的物理傳輸方式包括Shared Memory、Multicore Navigator和SRIO,具體說明如下。1 k2 O" L4 X( G+ c5 }, ?. M
: u/ S# y& \4 U/ c- I* r% N
表2
/ _% v/ R. C! e0 Y7 ]; ?( V( m傳輸方式
6 p! A. m% r' e7 t | 優(yōu)點(diǎn)% s# q o* C/ O) \6 v0 d
| 缺點(diǎn)4 K* @. \) s% {' X8 L
| Shared Memory
. H$ s0 N n% b$ Y | 使用簡單,速率較高9 Y3 m/ {3 J1 {4 F1 X, ?! C
| 僅可用于單個(gè)設(shè)備IPC通信,可能與其他使用Shared Memory的任務(wù)存在競(jìng)爭(zhēng)
1 J* j+ f4 W* Q | Multicore Navigator
! w. X$ G4 g5 U+ ^6 V/ z | 速率最高,消耗CPU周期最少 ?$ T! l6 W& {( {: t6 X
| 僅可用于單個(gè)設(shè)備IPC通信4 n( b) \- u- W
| SRIO7 l" s5 b" @, Y* H B7 T+ Z
| 可用于跨設(shè)備IPC通信
+ ~6 `, I* J* C( y% z! N | 速率最低
" {, Z7 B1 b- O* `) S4 ^% N. V- C( S | , d( O+ U. U1 i7 U$ f& R
下圖為使用Multicore Navigator、SRIO的API調(diào)用流程,用戶僅需關(guān)注MessageQ部分操作即可,其他模塊均由系統(tǒng)自動(dòng)調(diào)用。
% [- J1 i; f: J( G1 D- p, W2 H- n: B, O- o
1 E0 \; B. B! u8 T​9 g2 }6 x. r) \
0 S h3 ? D( g& a+ S, u
, i" T4 @0 O/ j' Q) }
​$ r5 `0 ]- o% g! c( B4 N8 t
( V6 `4 z& ~* q
% _9 e% M r4 K2 @3 OpenMP
& ~) v0 b. J% J0 i' `$ x" ?/ p3.1 簡介OpenMP是一種多核開發(fā)軟件框架,其主要特性如下:% i- a! J; l: d3 G! {. F
(1) 可跨平臺(tái)使用,代碼兼容性強(qiáng)。7 x- f: [4 \) f
(2) 以共享內(nèi)存為通信基礎(chǔ)。# {4 ]5 ~* V- S' g1 V
(3) 支持C/C++以及Fortran語言。
& N3 E g" }$ N0 _+ E' D# {(4) 一般基于SYS/BIOS運(yùn)行。
# t' Z6 R) I( x& X V6 }3 a9 N8 Y
; w7 S M' z. g8 z; J$ Q# N$ y' P​. o! ]9 q6 m/ {8 w1 _
3 a1 F9 b j' V3.2 基本語法
$ x7 M0 R# F% O# ^+ X: U#pragma omp 指令 [子句 [ [ [,]子句 ] ... ]
- f4 o) g7 D# \; C3 b1 V' C{
5 I7 B3 h- O- b2 A6 Q: u...& a' G$ H- K8 H V" x
}
4 z8 n6 O) o5 I. D- B- z/ V: S- V% ^
表3
# a4 ?) j& l, Y6 K* N8 h指令
q: l3 b+ Y0 L9 a0 ^& A* d, A0 E | 說明
9 l2 W# b+ H) ] M2 ~' t | parallel3 I1 h! n3 I, H7 z4 W9 X2 ?: N
| 開始并行執(zhí)行語句
5 v6 O, t8 E5 ~9 |1 R% n, ] | for
8 s; F& }4 l: B5 `" U | 在多個(gè)線程中并行執(zhí)行for循環(huán)( n5 a; m1 F' }
| sections
+ {/ M/ W2 v2 R3 d; g | 包含多個(gè)可并行執(zhí)行的sectone結(jié)構(gòu)體% g: R2 n$ m. ^% v
| single
+ Q) B4 A% v, a' ~; h/ K | 單線程執(zhí)行
9 Y; B, k( E$ h6 E | master
% N1 ?/ O* }, D( D5 ?+ B | 主線程執(zhí)行
+ Q6 e% G- _8 U9 N% c( E4 T | critical* d" V- u/ Y2 r. v
| 任意時(shí)刻僅可被單個(gè)線程執(zhí)行
' a# `5 \, \/ F7 \! l% d2 H | barrier
" Z& B- |8 D# j& y- f+ C9 [ | 指定屏障,用于同步所有線程, m! ~8 R9 i) ~' Q0 C
| taskwait1 o% t/ E5 Y& T" s2 k* J
| 等待子線程完成& A) I9 W `7 M& z
| atomic4 `: t9 f- @& ?6 |6 R$ G) l/ w
| 確保指定內(nèi)存位置執(zhí)行原子更新操作
# x' q" l2 [& L/ i3 x | flush$ ~8 J$ d* I3 W( B {# C
| 使線程當(dāng)前內(nèi)存數(shù)據(jù)與實(shí)際內(nèi)存數(shù)據(jù)一致2 I+ _+ k# \5 n, n+ i
| ordered0 v1 n) T) { i: {& {
| 并行執(zhí)行的for循環(huán)將按循環(huán)體變量順序執(zhí)行7 V& e8 R1 E! z7 O$ ?, r8 j
| threadprivate* O ^% p# c! t. t1 [: q) S3 d
| 指定變量為本地存儲(chǔ)4 c: I% n. A& F5 l* p& |
|
$ @2 d& I! \# W6 U 表4
' w, b3 ^! G0 V8 ~' v+ k) D子句5 A9 w _. f9 ?4 O$ f& s
| 說明
% Y( q$ q M% G- x8 {7 V( L8 U | default
% x4 E+ ~; b8 ` \* u2 x | 控制parallel或task結(jié)構(gòu)體中變量數(shù)據(jù)的共享屬性! a t; k/ c" s: J! O9 O
| shared' @' V: `- z# w5 O' e/ Z
| parallel或task結(jié)構(gòu)中,一個(gè)或多個(gè)變量為共享變量
( i7 p! L' [. ?0 }; u4 o | private
5 L. J: `( \4 {" D5 q# G1 Y | 一個(gè)或多個(gè)變量為本地變量
V. m d P) Q7 X q4 M* x3 _ | firstprivate$ u* a, E! Q$ P. E) ^; t: T' l
| 一個(gè)或多個(gè)變量為本地變量,且變量值為并行結(jié)構(gòu)執(zhí)行前的值- l0 b+ ]1 U# L7 ^ h0 i/ y
| lastprivate8 e- L+ @) C" Z
| 一個(gè)或多個(gè)變量為本地變量,且變量值為并行結(jié)構(gòu)執(zhí)行后的值: G2 d( M2 ^" b4 n- D: t5 s. k
| reduction z2 w- U6 ^( t# |6 W
| 一個(gè)或多個(gè)變量為本地變量,但變量值將根據(jù)不同的運(yùn)算符來決定,執(zhí)行完成后變量值將被更新
2 i- B3 d% k$ M1 A | copyin4 K: d7 q0 E% J% P9 I$ U. B
| 使線程本地變量值與主線程變量值相同
- `6 h- {# ~, j4 M7 u# o | copyprivate, B% R; g* }0 b, p
| 使屬于parallel區(qū)域的變量值在不同線程中相同" E( x) X- T, b$ `6 @+ t8 w
| schedule' ^6 _& V& j! ~
| 設(shè)置for循環(huán)并行執(zhí)行方式:dynamic、guided、runtime和static
9 H% H+ R& z" r+ E1 U | num_threads
% _- x8 N' y5 \ J) o | 線程數(shù)目
! {; B$ Z7 k6 r5 S; h* k | if/ V) h6 u# G4 |& |4 }9 @2 v7 V
| 并行語句執(zhí)行條件
' N6 _% |- ]9 L | nowait# N0 B8 L8 \$ m4 `
| 忽略線程同步等待8 ~: T( q! c% Y0 J1 h+ j! _
|
5 W! ^9 ?' V% |# @4 \% h" O 以裸機(jī)的omp_matavec案例為例,使用場(chǎng)景的概要流程圖如下。
9 N* L; e3 A1 ^4 Z C66xx_0核心創(chuàng)建主線程,通過OpenMP框架加載matvec算法至C66xx_0~C66xx_7核心進(jìn)行并行運(yùn)算,從而減少C66xx_0核心負(fù)載,并可加快運(yùn)算速度。- G4 b' f: \6 w% ^* T4 c
8 X9 w2 K( b ^" f1 G1 V
+ E, j( K& X- j. n! a1 S/ C! J6 y​
! t6 C4 G# ?* g" K/ E! O* P
4 g' U6 z* u1 l S( ~ A( L r. b) y# W2 R* V7 D
3.3 代碼分析; ]# i0 y, w- {7 k3 d
以裸機(jī)的omp_matavec案例為例進(jìn)行代碼分析,見圖中注釋。1 m5 i" a" ^, R4 q, x+ `, a& h( x
3 g5 }7 N+ V5 T) `: t3 |
- o& f I0 ]3 v; E) o​
; w4 M; Z) J5 `3 k- e2 {0 M0 u8 D) z
6 @$ K) K5 ?+ V
4 多核編程注意事項(xiàng)
: I' ^7 z9 r9 Z4.1 多核單/多鏡像
$ l/ ^) P8 t& m' b# @ 在開發(fā)過程中,需將程序可執(zhí)行文件分別加載至對(duì)應(yīng)的核心運(yùn)行。此時(shí)需了解多核單/多鏡像的優(yōu)缺點(diǎn),再根據(jù)實(shí)際情況進(jìn)行選擇。
1 U) i1 h: l5 d% F M0 _6 V: |多核單鏡像
4 z/ \9 b& [9 J多核單鏡像指所有核心運(yùn)行完全相同的用戶程序。) Y: w# m% `0 L1 |- W- c! W6 F
優(yōu)點(diǎn):僅需維護(hù)一個(gè)工程,管理便捷。
! ?% K8 j) |3 ]5 T! ~缺點(diǎn):需兼容多個(gè)核心代碼,程序可執(zhí)行文件較大。8 g: D* _8 f4 |5 [1 a3 N3 k& \6 E
' |$ x9 J# _, _4 W! z' w8 a" y9 x9 b- j多核多鏡像
. B3 R7 P, o* @0 [2 Z, G o多核多鏡像指不同核心運(yùn)行不同的用戶程序。
9 s7 e% y5 @" _優(yōu)點(diǎn):無需考慮各核心功能的兼容性,單個(gè)程序可執(zhí)行文件較小。+ G( M+ f4 u8 V7 r5 ~: h! C
缺點(diǎn):需維護(hù)多個(gè)工程,管理不便。
3 W A3 l7 O3 R" }* A `* H! Z) U# |" C6 d4 p0 J% z% {/ _
6 j* g! ~3 t- U+ x: v/ V& q3 R2 A
4.2 外設(shè)訪問
$ o, S* R0 r! q2 V* [% w 所有核心共享外設(shè),如SRIO、PCIe、Ethernet、SPI、I2C、EMIF等。在對(duì)外設(shè)進(jìn)行初始化后,所有核心可在任意時(shí)間對(duì)外設(shè)進(jìn)行讀寫,無需再次初始化。
! j2 {; q* B' u2 ]0 f7 L
9 q5 t2 l* p8 ]3 Z$ y6 Y& k' h! k​" y% ?7 a5 }8 L" V8 |
! A4 b# R+ L& W. B4 {( O; y' t4 `2 f
4.3 數(shù)據(jù)存儲(chǔ)
( E5 {: Z* l! M6 V% i(1) 注意區(qū)分全局與局部地址。
+ a M! j: s% ~) ]* c: K$ ?" X$ a" E L1/L2SRAM有全局與局部兩個(gè)地址,全局地址可被所有核心訪問,但局部地址僅可被指定核心訪問。
7 E* E2 E! N; L+ Z" }4 Y6 [$ z 以C66xx_0核心的L2SRAM為例,對(duì)應(yīng)的全局地址為0x10800000,局部地址為0x00800000。C66xx_0核心使用0x10800000或0x00800000,均可訪問C66xx_0核心的L2SRAM。而C66xx_1核心使用0x00800000僅可訪問C66xx_1核心的L2SRAM,使用0x10800000方可訪問C66xx_0核心的L2SRAM。
2 v1 ~, X, `. f# a3 |/ h7 O7 i& h* `; F4 { a
L2SRAM全局與局部地址對(duì)應(yīng)關(guān)系如下表:1 x4 z6 A/ \7 G: m/ \+ k* E$ l+ S# \1 y
表5
, N$ B `: q) ]- B/ B5 d+ J核心, ^/ C l' k0 @
| 全局地址
0 }2 K" J k0 K- i | 局部地址9 A5 \5 i4 ~" U6 r5 X G: X1 J
| C66xx_0
1 D& L! E9 v) I5 Z1 ` | 0x10800000
( }! [, ?" P0 V4 e | 0x00800000
$ g$ C' ~* m6 t | C66xx_1$ f1 M( b8 Q, \% R( x0 `
| 0x118000002 z! ~: o* y( ?4 G, ^: V( t' ]6 I7 L- ~
| 0x008000007 r* f7 B `' x& }% Y
| C66xx_21 o$ T* d3 T0 N& i9 C% w
| 0x128000002 c! T" g4 R& }# K
| 0x00800000) t1 a& B( ?2 b' Y) J; l- c' }
| C66xx_33 h2 ^9 w" I% C* D
| 0x138000007 \1 ~. W, p4 h8 r
| 0x008000009 t0 y3 W8 c# z& E# ~$ {8 A! g! m( C. ?
| C66xx_4
& E9 \- ]! g7 v' E1 N" B | 0x14800000, b: j, |* f6 C+ d1 P6 U$ T
| 0x00800000
5 F: z/ ^& `# P | C66xx_5: m6 T6 A# C# a' K& Q G
| 0x15800000
. ?3 @+ s7 J1 s) e2 R2 F* _. U | 0x00800000
: R9 @4 u5 ?, Q1 l5 v1 C; j0 x8 u | C66xx_6
" p' T. g: Z( i8 N | 0x16800000# o$ l+ k- `8 t. h* a
| 0x008000009 c5 U$ c# y, z; f9 n! q: a
| C66xx_79 C. ~3 p6 t/ b X) ]
| 0x17800000
. @" r- }: m( N4 k | 0x00800000' m: N+ ~1 d: o; D/ u5 l+ a( A: j
|
( C4 D' s: Y7 t$ d8 H4 i2 u(2)注意避免內(nèi)存沖突。
8 Z3 }0 w8 o( Z/ Y9 a如數(shù)據(jù)需存放至MSMCSRAM、ddr3共享內(nèi)存設(shè)備,請(qǐng)將對(duì)應(yīng)內(nèi)存劃分為MSMCSRAM_MASTER段(主核使用)與MSMCSRAM_SLAVE段(從核使用),從而避免運(yùn)行時(shí)內(nèi)存沖突。
- x+ Z# q0 ~* Y1 l: D2 b# ]6 x8 C: v( V
, O: d2 |( _( W* b$ k+ {
# [ V o: r3 y- F/ ?* |​
/ u7 K$ a$ m- o$ E1 }) x3 k, J: U7 w
& ~$ E ?0 R3 {0 s' C5 參考鏈接
. s& Y, \- c; `4 H-IPC
z8 \; \6 D5 g* m6 I& n1 Ahttps://training.ti.com/system/files/docs/keystone-intro-ipc-slides.pdf
0 u; R, j$ b- shttp://software-dl.ti.com/processor-sdk-rtos/esd/docs/latest/rtos/index_Foundational_Components.html#ti-sdo-ipc-package, ], r: @4 o, s5 G
http://software-dl.ti.com/processor-sdk-rtos/esd/docs/latest/rtos/index_Foundational_Components.html#gatemp-support-for-uio-and-misc-driver
. j8 x! H/ h, E, O7 ?( c& Ohttp://software-dl.ti.com/processor-sdk-rtos/esd/docs/latest/rtos/index_Foundational_Components.html#ti-sdo-utils-package) j- e( h, D" Z; Q5 X) W- {
https://processors.wiki.ti.com/index.php/IPC_Users_Guide/MessageQ_Module5 U: ?8 z! @7 ~: J
# m4 `: M' c5 z( R9 b4 {
-OpenMP/ t1 _% a+ w3 X: z# O2 l5 X5 q; o$ e! V; E
http://processors.wiki.ti.com/index.php/OpenMP_on_C60006 R$ P. b$ ?! P8 ?! Z' n# [
https://processors.wiki.ti.com/index.php/BIOS_MCSDK_2.0_User_Guide#OpenMP
8 B' L+ A! Y8 G! V |, Qhttp://community.topcoder.com/tc?module=Static&d1=features&d2=0911062 |) {( D2 h* B: v, y
B4 U$ S8 k% w* H- I
-Multicore Programming Guide5 J Q; X% D5 D. v- S* h# S5 O
https://www.ti.com/lit/an/sprab27b/sprab27b.pdf) A4 E# `- O4 ~
/ Y/ L* L+ V3 T4 k1 B/ B
6 免費(fèi)試用
' T E Y, G7 N可以直接到廠家官網(wǎng)免費(fèi)申請(qǐng)TL6678-EasyEVM評(píng)估板進(jìn)行快速評(píng)估。- r9 a0 u# W8 t+ ^8 Q
/ I$ h, X9 m% `% U* w, D' h; c( a) A9 T' G( T$ j1 t8 Z
1 [+ X3 m. c# }8 R8 y$ j
8 更多推薦8 x; J" s, Z+ B( y
基于IPC、OpenMP的C66x多核開發(fā)視頻教程, ~+ @7 G2 o3 n
: \7 s5 w8 F0 C4 F; J
8 F7 N% l' K* Q5 ?" F4 I
& X3 ?$ b" m) D5 A6 d9 f
|
|