6678 多核啟動

2021-10-19 15:04:02 字數 3285 閱讀 9611

6678多核載入啟動實現主要是通過0核完成。

具體實現是dsp上電通過i2c, spi, emif等介面將應用程式載入到核心0執行,然後在核心0執行**裡實現另外7個核的啟動位址指定和傳送ipc中斷喚醒其餘7核。

啟動實現詳見如下:

1、暫存器定義

// corepac0-7 ipc 觸發暫存器(ipcgrx)

#define ipcgr_0_regs (*((volatile unsigned int *)(0x02620240)))

#define ipcgr_1_regs (*((volatile unsigned int *)(0x02620244)))

#define ipcgr_2_regs (*((volatile unsigned int *)(0x02620248)))

#define ipcgr_3_regs (*((volatile unsigned int *)(0x0262024c)))

#define ipcgr_4_regs (*((volatile unsigned int *)(0x02620250)))

#define ipcgr_5_regs (*((volatile unsigned int *)(0x02620254)))

#define ipcgr_6_regs (*((volatile unsigned int *)(0x02620258)))

#define ipcgr_7_regs (*((volatile unsigned int *)(0x0262025c)))

// 核0~核7 魔術位址(l2位址後4位元組)

#define core_0_magic_addr (*((volatile unsigned int *)(0x1087fffc)))

#define core_1_magic_addr (*((volatile unsigned int *)(0x1187fffc)))

#define core_2_magic_addr (*((volatile unsigned int *)(0x1287fffc)))

#define core_3_magic_addr (*((volatile unsigned int *)(0x1387fffc)))

#define core_4_magic_addr (*((volatile unsigned int *)(0x1487fffc)))

#define core_5_magic_addr (*((volatile unsigned int *)(0x1587fffc)))

#define core_6_magic_addr (*((volatile unsigned int *)(0x1687fffc)))

#define core_7_magic_addr (*((volatile unsigned int *)(0x1787fffc)))

// 暫存器鎖

#define kick0 (*((volatile unsigned int *)(0x02620038)))

#define kick1 (*((volatile unsigned int *)(0x0262003c)))

#define kick0_unlock (0x83e70b13)

#define kick1_unlock (0x95a4f1e0)

#define kick_lock (0x1)

2、獲取入口位址

該例項實現多核啟動用的是乙個公用工程,所以啟動入口位址只有乙個。若是多個工程,則各核啟動入口位址不同,具體是看自己如何定義記憶體分配。

如口位址如何獲取?在編譯後工程debug目錄下。**.map檔案有指定,如下圖

官方指定啟動入口位址為_c_int00,也可自定義指定位址,具體實現在工程裡新建乙個 **.cmd檔案,內容如下:

-heap  0x8000

-stack 0x20000

memory

sections

3、載入各核啟動位址,並傳送ipc中斷

//指定起始位址,在.cmd檔案內定義

extern

unsigned

int_c_int00

(void);

extern

unsigned

int far bootmagic;

void()

4、各核啟動後向指定位址寫入資料,便於檢視各核是否已經啟動。你也可以通過串列埠列印實現。

#define uireg(x)  (*((volatile unsigned int *)(x)))

void

load_core_start_test

(unsigned

char corenum)

}

5、主程式入口

int

main()

else

bios_start()

;/* does not return */

return(0);}

6、通過**器載入初始化0核,並將工程載入到0核

6.1、初始化核0如下圖

6.2、載入工程到核0如下圖

7、執行工程

7.1、執行工程之前寫位址為初始化後隨機預設資料,如下圖

7.2、執行後為各個核啟動後向指定位址所寫資料,如下圖

7.3、檢視各核停靠位址

通過**器檢視各核執行停靠位址,也可以知道各核是否啟動。

C6678多核DSP CMD檔案介紹

cmd檔案編寫 cmd 鏈結器配置檔案,存放鏈結器的配置資訊,cmd檔案使開發者可以通過自己定義的儲存器模組來配置系統儲存器,說白點也就是cmd是用來分配rom和ram空間用的,告訴鏈結程式怎樣計算位址和分配空間。memory命令 描述系統實際的硬體資源 section命令 描述 段 如何定位 其中...

多核DSP C6678 SRIO藉口除錯筆記

首先,感謝ti論壇提供的srio程式範例,但是其硬體平台是evm板,更多的只能用於loopback測試,但是可以在其基礎上修改。1.初始化dsp的srio,主要是對serdes進行配置,然後是lane和speed的配置,最後需要等待fpga的link建立,我們在建立時候碰到一點困難,每次建立並不都是...

C6678多核應用的cache小測試

c6678多核之間在msmc中互動資料,缺省會用到l1d cache 資料一致性問題是很令人困擾的。小測試驗證了關於l1d cache 的linesize 是64byte 初始化 if dnum 0 然後在多核同步中斷程式中 test if dnum 0 else 如此測試條件下,兩個資料始終相差0...