|
前言8 X. O2 u( A; \6 B
o& e7 \1 c4 c7 [- [- A% {0 l​
; m5 \1 i3 n8 T6 S* h 嵌入式領域的處理器已向多核架構迅速發(fā)展,ti公司的KeyStone架構的TMS320C6678是目前市面上性能最高的多核DSP處理器。TMS320C6678集成8核C66x DSP處理器,每個內核頻率高達1.25 GHz,提供每秒高達40 GMAC定點運算和20 GFLOP浮點運算能力;1片TMS320C6678提供等效達10 GHz的內核頻率,單精度浮點并行運算能力理論上可達160 GFLOP,是TS201S的50倍、C67x+的115.2倍,適合于諸如油氣勘探、雷達信號處理、圖像處理以及定位導航等對定浮點運算能力及實時性有較高要求的超高性能計算應用。6 Y6 Z; v) a7 |8 o
; v: n5 D3 p4 }; \/ V( ~​
* @) k0 Y* _& `1 |4 M
- E( }( q7 x# s0 l9 E) S9 n 然而,核間通信是多核處理器系統(tǒng)所面臨的主要難點,通信機制的優(yōu)劣直接影響多核處理器的性能,高效的通信機制是發(fā)揮多核處理器高性能的重要保障。
* x* S: x5 L- C 創(chuàng)龍科技(Tronlong)專注于DSP、ARM、FPGA多核異構技術開發(fā),本文為您介紹TMS320C6678處理器開發(fā)中比較常用的兩種多核通信方式:TI-IPC和OpenMP,以及多核編程注意事項。1 y2 U0 K) i; z# v6 T. Q% d: v
* ^$ G& E- H$ O* C1 硬件平臺4 ^) C' ^' d" x/ h
本文基于創(chuàng)龍科技TL6678-EasyEVM評估板進行演示。 \. Q+ |* n8 [7 u/ Z. s" f' z
" \7 d9 o0 I+ o0 ^) Y& ^7 p
TL6678-EasyEVM是一款基于TI KeyStone架構c6000系列TMS320C6678八核C66x定點/浮點高性能處理器設計的高端多核DSP評估板,由核心板與底板組成。核心板經過專業(yè)的PCB layout和高低溫測試驗證,穩(wěn)定可靠,可滿足各種工業(yè)應用環(huán)境。0 U1 H4 M1 ~& b2 e' W: X
評估板接口資源豐富,引出雙路千兆網(wǎng)口、SRIO、PCIe等高速通信接口,方便用戶快速進行產品方案評估與技術預研。) ^ U) Z1 |1 q
! _5 r8 o7 J, W2 q5 D( _3 I6 f​: |8 c, T" A, g2 T/ R
3 O1 W5 e$ H! ^9 ?TL6678-EasyEVM評估板# |7 Q: r: v8 E) C/ Z. R- x
* d+ E; m+ T" n" `# g開發(fā)案例主要包括:
! G* b" @7 E! D(1) 裸機開發(fā)案例 q! l" t; G, D6 \$ u
(2) RTOS(SYS/BIOS)開發(fā)案例
! {4 `7 b' f8 Q& O) z; l(3) IPC、OpenMP多核開發(fā)案例% s4 Q/ ], O" \5 V( D
(4) SRIO、PCIe、雙千兆網(wǎng)口開發(fā)案例* E! l1 m6 E: W# p8 b. v s' ]
(5) 圖像處理開發(fā)案例
, J* B$ x; Z" A0 Y1 d(6) DSP算法開發(fā)案例+ |0 J+ y/ d% e0 l# B7 j7 V
(7) 串口、網(wǎng)絡遠程升級開發(fā)案例+ a% f/ L1 E, F( J( M7 A( J# w
/ z/ X( I+ J# q! X& H# PC66x DSP視頻教程、中文手冊、產品資料(用戶手冊、核心板硬件資料、產品規(guī)格書)可點:site.tronlong.com/pfdownload 直接獲取。. V$ ~% i: q6 Q) w
- o: H% B9 B6 J! ~- o2 TI-IPC+ _; G0 ^# j7 E& [
2.1 簡介
- ?3 }: ^2 u/ M4 v( c9 v& R TI-IPC(Inter-Processor Communication)組件提供與處理器硬件無關的API,可用于多核處理器核間通信、同一處理器進程間通信和設備間通信。API支持消息傳遞、流和鏈接列表,它們在單處理器和多處理器中配置均可兼容。
: y! ~$ d9 W# q5 Y TI-IPC被設計在運行SYS/BIOS應用程序的處理器上使用,一般為DSP處理器(如TMS320C6678、TMS320C6657),但在某些情況下亦可能是ARM處理器。2 _8 f5 T5 Z7 x! E$ k2 t
' t! Q- O1 h% e4 ~1 K; |
​
6 x2 ~" l5 X& c- G! J' P
; [; x S+ h0 }% n, _' T9 E6 ~IPC常見的通信模塊如下:, p I" R4 z0 p% S" O, ?5 B+ L
表1
% c7 x( f, G) _3 S! j" ~/ K8 FIpc
+ P6 ?8 S1 Z; H2 K5 ?3 {. J | 提供Ipc_start()函數(shù),并允許配置啟動順序, G: W8 y7 W8 r" r% A
| MessageQ( s5 M# i: E3 e; W7 j
| 大小可變的消息傳遞模塊! B' w( o3 k4 B" ^- e. e
| Notify* l* k0 a" ?9 S j1 I
| 以中斷方式實現(xiàn)輕量數(shù)據(jù)傳輸的模塊
2 _. K3 v x3 W' u | ListMp0 h. [5 U; }9 Z' A, ?
| 用于實現(xiàn)對鏈接列表的互斥訪問
( V, ~2 f) T8 l6 s# O. [. ^, A | GateMp) q' w1 ~6 j* S
| 用于實現(xiàn)對共享資源的互斥訪問* ^9 f* v0 \5 ~$ O
| HeapBufMp( V) ^7 H. n$ s! W; S
| 大小固定的共享內存堆2 ~3 ^2 z7 c3 y
| HeapMenMp' q+ a4 C/ s! |4 H: \; l
| 大小可變的共享內存堆
0 S" D8 g! a8 h" k* a; p | SharedRegion( }3 r; U! o' f$ E
| 用于維護共享內存區(qū)域
: v. ^5 E4 O( |4 h- B | List
7 n. V4 T6 H$ F$ B | 用于創(chuàng)建雙向鏈接列表# v: E; @7 S3 [, R% Y2 w, z
| MultiProc
0 ?) j8 R V9 e9 R | 用于管理多核處理器核心ID6 q) s# ^5 Z; J* N* t; @
| NameServer% H6 m, a( G8 f5 A O
| 用于應用程序基于本地名稱檢索,以及存儲變量值
8 G/ ]+ `5 P& l. S: G* W% Y# A k |
2 t: e. O. F/ S: _& Q( F. q
0 y. Y0 a1 X2 u1 \" s- C5 c​
( v8 B- l* o& c3 b7 _+ W/ O, k' Y7 h9 o+ Z3 V, {
: \8 H- A" B, q6 N3 H
, [" h# b4 i9 V H2.2 常用模塊9 [- w. a/ A! A# T$ o1 p
2.2.1 MessageQ3 @0 u3 z+ L& c2 j4 h
該模塊具有如下特點:) c% `. b( p$ i* y( m" G4 a
(1) 兼容性強,可在不更改運行代碼的情況移植至另一個支持TI-IPC MessageQ的處理器或其他傳輸層(如Shared Memory、Multicore Navigator、SRIO)。
% r$ x8 S7 N3 b1 t- X(2) 支持可變長度消息的結構化發(fā)送與接收。
1 N) a9 z( N& A) y(3) 單個MessageQ隊列支持單個reader和多個writer。6 Y/ c8 k/ @' q9 b; e! ^! i: f
(4) 消息接收支持超時機制。
' n- `8 A L& A- G3 }1 U- k(5) reader可根據(jù)消息頭部信息對writer進行確認后再回復。
' X/ H$ v/ e+ ]1 N$ M$ }: b) x(6) Ipc_start()會幫助用戶完成下圖中灰色框內的功能,用戶僅需關注紅色框中的內容即可。
$ D6 S3 m0 v, F% F: K4 i7 r1 w% G7 r+ e4 c! V: _; U0 ]% r" O6 L
​% y( z* Z8 ]1 j8 y
7 _, V' B+ ~& C4 ?3 {0 z$ O
MessageQ通過消息隊列發(fā)送和接收消息。reader是一個從消息隊列中讀取消息的線程,writer是一個將消息寫入消息隊列的線程。每個消息隊列都有一個reader,但可有多個writer。
) ]' h$ T: x& X4 }' l9 E: G) U■ reader:調用MessageQ_create()、MessageQ_get()、MessageQ_free()和MessageQ_delete()。6 W! i! e: H6 [8 D8 m
■ writer:調用MessageQ_open()、MessageQ_alloc()、MessageQ_put()和MessageQ_close()。
; P5 r* E" _6 H9 j MessageQ常見的工作流程如下所示。
$ x6 x5 Y4 g! Y0 o% O: n$ _
8 W/ P, ^9 v3 ]# \2 C​
: ~! H8 ~. f/ ^
* B& C. f; c. J9 P ^- f; h: n/ r2 X$ o# }+ D+ I# n
下面以多核IPC通信的shmIpcBenchmark案例為例,分析代碼中MessageQ的使用,見圖中注釋。/ o0 q5 e$ P; D0 x) |
2 k! e/ g/ i* N" g
% O' h: ^( D W# G f
​7 @0 b5 R2 v& k, A
- F5 ~+ \- S) B1 T
5 h4 ?5 R9 v5 c​
- Y. K5 m. P! L6 Z/ Z2 e
$ s% v* {# F. W, U. g8 s3 ^: x9 d
! @7 j2 c% \0 a/ e3 k; V4 _. P4 X, B2.2.2 Notify
0 T9 @) w+ y6 `1 v( V4 I3 h該模塊具有如下特點:& {: Q5 }7 R$ ~8 ~0 [6 E
. ^# T7 y5 E u- b# Y s2 p
(1) 可獨立于MessageQ模塊進行使用。
- p: [8 v; f7 R6 d(2) 著重于多核通知功能,是更為簡單的多核通信形式。
1 ~, e9 G" \$ Z) S& _) O% x9 |; h( e( @
​% h7 U6 Z5 W `5 z/ P+ P$ U! S
1 z1 U7 Y7 ]2 ?; C
(3) 僅可基于Shared Memroy方式進行使用。' g0 C1 T# j0 Z( |
( C9 O2 [# h y6 `/ R' i6 y
​7 [. ?; w( [; ?0 B6 p; W
3 c. e; j* I2 A! C X% @
Notify通過硬件中斷傳輸消息,Receiver注冊Notify事件中斷,Sender通過Notify發(fā)送事件中斷,從而實現(xiàn)通知并攜帶小量消息的目的。) O) q P; x: T/ v, G
$ w0 J9 ~0 [2 B' U
■ Receiver:調用Notify_registerEvent()注冊事件中斷服務函數(shù)。
) z8 r6 |0 ~* Z1 X■ Sender:調用Notify_sendEvent()發(fā)送事件中斷。
% d* w" R$ g9 ~/ A1 m' q0 w
; W7 E2 X& |4 Q$ f& q2 u1 \- \: q/ D Notify常見的工作流程如下所示。
2 r+ h0 {7 c' J/ z0 I4 m! ~/ L9 L2 o2 Q; I& `$ C: ^" A, V
​
4 j8 t6 z7 k3 h' s$ G. i7 ^6 v0 }0 \
7 S3 U9 ~8 }) i8 N2.3 物理傳輸方式& j; @# ?! x8 q8 i; Y4 m
TI-IPC的數(shù)據(jù)傳輸需結合特定物理硬件與底層驅動,方可實現(xiàn)兩個線程在同一個設備或跨設備間進行通信。常用三種的物理傳輸方式包括Shared Memory、Multicore Navigator和SRIO,具體說明如下。) W" c# t( l& D$ ]
9 ?$ ~! Q, B D; g# ~2 D: S4 |8 w! W
表2# w9 S0 e1 n% b& F2 r
傳輸方式
( s9 G4 I3 s1 v" K1 H | 優(yōu)點
, h: v( [$ q. y$ d# ] | 缺點. a6 w( U! s3 W$ R# V# g+ r. K
| Shared Memory
) F# h$ n8 |% C | 使用簡單,速率較高
" \; m( [, b: o5 ~ | 僅可用于單個設備IPC通信,可能與其他使用Shared Memory的任務存在競爭- I- P; ^6 m" z/ B( l, _
| Multicore Navigator7 T" a' h% I8 Q: h4 b! {/ [
| 速率最高,消耗CPU周期最少
" x% {; d/ C( p- w' a! t) e) v | 僅可用于單個設備IPC通信; K$ ]2 {+ [1 f( w
| SRIO
! |3 J4 l ^+ S# q# l3 c$ }8 f D | 可用于跨設備IPC通信
$ e+ b Z+ ^( v* D | 速率最低
- v6 v+ b; L5 ^) Z3 n+ ] | & W: g. u I" F, S2 ^& I. u
下圖為使用Multicore Navigator、SRIO的API調用流程,用戶僅需關注MessageQ部分操作即可,其他模塊均由系統(tǒng)自動調用。
4 Y; Q' L! W2 w1 @, M7 E/ S; p+ Q# X: z: P+ o
8 t" n( ^0 b" i4 I
​! ]4 A3 i- M2 K0 c- J0 J3 j1 u
4 w' y4 `* I, I' e+ ?3 p$ T" W) @% d
, V% }$ a# \: a! e* x x. S​
3 d' a% _5 v: g0 n5 p
# o4 b0 s2 Q; x" r+ b
7 z) z4 E2 T1 B) j* t0 F. l3 OpenMP# ? x7 T; \( w( I
3.1 簡介OpenMP是一種多核開發(fā)軟件框架,其主要特性如下:
6 F3 ~0 ?& w4 O5 d4 R! k8 V(1) 可跨平臺使用,代碼兼容性強。
5 A8 ?4 ?) y4 O0 n; A(2) 以共享內存為通信基礎。+ p3 j8 ]( f5 p( g+ Y
(3) 支持C/C++以及Fortran語言。
' ?4 e9 R/ }' o9 R8 n$ G9 m, x(4) 一般基于SYS/BIOS運行。
3 B! s6 \0 p1 W# D/ ^2 C7 K( p$ @2 o' J! {
​: _# O3 ]) k9 l! ]# @7 W
& ?( q5 _4 p2 ?
3.2 基本語法
9 j$ c7 t1 p! u2 C1 j#pragma omp 指令 [子句 [ [ [,]子句 ] ... ]4 _( D6 I$ l5 [5 {5 w$ [9 B
{
- i. k4 J0 V7 {3 D...
8 _& q% j3 [" g- X# S}
1 B$ F+ W1 g7 z- Q" e1 n3 g9 H- v, t' L1 m. C6 ~6 B& X
表3
* a! ^9 B" p3 \& |指令
f* a. d/ F. A) c# s | 說明; Q) s9 B% m8 _/ L1 d1 P+ K' j& |% [) H
| parallel
( S; m3 F' ~& Z$ G0 M | 開始并行執(zhí)行語句: p t2 A# d! E0 z
| for% `6 T* y5 w3 I% ?& W* w) r, s
| 在多個線程中并行執(zhí)行for循環(huán)$ o3 k5 N) i5 ?; t5 [
| sections8 v, O! U9 l% |. j+ u
| 包含多個可并行執(zhí)行的sectone結構體* `; d3 l5 l6 A% @% K4 f
| single
7 C4 s1 M3 F, N3 ]' m6 g/ Z; i | 單線程執(zhí)行% ^4 h5 [0 f4 T1 S. S3 v
| master$ h8 R. ]2 s1 [1 Z7 L; d' } }3 H
| 主線程執(zhí)行1 {1 {& |5 m* K; q9 ~
| critical
/ j( Q; V7 K3 q" A; o. { | 任意時刻僅可被單個線程執(zhí)行
6 N& a3 q7 j! D, s- M7 _' M1 T | barrier
5 B* W! k* V0 x$ y | 指定屏障,用于同步所有線程
( N/ x, z7 V0 _ M3 t o | taskwait S- K* X! Q8 ~ l4 o- q
| 等待子線程完成
" j! m+ x; b9 T/ z3 d4 L | atomic/ ]% \8 w8 B) U& V3 G+ ?
| 確保指定內存位置執(zhí)行原子更新操作* N% a% G( c# Y
| flush
* }: V6 r8 r3 V+ u- v# { | 使線程當前內存數(shù)據(jù)與實際內存數(shù)據(jù)一致
|4 a# G+ b- R" g* j; N" E | ordered
" B7 C+ o) v! K1 e8 A( ]% k+ I | 并行執(zhí)行的for循環(huán)將按循環(huán)體變量順序執(zhí)行
' B6 K) t$ ?; \( m; x; @ | threadprivate
, W1 }' W- Q0 h( u ?3 e- ~ | 指定變量為本地存儲& G4 W+ [- P E# \
|
2 p: b% M6 \$ m7 k: z 表4+ n! w z8 b0 \/ D3 ^5 H% v
子句! g) D7 N/ B3 a/ Q
| 說明
7 A2 c' v1 T2 r1 L4 S | default% D* {+ a7 |! `+ j8 U% ?' s! E
| 控制parallel或task結構體中變量數(shù)據(jù)的共享屬性
- j# ]' U' i9 K0 n | shared
& H: i4 ` y: d3 k. V; g$ o* [7 a | parallel或task結構中,一個或多個變量為共享變量
3 t- e0 a' p, n: F | private
7 H0 H; b% [3 B" P | 一個或多個變量為本地變量) M5 J8 W( G2 Z# b5 q
| firstprivate f& O/ {' F5 }' O
| 一個或多個變量為本地變量,且變量值為并行結構執(zhí)行前的值) L' ~! a! c9 W) q) a
| lastprivate' f1 o2 e E9 ?. H
| 一個或多個變量為本地變量,且變量值為并行結構執(zhí)行后的值
! \5 T* R% S* y- l# x | reduction
" E% e/ _; w. j2 j: z | 一個或多個變量為本地變量,但變量值將根據(jù)不同的運算符來決定,執(zhí)行完成后變量值將被更新- y; V1 J) s* M/ c) U) D
| copyin- ] c$ c+ U1 [0 ` ?" ~
| 使線程本地變量值與主線程變量值相同+ c' v: `' a' c. R' z1 }2 }
| copyprivate" d5 U/ S/ M3 M9 D: d, ]: [5 j
| 使屬于parallel區(qū)域的變量值在不同線程中相同, M( H" Z1 N1 [1 s
| schedule6 Y* H& @( [' ~: U. w5 }# C
| 設置for循環(huán)并行執(zhí)行方式:dynamic、guided、runtime和static
7 z2 V* n4 H4 h" u/ J# Z | num_threads
. i7 _9 y, h5 ?, l | 線程數(shù)目
7 ?2 B1 Z& l+ J4 Z | if& m6 h7 V c. I; H
| 并行語句執(zhí)行條件
: g# b5 l! g! s' ]. {. y6 S | nowait
; M6 Y+ J6 T* s+ N1 P | 忽略線程同步等待$ M3 R7 G2 T0 s% Z8 T
| A# K( A/ |' G6 |8 L; }
以裸機的omp_matavec案例為例,使用場景的概要流程圖如下。# w+ e$ m, s; S6 h+ n
C66xx_0核心創(chuàng)建主線程,通過OpenMP框架加載matvec算法至C66xx_0~C66xx_7核心進行并行運算,從而減少C66xx_0核心負載,并可加快運算速度。" O4 k( B1 D3 s6 x8 [
0 z9 T+ |8 o1 c2 F1 V
- }% V) L* ]0 y% W/ `/ E$ k) w
​
: K; u v7 h/ X! a4 g, L; L {( K1 C
0 f0 Z* Z2 g! k4 Z. t6 w( x& ^1 v# T9 d
3.3 代碼分析# P9 n$ u/ J! ~( w! S9 w0 J
以裸機的omp_matavec案例為例進行代碼分析,見圖中注釋。
0 p" G9 f1 t: X, a
1 Q5 @0 D2 w+ E6 `- R5 K- x' N
. Q! n/ Q7 P3 A​
( i/ F6 S% Y2 t9 U" \# ^! S0 f( V: G
o: S6 h" ~" v/ z+ t' l# G4 多核編程注意事項7 a; v: @- t3 l5 G2 B" Q
4.1 多核單/多鏡像, Z, z; j# h( s( Y8 X1 p
在開發(fā)過程中,需將程序可執(zhí)行文件分別加載至對應的核心運行。此時需了解多核單/多鏡像的優(yōu)缺點,再根據(jù)實際情況進行選擇。' ?7 P' ~/ \; E# _1 {" b
多核單鏡像" X/ m# X3 }3 H" {
多核單鏡像指所有核心運行完全相同的用戶程序。" w# v9 q4 e) v' v$ m6 T( E
優(yōu)點:僅需維護一個工程,管理便捷。
1 g: e8 q6 [; i k% O缺點:需兼容多個核心代碼,程序可執(zhí)行文件較大。% z) y, T8 u% l! \8 V
; G$ v* Q: V) I/ F7 K多核多鏡像
& t ^5 s/ I) n- N- t' Y& |6 A; r; W多核多鏡像指不同核心運行不同的用戶程序。 _" k+ D+ E& G/ H% s, d+ \+ M! B
優(yōu)點:無需考慮各核心功能的兼容性,單個程序可執(zhí)行文件較小。0 d8 z# D3 z. q+ Y+ z8 r. g7 U `
缺點:需維護多個工程,管理不便。
' p" U2 E5 K" U+ `' G. _+ @ [- V" d3 o* q4 n& _5 o
# h% T0 l' {% Z' T& W* ^3 z
4.2 外設訪問: ]8 z/ ?3 Z6 ? p% U
所有核心共享外設,如SRIO、PCIe、Ethernet、SPI、I2C、EMIF等。在對外設進行初始化后,所有核心可在任意時間對外設進行讀寫,無需再次初始化。
8 W' F- I) m) {' A; B) |' ^8 P) a* F: q& `
​
1 d9 u, V! {8 l9 W9 s
, z( A; l4 H- C8 k3 y
: x5 L" ~3 F6 t y- G4.3 數(shù)據(jù)存儲
7 s% C6 }' {5 n6 G! q5 V4 G5 h# L. |(1) 注意區(qū)分全局與局部地址。6 Z/ i4 F* \0 ~9 `- f
L1/L2SRAM有全局與局部兩個地址,全局地址可被所有核心訪問,但局部地址僅可被指定核心訪問。
3 L: h& ^* [7 d- b% [1 } 以C66xx_0核心的L2SRAM為例,對應的全局地址為0x10800000,局部地址為0x00800000。C66xx_0核心使用0x10800000或0x00800000,均可訪問C66xx_0核心的L2SRAM。而C66xx_1核心使用0x00800000僅可訪問C66xx_1核心的L2SRAM,使用0x10800000方可訪問C66xx_0核心的L2SRAM。4 X @6 a* j% P- n: \* y* U
* e: K4 x% g" ~1 I0 ? {8 m L2SRAM全局與局部地址對應關系如下表:
! K% v. Y2 m! B! G 表57 R$ r) D( L6 G2 @% }
核心, c- J3 r5 @# a
| 全局地址
Q$ _4 f, y* g. ~. w8 c/ |* D | 局部地址+ p- a1 f8 r) }/ a
| C66xx_0
( d) ?3 n- b, f& h3 C | 0x10800000
8 z% U( I! l! X( ] | 0x00800000
& k4 Q7 j6 f8 [' \ | C66xx_1
8 k% |( N! @/ P q, q+ Y | 0x11800000+ t. P! t3 o: w. ^7 [6 E
| 0x00800000
. h# I4 f4 h: N5 O. o2 ~ | C66xx_2; M% H3 G8 T! j/ D) Z
| 0x12800000
m/ F) Z& Y. c; Z# p( P8 e | 0x00800000$ L8 ^" T! w9 X2 X
| C66xx_3
3 {: q( g) q$ Q7 u | 0x13800000
6 b1 X2 o' `% A | 0x008000004 e3 G4 d8 C' a8 y7 H8 Y
| C66xx_4$ [) G" n9 q/ m# ?* [; J# s) ]
| 0x14800000
/ @2 |0 u# ~. H: Y' k | 0x00800000
. P1 \9 |2 j; @8 U | C66xx_5
. E8 r% e0 d4 F+ e | 0x15800000
3 M% M4 X* B+ M5 q* y- t | 0x00800000
0 J7 s) {9 w3 ^$ Z* e1 F$ ` | C66xx_6
) j6 N6 s8 H! o9 w, E- | | 0x16800000
" y+ B8 ~3 x7 Z' J& \7 Q0 w$ v | 0x008000006 f+ V5 W0 q6 [' y4 T
| C66xx_72 G- b. W* d9 T- l
| 0x17800000) r2 o& F5 [ G- i/ G1 E
| 0x00800000 c: W: ]% j C* u
| r3 r1 Q, ]8 K+ ]
(2)注意避免內存沖突。. X9 e6 i6 |5 a$ l8 J
如數(shù)據(jù)需存放至MSMCSRAM、ddr3共享內存設備,請將對應內存劃分為MSMCSRAM_MASTER段(主核使用)與MSMCSRAM_SLAVE段(從核使用),從而避免運行時內存沖突。
/ |% r3 H6 R$ O" l, R
4 B6 I) k! w. V( U, \9 C5 r) |; }# c- z. m( L
% E8 j' k( ^0 q4 U2 \! J2 [* ]& y
​* d% ?2 K$ o0 a+ s
$ I$ O! E/ \7 ^! c' r5 參考鏈接; U* J+ d$ K- Q- z
-IPC
8 K5 ^) Q3 \' _0 mhttps://training.ti.com/system/files/docs/keystone-intro-ipc-slides.pdf% u1 X5 F/ j) L* G, x! o: ?1 U
http://software-dl.ti.com/processor-sdk-rtos/esd/docs/latest/rtos/index_Foundational_Components.html#ti-sdo-ipc-package% y, H% P9 @- B% r$ A/ ]
http://software-dl.ti.com/processor-sdk-rtos/esd/docs/latest/rtos/index_Foundational_Components.html#gatemp-support-for-uio-and-misc-driver
- q6 b! {/ G8 e% e, B& S! chttp://software-dl.ti.com/processor-sdk-rtos/esd/docs/latest/rtos/index_Foundational_Components.html#ti-sdo-utils-package N0 L2 l) C" S7 S( z
https://processors.wiki.ti.com/index.php/IPC_Users_Guide/MessageQ_Module8 P7 m9 k) w; U8 Z
7 C4 i0 q) P0 s% f-OpenMP
, a7 ?/ I, f/ Ohttp://processors.wiki.ti.com/index.php/OpenMP_on_C6000, ?" {! e( c% {0 h1 `- C
https://processors.wiki.ti.com/index.php/BIOS_MCSDK_2.0_User_Guide#OpenMP
2 ?) o2 C3 ~- b2 E7 Chttp://community.topcoder.com/tc?module=Static&d1=features&d2=091106
- [4 m" [$ ^$ o4 v) ~# A8 `( d$ u2 G
-Multicore Programming Guide
: `/ y7 b/ q6 b T$ Ohttps://www.ti.com/lit/an/sprab27b/sprab27b.pdf4 H8 k6 O+ x/ M/ P$ _
+ j8 l7 R& m0 e* [' C
6 免費試用
/ k, L& j6 H% N {" _- D可以直接到廠家官網(wǎng)免費申請TL6678-EasyEVM評估板進行快速評估。
% c8 B$ z/ j" v& W2 v7 h- D! C0 ?# U: N$ {' A
. K7 C& u) r; ~2 I; L9 D
* B$ r) w# _2 A" b T& f0 Q8 更多推薦
4 U; n4 H7 G2 Q基于IPC、OpenMP的C66x多核開發(fā)視頻教程
1 \3 r' M% t! d# K; f
5 c+ O) ~0 \) V, ^* W# J5 K" s: J# n* M" S+ ]
1 r7 h2 e+ Z3 J6 T+ P u
|
|