本文以AWR1642為例,介紹了在AWR1642 ES2.0 EVM上基于mmWave SDK 2.1的mmw demo下如何修改代碼來改變L3 RAM分布的具體流程和步驟。
IWR1642/AWR1642上總共有768KB L3 RAM。這768KB L3內存按照128KB一個bank,分成了6個bank(bank6~bank1),其中bank1到bank3是專門給DSS使用的。剩下的3個bank可以配置為DSS,R4F TCMA,R4F TCMB,或者為BSS使用。用戶可以根據自己軟件的需要,修改各個模塊使用L3 RAM的大小。默認代碼下所有共享的3個L3 bank都是給DSS使用的。本次測試示例修改了其中一個共享的L3 RAM bank(128KB)給MSS的TCMA使用。
圖1 IWR1642/AWR1642 L3 RAM
在mmWave SDK 2.1里面提供了一個方便更改L3 RAM map的接口,環境變量MMWAVE_SDK_SHMEM_ALLOC。但是在某些情況可能僅僅修改這個環境變量還不充足。下面步驟里有具體說明。
MMWAVE_SDK_SHMEM_ALLOC | ||||
Bit | 31~24 | 23~16 | 15~8 | 7~0 |
含義 | 分配給BSS使用的L3 RAM bank數量 | 分配給MSS TCMB使用的L3 RAM bank數量 | 分配給MSS TCMA使用的L3 RAM bank數量 | 分配給DSS使用的L3 RAM bank數量(包含DSS專用的bank數) |
表1環境變量MMWAVE_SDK_SHMEM_ALLOC的定義
步驟一:以本次測試示例為例,需要修改C:timmwave_sdk_02_01_00_04packagesticommonmmwave_sdk_xwr16xx.mak里環境變量MMWAVE_SDK_SHMEM_ALLOC的定義。但是里面并沒有本次測試需要的增加一個bank給MSS TCMA的代碼,所以需要添加相關代碼。因為一個bank給MSS TCMA,所以MMWAVE_SDK_SHMEM_ALLOC 的bit[15:8]=1,bit[15:8]=5。例如下面黃底加粗部分代碼。
MMWAVE_SDK_SHMEM_ALLOC=0x00000105
ifeq ("$(MMWAVE_SDK_SHMEM_ALLOC)", "")
SHMEM_ALLOC = 0x00000006 # default case
MMWAVE_L3RAM_NUM_BANK = 6
MMWAVE_SHMEM_TCMA_NUM_BANK = 0
MMWAVE_SHMEM_TCMB_NUM_BANK = 0
else ifeq ($(MMWAVE_SDK_SHMEM_ALLOC), 0x00000006) # default case
SHMEM_ALLOC = $(MMWAVE_SDK_SHMEM_ALLOC)
MMWAVE_L3RAM_NUM_BANK = 6
MMWAVE_SHMEM_TCMA_NUM_BANK = 0
MMWAVE_SHMEM_TCMB_NUM_BANK = 0
else ifeq ($(MMWAVE_SDK_SHMEM_ALLOC), 0x00000105) # more MSS TCMA
SHMEM_ALLOC = $(MMWAVE_SDK_SHMEM_ALLOC)
MMWAVE_L3RAM_NUM_BANK = 5
MMWAVE_SHMEM_TCMA_NUM_BANK = 1
MMWAVE_SHMEM_TCMB_NUM_BANK = 0
else ifeq ($(MMWAVE_SDK_SHMEM_ALLOC), 0x00000204) # scenario where more MSS code space is needed
SHMEM_ALLOC = $(MMWAVE_SDK_SHMEM_ALLOC)
MMWAVE_L3RAM_NUM_BANK = 4
MMWAVE_SHMEM_TCMA_NUM_BANK = 2
MMWAVE_SHMEM_TCMB_NUM_BANK = 0
else ifeq ($(MMWAVE_SDK_SHMEM_ALLOC), 0x00010005) # scenario where more MSS .bss space is needed
SHMEM_ALLOC = $(MMWAVE_SDK_SHMEM_ALLOC)
MMWAVE_L3RAM_NUM_BANK = 5
MMWAVE_SHMEM_TCMA_NUM_BANK = 0
MMWAVE_SHMEM_TCMB_NUM_BANK = 1
else ifeq ($(MMWAVE_SDK_SHMEM_ALLOC), 0x00010104) # scenario where more MSS code and MSS .bss space is needed
SHMEM_ALLOC = $(MMWAVE_SDK_SHMEM_ALLOC)
MMWAVE_L3RAM_NUM_BANK = 4
MMWAVE_SHMEM_TCMA_NUM_BANK = 1
MMWAVE_SHMEM_TCMB_NUM_BANK = 1
else
$(error Invalid SHMEM_ALLOC setting! Please check the environment variable MMWAVE_SDK_SHMEM_ALLOC.)
endif
修改了MMWAVE_SDK_SHMEM_ALLOC的定義,在代碼里面有三處相關代碼會連動修改。
1. 一個是link文件里對L3段大小的定義,以本例子為例,是C:timmwave_sdk_02_01_00_04packagestiplatformxwr16xx目錄下的cmd文件。
r4f_linker.cmd
PROG_RAM (RX) : origin=0x00000100 length=0x0003FF00+(MMWAVE_SHMEM_TCMA_NUM_BANK*MMWAVE_SHMEM_BANK_SIZE) –》本例為例修改后length=0x0005FF00
DATA_RAM (RW) : origin=0x08000000 length=0x00030000+(MMWAVE_SHMEM_TCMB_NUM_BANK*MMWAVE_SHMEM_BANK_SIZE) –》本例為例修改后length=0x00030000
L3_RAM (RW) : origin=0x51000000 length=MMWAVE_L3RAM_NUM_BANK*MMWAVE_SHMEM_BANK_SIZE) –》本例為例修改后length=0xA0000
注意:為了驗證測試,在測試代碼中單獨把擴展出來的一塊分出來,便于測試代碼加入。在實際應用的代碼里面不需要對r4f_linker.cmd文件做修改。
r4f_linker.cmd修改為:
MEMORY{
…
PROG_RAM (RX) : origin=0x00000100 length=0x0003FF00
PROG_RAM2 (RX): origin=0x00040000 length=0x0001FFFF
…
}
SECTIONS{
…
my_section : {} > PROG_RAM2
}
c674x_linker.cmd
#define MMWAVE_L3RAM_SIZE (MMWAVE_L3RAM_NUM_BANK*MMWAVE_SHMEM_BANK_SIZE) –》本例為例MMWAVE_L3RAM_SIZE 值為0xA0000
…
MEMORY
{
PAGE 0:
…
L3SRAM: o = 0x20000000, l = MMWAVE_L3RAM_SIZE
…
PAGE 1:
L3SRAM: o = 0x20000000, l = MMWAVE_L3RAM_SIZE
}
…
2. 一個是sys_common頭文件里和L3, TCMA and TCMB 大小的相關定義。以本文為例是C:timmwave_sdk_02_01_00_04packagesticommonsys_common_xwr16xx_mss.h文件。相關內如如下。
#define SOC_XWR16XX_MSS_SHMEM_TCMA_NUM_BANK MMWAVE_SHMEM_TCMA_NUM_BANK
#define SOC_XWR16XX_MSS_SHMEM_TCMA_SIZE MMWAVE_SHMEM_TCMA_NUM_BANK*MMWAVE_SHMEM_BANK_SIZE /* Extended on Share Memory */
#define SOC_XWR16XX_MSS_TCMA_SIZE MMWAVE_SHMEM_TCMA_NUM_BANK*MMWAVE_SHMEM_BANK_SIZE+0x40000U
#define SOC_XWR16XX_MSS_SHMEM_TCMB_NUM_BANK MMWAVE_SHMEM_TCMB_NUM_BANK
#define SOC_XWR16XX_MSS_SHMEM_TCMB_SIZE MMWAVE_SHMEM_TCMB_NUM_BANK*MMWAVE_SHMEM_BANK_SIZE /* Extended on Share Memory */
#define SOC_XWR16XX_MSS_TCMB_SIZE MMWAVE_SHMEM_TCMB_NUM_BANK*MMWAVE_SHMEM_BANK_SIZE+0x30000U /* Extended on Share Memory + Default 192KB */
#define SOC_XWR16XX_MSS_L3RAM_NUM_BANK MMWAVE_L3RAM_NUM_BANK
#define SOC_XWR16XX_MSS_L3RAM_SIZE MMWAVE_L3RAM_NUM_BANK*MMWAVE_SHMEM_BANK_SIZE
3. 第三個是在ccsdebug和mmw demo的makefile文件里的相關定義。
C:timmwave_sdk_02_01_00_04packagestiutilsccsdebugmakefile
all: mssCCSDebug dssCCSDebug
@echo 'Built the CCS Debug MSS & DSS. Preparing the METAIMAGE BIN ...'
@$(GENERATE_METAIMAGE) $(CCS_DEBUG_BIN) $(SHMEM_ALLOC) $(CCS_DEBUG_MSS_OUT) $(XWR16XX_RADARSS_IMAGE_BIN) $(CCS_DEBUG_DSS_OUT)
@$(GENERATE_HS_METAIMAGE) $(CCS_DEBUG_SECURE_BIN) $(SHMEM_ALLOC) $(CCS_DEBUG_MSS_OUT) $(XWR16XX_RADARSS_IMAGE_BIN) $(CCS_DEBUG_DSS_OUT) $(MMWAVE_SECDEV_HSIMAGE_CFG)
C:timmwave_sdk_02_01_00_04packagestidemoxwr16xxmmwmakefile mmwDemo: mssDemo dssDemo
@$(GENERATE_METAIMAGE) $(MMW_DEMO_BIN) $(SHMEM_ALLOC) $(MSS_MMW_DEMO_OUT) $(XWR16XX_RADARSS_IMAGE_BIN) $(DSS_MMW_DEMO_OUT)
@$(GENERATE_HS_METAIMAGE) $(MMW_DEMO_SECURE_BIN) $(SHMEM_ALLOC) $(MSS_MMW_DEMO_OUT) $(XWR16XX_RADARSS_IMAGE_BIN) $(DSS_MMW_DEMO_OUT) $(MMWAVE_SECDEV_HSIMAGE_CFG)
步驟二:特別需要注意的是,SOC驅動里的SOC_deviceInit代碼使用了sys_common_xwr16xx_mss.h里和L3 RAM大小相關的定義。因為這些定義的值改變了,所以這個SOC驅動要重新編譯。驅動路徑是C:timmwave_sdk_02_01_00_04packagestidriverssoc。編譯驅動的流程,請參考mmwave_sdk_user_guide.pdfd 4. 5. 4. 1. Building drivers/control/alg components章節。SOC驅動的重新編譯必須在mmw demo和ccs debug工程編譯之前。
步驟三:在mmw demo里面添加測試代碼并測試運行。
測試代碼添加在mss_main.c里。
#pragma CODE_SECTION (my_delay , "my_section")
void my_delay()
{
int i;
for (i=0;i<0x100;)
{
i++;
}
System_printf ("Debug: delay done! Increase MSS TCMAn");
}
int main (void)
{
…
Task_create(MmwDemo_mssInitTask, &taskParams, NULL);
//add for test
my_delay();
/* Start BIOS */
BIOS_start();
return 0;
}
在soc驅動重新編譯后,重新編譯mmw demo(make clean;make all)。在map文件里面可以看到已經有代碼分配到了擴展出來的TCMA區域了。
MEMORY CONFIGURATION
name origin length used unused attr fill
---------------------- -------- --------- -------- -------- ---- --------
VECTORS 00000000 00000100 0000003c 000000c4 X
PROG_RAM 00000100 0003ff00 00016128 00029dd8 R X
PROG_RAM2 00040000 0001ffff 0000004a 0001ffb5 R X
將生成的bin文件燒錄到flash上運行,mmw demo可正常運行。
步驟四:在CCS下查看在擴展的TCMA中添加的代碼輸出的打印信息。
在SOC驅動重新編譯后,重新編譯ccs debug代碼(make clean;make all)。
將重新編譯生成的ccsdebug.bin燒寫到AWR1642BOOST的QSPI flash上。
然后斷電,修改SOP設置,連上仿真器。分別在MSS/DSS下載之前編譯好的mmw demo的可執行文件。分別運行MMS/DSS。在CCS的輸出串口可以看到下面的打印信息。標黃部分說明在擴展的TCMA上的代碼正確運行了,也就是一個L3 RAM bank已經成功的分配給了MSS TCMA。
[Cortex_R4_0] **********************************************
Debug: Launching the Millimeter Wave Demo
**********************************************
Debug: delay done! Increase MSS TCMA
Debug: MMWDemoMSS Launched the Initialization Task
Debug: MMWDemoMSS mmWave Control Initialization was successful
[C674X_0] Debug: MMWDemoDSS mmWave Control Initialization succeeded
[Cortex_R4_0] Debug: CLI is operational
[C674X_0] Debug: MMWDemoDSS Data Path init succeeded
Debug: MMWDemoDSS initTask exit
之后連上mmwave visualizer,下載chirp配置命令,demo正常運行。
[Cortex_R4_0] Sensor has been stopped
Debug: MMWDemoMSS Received CLI sensorStart Event
[C674X_0] Heap L2_Heap : size 49152 (0xc000), free 47104 (0xb800)
Heap L1 : size 16384 (0x4000), free 4096 (0x1000)
Heap L2 : size 49152 (0xc000), free 35592 (0x8b08)
Heap L3 : size 655360 (0xa0000), free 507904 (0x7c000)
綜合上面步驟三和步驟四的信息,可以證明修改L3 RAM的分布成功!如果用戶還有不同的L3 RAM的分配,參考上的流程修改即可。
后話
實際修改L3 RAM的分布是需要修改SHMEMBANKSEL7TO4寄存器的。該寄存器每8個bit控制一個bank,0x1 : DSS 0x2 : MSS TCMA 0x4 : MSS TCMB 0x10: BSS TCMA。每個bank能夠配置的使用者略有不同,具體信息請參考xWR1642 TRM里該寄存器的解釋。但在上面測試的步驟里面并沒有添加修改SHMEMBANKSEL7TO4
的代碼。原因是在生成xWR1642的image的時候,會有相應L3 RAM分布信息輸入,在image里面就包含了L3 RAM的配置信息。這樣ROM code在啟動時候就會根據image里L3 RAM的配置信息設置好相關的寄存器,用戶不需要在添加代碼來修改SHMEMBANKSEL7TO4寄存器了。
下面是運行修改后代碼在CCS下讀取到的SHMEMBANKSEL7TO4寄存器的值。可以看到bank 7為BSS所使用。Bank 6為MSS TCMA使用。Bank 5/4為DSS所使用,和測試預想的一致。
圖2 運行測試代碼后SHMEMBANKSEL7TO4寄存器值
補充:
對于修改r4f的memory,還有一點需要考慮的是r4f的mpu配置。SDK代碼里面mpu的配置在C:timmwave_sdk_02_01_00_04packagestidriverssocplatformsoc_xwr16xx_mss.c文件的SOC_mpu_config()函數里。默認定義DOWNLOAD_FROM_CCS變量時,TCMA配置為可讀寫,可執行,不緩存,配置大小為512KB。所以在上面的例子里,TCMA的大小從256KB,加大到256KB+128KB,大小仍然小于512KB。所以mpu的配置不需要做修改。但是如果用戶是增加了TCMB的大小,默認TCMB配置為256KB(實際192KB),但增加128KB后,TCMB的大小就變成了320KB,就大于256KB了,這時候就需要修改相關的mpu配置。另外,TCMB默認的mpu配置為不可執行,是不可以放代碼,只能放數據。如果用戶需要在TCMB上既放代碼又放數據,要修改mpu為可執行即可。下面是加大TCMB大小并修改為可執行的一個例子。
#if ((SOC_XWR16XX_MSS_TCMB_BASE_ADDRESS & (256U * ONE_KB - 1)) != 0)
#error SOC_XWR16XX_MSS_TCMB_BASE_ADDRESS not aligned to 256 KB
#endif
_mpuSetRegion_(mpuREGION3);
_mpuSetRegionBaseAddress_(SOC_XWR16XX_MSS_TCMB_BASE_ADDRESS);
_mpuSetRegionTypeAndPermission_(MPU_NORMAL_OINC_NONSHARED, MPU_PRIV_RW_USER_RW_EXEC);
_mpuSetRegionSizeRegister_(mpuREGION_ENABLE | MPU_512_KB);
審核編輯:郭婷
-
代碼
+關注
關注
30文章
4803瀏覽量
68752 -
DSS
+關注
關注
0文章
26瀏覽量
13107 -
SDK
+關注
關注
3文章
1039瀏覽量
46030
發布評論請先 登錄
相關推薦
評論