CCS Note 03: Using CLA Module to Run the Parallel Operation

Hsueh-Ju Wu 吳學儒
TI Code Composer Studio
10 min readJul 6, 2022

教學

如何使用F2837xD CLA模組

環境

本文使用
OS: Windows x64
Code Composer Studio Version: 11.1
開發板: LAUNCHXL-F28379D Development kit
C2000Ware_4_01_00_00 Example (v210版異常)

教學文章列表

參考資料

TMS320F2837xD Dual-Core Delfino Microcontrollers Technical Reference Manual

https://www.ti.com/lit/ug/spruhm8h/spruhm8h.pdf

LAUNCHXL-F28379D Overview User’s Guide (Rev. C)

https://www.ti.com/lit/pdf/sprui77

The TMS320F2837xD Architecture: Achieving a New Level of High Performance

https://www.ti.com/lit/pdf/sprt720

Section 1. 原理

Section 1.1 CLA模組特色

詳細可參考 Reference Manual p.672

  1. 可使用C語言撰寫程式
  2. 時脈與CPU一致(SYSCLKOUT)
  3. 特殊結構可獨立CPU外運作(平行運算)
  4. 可執行8個程式任務,可設定觸發源與對應CPU軟體中斷
  5. 部分CPU記憶體和外部設備可與CLA共享

Section 1.2 CLA記憶體介紹

詳細可參考 Reference Manual p.674

F2837xD Functional Block Diagram — The TMS320F2837xD Architecture p.2

CLA Program Memory
The CLA program can be loaded any of the local shared memories (LSxRAM) on the core.
(CLA程式需被加載在記憶體中執行,故此使用FLASH模式下,初始化CLA過程就需搬移程式進記憶體)

CLA Data Memory
Any of the device’s LSxRAMs can serve as data memory blocks to the CLA.
(CLA所使用之變數可以丟進LSx記憶體區段)

CLA Shared Message RAMs
There are two memory blocks for data sharing and communication between the CLA and the CPU on each CPU subsystem.
(分成兩塊CPU與CLA可讀可寫權限不同之記憶體,交換資料可利用此記憶體區塊)

two memory blocks for data sharing - Reference Manual p.674

Section 1.3 CLA記憶體匯流排介紹

CLA Memory Bus — Reference Manual p.675

由於CLA與CPU匯流排差異,所以須注意共享變數記憶體時須留意Address長度是否一致,若CLA與CPU有不同,需進行Alignment,否則將產生存取上問題,詳細請參考下列網址4.6節:

How are data types different on C28x and CLA?

https://software-dl.ti.com/C2000/docs/cla_software_dev_guide/faq.html?highlight=pointer#how-are-data-types-different-on-c28x-and-cla

例如:

For CLA an int is 32-bits
For C28x an int is 16-bit

For CLA a pointer is 16-bits
For C28x a pointer is 32-bit

Section 1.4 Tasks and Interrupt Vectors

  1. CLA有8個Tasks排程可程式控制,即8個CLA模組內的Interrupt vectors (MVECT1 to MVECT8),優先級Task1~Task 8由高至低
  2. 可由外部設備各別觸發(暫存器狀態MIRUN ,閒置flag MIFR clear)
  3. Tasks執行到MSTOP結束,暫存器狀態MIRUN被清除
  4. 此時可再觸發相應的CPU中斷
  5. CLA回歸閒置(MIFR set)
CLA (Type 1) Block Diagram — Reference Manual p.673

Peripheral interrupt trigger

由 DmaClaSrcSelRegs.CLA1TASKSRCSELx[TASKx] 控制任務觸發源

參考 Table 6–1. Configuration Options

Section 1.5 記憶體存取優先級與權限

若遇到CLA與CPU同時寫入讀取共同記憶體,則依照以下優先級處理

1. CLA WRITE
2. CLA READ
3. CPU WRITE
4. CPU READ

共享的記憶體CPU與CLA各別有以下權限

CLA to CPU Message RAM:

Allowed:
– CPU reads
– CLA data reads and writes
– CPU debug reads and writes

Ignored:
– CPU writes

CPU to CLA Message RAM:

Allowed:
– CPU reads and writes
– CLA reads
– CPU debug reads and writes

Ignored:
– CLA writes

Section 2. 程式範例

參考C2000Ware_4_01_00_00 - cla_matrix_mpy

程式概述,宣告x, y, z變數作為資料輸入(x, y)與資料輸出(z)
使用CLA進行矩陣運算z=xy,將結果存至z中

CPU程式是放在cla_matrix_mpy_cpu01.c中
CLA程式是放在matrix_mpy.cla中 (副檔名為 cla)
.cla檔名不可與主程式.c檔相同

Section 2.1 共用變數記憶體配置

由於此處資料輸入(x, y),是由CPU進行寫入,CLA讀取
所以是放入CpuToCla1MsgRAM區塊

使用 C 程式代碼:

#pragma DATA_SECTION([variable], ”CpuToCla1MsgRAM”);
[type] [variable];

將變數丟入記憶體共享空間

此處資料輸出(z),是由CLA進行寫入,CPU讀取
所以是放入Cla1ToCpuMsgRAM區塊

#pragma DATA_SECTION([variable], ”Cla1ToCpuMsgRAM”);
[type] [variable];

然後需在.cla檔中extern所需要共享的變數

之後操作起來就如同一般存取,沒有甚麼特別的,可能須注意資料型態,有些資料型態在CLA與CPU中記憶體長度不同,可能造成存取問題

Section 2.2 CLA記憶體初始化設定

CLA程式需被加載在記憶體中執行,故此使用FLASH模式下,初始化CLA過程就需搬移程式進記憶體,定義_FLASH即可啟用預設搬移程式

Section 2.3 CLA模組初始化設定

MVECTx 為 CLA內部中斷,即要執行的平行運算任務
CLA1_x_INT 為 CLA 運算完後觸發CPU之軟體中斷

可使用以下程式碼設定各別觸發源,參閱參考 Table 6–1. Configuration Options,無設定情況下預設使用軟體觸發(software trigger),須設定IACKE

For x = [1, 4]
DmaClaSrcSelRegs.CLA1TASKSRCSEL1.bit.TASKx = [trigger source];

For x = [5, 8]
DmaClaSrcSelRegs.CLA1TASKSRCSEL2.bit.TASKx = [trigger source];

Section 2.4 軟體觸發與CLA 斷點偵錯

Section 2.4.1 軟體觸發

此範例使用軟體觸發,在需觸發的時機使用TI包裝好的函式即可:

X = [1, 8] 指定要觸發執行的任務

Cla1ForceTaskXandWait();
//會等待CLA完成任務
//卡住CPU流程相當於Delay,失去平行運算優勢

Cla1ForceTaskX();
//不等待CLA完成任務,可展現平行運算優勢
//但須使用Flag控制好CPU程式流程

若有設定其他觸發源,則依照設定的條件會自動觸發

Section 2.4.2 CLA 斷點偵錯

示範影片:https://www.youtube.com/watch?v=tqIMIddpZ9g

重點提示

若偵錯時未掛載CLA,程式則不會卡進CLA斷點

若偵錯時未掛載CLA,程式則不會卡進CLA斷點

若偵錯時未掛載CLA,程式則不會卡進CLA斷點

Step1. 加入軟體斷點(Breakpoint)

不同於平常在CPU使用斷點偵錯使用Breakpoint
CLA需使用特定代碼加入斷點,並且在偵錯時主動載入CLA與Symbol
才可以啟用CLA斷點偵錯

C程式代碼
__mdebugstop();

Step2. 編譯進入DEBUG模式後掛載CLA core

按綠色小蟲 >> Debug小窗 >> CPU1_CLA1(Disconnected: Unknown)
>> 右鍵 >> Connect target

將顯示 0x00000000 (no symbols are defined)

Step3. 載入Symbol

工作列 >> Run 選單 >> Load選單展開 >> Load Symbols

直接OK即可

Step4. 開始RUN程式

記得切回去CPU1再RUN,不可在CPU1_CLA1下按綠色三角形
記得切回去CPU1再RUN,不可在CPU1_CLA1下按綠色三角形
記得切回去CPU1再RUN,不可在CPU1_CLA1下按綠色三角形

Debug小窗 >> 點 C28xx_CPU1 (Suspended — SW Breakpoint)
再按綠色三角形即可開始RUN程式

--

--