| 名稱 | 起始地址 | 結(jié)束地址 | 大小(字節(jié)) | 描述 |
|---|---|---|---|---|
| HPSYS ROM | 0x00000000 | 0x0000FFFF | 64*1024 | |
| HPSYS ITCM RAM | 0x00010000 | 0x0001FFFF | 64*1024 | |
| HPSYS Retention RAM | 0x00020000 | 0x0002FFFF | 64*1024 | 可以在standby低功耗時(shí)不掉電 |
| HPSYS SRAM | 0x20000000 | 0x200FFFFF | 1024*1024 | |
| LPSYS ROM | 0x0B000000 | 0x0B05FFFF | 384*1024 | |
| LPSYS ITCM RAM | 0x0B0FC000 | 0x0B0FFFFF | 16*1024 | |
| LPSYS DTCM RAM | 0x2B0FC000 | 0x2B0FFFFF | 16*1024 | |
| LPSYS SRAM | 0x20100000 | 0x20137FFF | 224*1024 | |
| QSPI1 | 0x10000000 | 0x11FFFFFF | EVB的容量為4MByte | |
| QSPI2 | 0x64000000 | 0x67FFFFFF | EVB的容量為32MByte | |
| QSPI3 | 0x68000000 | 0x68FFFFFF | EVB未接 | |
| QSPI4 | 0x12000000 | 0x13FFFFFF | LCPU可選flash,EVB未接 | |
| PSRAM-OPI | 0x60000000 | 0x61FFFFFF | EVB的容量為4MByte |
HCPU用于訪問LPSYS Memory的地址轉(zhuǎn)換接口
HCPU的代碼可XIP執(zhí)行在QSPI1/QSPI2/QSPI3上,也可以跑在HPSYS ITCM/SRAM/Retention RAM上
| 名稱 | S-Bus 起始地址 | S-Bus 結(jié)束地址 | C-Bus 起始地址 | C-Bus 結(jié)束地址 | 大小(字節(jié)) | 描述 |
|---|---|---|---|---|---|---|
| HPSYS SRAM | 0x2A000000 | 0x2A0FFFFF | 1024*1024 | |||
| LPSYS ROM | 0x00000000 | 0x0005FFFF | 384*1024 | |||
| LPSYS ITCM RAM | 0x000FC000 | 0x000FFFFF | 16*1024 | |||
| LPSYS DTCM RAM | 0x200FC000 | 0x200FFFFF | 16*1024 | |||
| LPSYS SRAM | 0x20100000 | 0x20137FFF | 0x00100000 | 0x00137FFF | 224*1024 | |
| QSPI4 | 0x12000000 | 0x13FFFFFF | LCPU可選flash,EVB未接 |
為了提高性能,除了可以使用0x20100000~0x20137FFF地址段訪問LPSYS SRAM外,還可以使用0x00100000~0x00137FFF訪問, 前者使用S-Bus訪問SRAM,后者使用C-Bus訪問SRAM,他們?cè)L問的都是同一片物理SRAM。 例如,可以將代碼分配在0x00100000開始的地址,SRAM剩余的空間則使用S-Bus的地址空間分配給數(shù)據(jù)段使用, 這樣就可以使取指和取數(shù)并行,提高代碼的執(zhí)行效率。 也可以將ITCM和SRAM合并使用,比如代碼起始地址為0x000FC000,超出16K字節(jié)的代碼就會(huì)接著放在SRAM地址0x00100000開始的區(qū)域,剩余的SRAM空間仍舊使用S-Bus地址空間訪問。 具體示例見第4和第5節(jié)。
LCPU用于訪問HPSYS SRAM地址的轉(zhuǎn)換接口,
LCPU的代碼可以運(yùn)行在LPSYS的ITCM/DTCM/SRAM上,需要由HCPU上的用戶程序搬到對(duì)應(yīng)的地址空間
Bootloader使用0x10000000開始的12kbyte作為Flash配置表,默認(rèn)的Flash配置表指定的Flash1地址規(guī)劃如下,用戶程序起始地址為0x10020000。 如果使用自定義的Flash配置表,則必須保證不使用最開始的12kbyte,避免改寫Flash配置表,其它地址空間可隨意使用。
| 名稱 | 起始地址 | 結(jié)束地址 | 大小(字節(jié)) | 描述 |
|---|---|---|---|---|
| Flash配置表 | 0x10000000 | 0x10004FFF | 20*1024 | |
| 校準(zhǔn)表 | 0x10005000 | 0x10006FFF | 8*1024 | |
| 保留 | 0x10007000 | 0x1000FFFF | 36*1024 | |
| bootrom patch | 0x10010000 | 0x1001FFFF | 64*1024 | |
| User Code | 0x10020000 |
Bootloader使用下表所示的RAM地址空間,當(dāng)使用Bootloader引導(dǎo)用戶程序在RAM中執(zhí)行時(shí),RAM程序不能使用0x20040000地址,避免搬移后又被bootloader改寫。 如果引導(dǎo)用戶程序在Flash上執(zhí)行,則沒有這個(gè)限制。
| 名稱 | 起始地址 | 結(jié)束地址 | 大小(字節(jié)) | 描述 |
|---|---|---|---|---|
| DATA | 0x20040000 | 0x2004FFFF | 64*1024 | bootrom數(shù)據(jù) |
| PATCH CODE | 0x20050000 | 0x2005FFFF | 64*1024 | Patch代碼 |
| PATCH DATA | 0x20060000 | 0x2006FFFF | 64*1024 | Patch數(shù)據(jù) |
| 名稱 | 頻率(MHz) | 說明 |
|---|---|---|
| HCLK | 240 | |
| PSRAM-OPI | 120 | DDR |
| FLASH1 | 96 | |
| FLASH2 | 80 |
一般而言,DMA訪問SRAM效率最高,eDMA訪問PSRAM/FLASH效率最高,具體吞吐率性能如下表所示,其中memcpy不能使用microlib,F(xiàn)LASH1和FLASH2使能了CACHE,PSRAM未使能CACHE。
| 源 | 目的 | memcpy(MB/s) | eDMA(MB/s) | DMA(MB/s) |
|---|---|---|---|---|
| SRAM | SRAM | 405.54 | 430.17 | 446.35 |
| PSRAM | SRAM | 43.34 | 125.54 | 53.23 |
| FLASH1 | SRAM | 46.41 | 43.17 | 25.50 |
| FLASH2 | SRAM | 36.30 | 36.13 | 21.24 |
| SRAM | PSRAM | 48.05 | 187.01 | 47.70 |
| PSRAM | PSRAM | 20.99 | 76.72 | 12.96 |
| FLASH1 | PSRAM | 26.84 | 42.97 | 12.51 |
| FLASH2 | PSRAM | 24.94 | 36.14 | 21.25 |
| 名稱 | 頻率(MHz) | 說明 |
|---|---|---|
| HCLK | 240 | |
| PSRAM-OPI | 120 | DDR |
| FLASH1 | 96 | |
| FLASH2 | 80 |
以下未作說明,顏色格式均為RGB565
| 前景 | 輸出 | 性能(cycle/pixel ) | 吞吐率(Mpixel/s) |
|---|---|---|---|
| SRAM | SRAM | 1.41 | 170.16 |
| PSRAM | SRAM | 4.80 | 50.05 |
| FLASH1 | SRAM | 14.93 | 16.07 |
| FLASH2 | SRAM | 17.83 | 13.46 |
| SRAM | PSRAM | 2.54 | 94.51 |
| PSRAM | PSRAM | 7.40 | 32.46 |
| FLASH1 | PSRAM | 14.90 | 16.11 |
| FLASH2 | PSRAM | 17.83 | 13.46 |
| 前景 | 輸出 | 性能(cycle/pixel ) | 吞吐率(Mpixel/s) |
|---|---|---|---|
| SRAM | SRAM | 4.59 | 52.24 |
| PSRAM | SRAM | 12.82 | 18.72 |
| FLASH1 | SRAM | 41.19 | 5.82 |
| FLASH2 | SRAM | 49.43 | 4.85 |
| SRAM | PSRAM | 4.63 | 51.88 |
| PSRAM | PSRAM | 12.81 | 18.73 |
| FLASH1 | PSRAM | 41.22 | 5.82 |
| FLASH2 | PSRAM | 49.47 | 4.85 |
| 前景 | 輸出 | 性能(cycle/pixel ) | 吞吐率(Mpixel/s) |
|---|---|---|---|
| SRAM | SRAM | 15.90 | 15.69 |
| PSRAM | SRAM | 136.27 | 1.76 |
| FLASH1 | SRAM | 254.80 | 0.94 |
| FLASH2 | SRAM | 313.40 | 0.76 |
| SRAM | PSRAM | 15.29 | 15.7 |
| PSRAM | PSRAM | 139.11 | 1.72 |
| FLASH1 | PSRAM | 254.80 | 0.94 |
| FLASH2 | PSRAM | 313.42 | 0.76 |
| 輸出 | 性能(cycle/pixel ) | 吞吐率(Mpixel/s) |
|---|---|---|
| SRAM | 1.31 | 183.55 |
| PSRAM | 2.79 | 85.95 |
在$SDK_ROOT/drivers/cmsis/sf32lb55x/mem_map.h中定義了以下一些接口用于規(guī)劃應(yīng)用程序的Memory使用, 除了在頭文件和C文件,也可以在link文件中使用這些宏,這樣便于保證地址規(guī)劃的一致性。
HCPU Flash和SRAM地址規(guī)劃表
| 宏 | 說明 | 默認(rèn)值 | 說明 |
|---|---|---|---|
| HCPU_FLASH_CODE_START_ADDR | HCPU應(yīng)用程序XIP代碼段起始地址 | 0x10020000(沒有DFU)或者0x10100000 (有DFU) | |
| HCPU_FLASH_CODE_SIZE | HCPU應(yīng)用程序XIP代碼段大小 | 896KB | |
| HCPU_FLASH2_IMG_START_ADDR | 圖片資源起始地址 | 0x64000000 | |
| HCPU_FLASH2_IMG_SIZE | 圖片資源大小 | 4MB | |
| HCPU_FLASH2_FONT_START_ADDR | 字體資源起始地址 | 0x64400000 | |
| HCPU_FLASH2_FONT_SIZE | 字體資源大小 | 12MB | |
| HCPU_RAM_DATA_START_ADDR | HCPU應(yīng)用程序數(shù)據(jù)段起始地址 | 0x20000000 | |
| HCPU_RAM_DATA_SIZE | HCPU應(yīng)用程序數(shù)據(jù)段大小 | 1007KB | |
| HCPU_RO_DATA_START_ADDR | HCPU應(yīng)用程序RAM代碼段起始地址 | 0x200FBC00 | 用于存放需要做在SRAM中執(zhí)行的代碼 |
| HCPU_RO_DATA_SIZE | HCPU應(yīng)用程序RAM代碼段大小 | 16KB | |
| HCPU2LCPU_MB_CH2_BUF_START_ADDR | HCPU2LCPU mailbox2共享buffer起始地址 | 0x200FFC00 | |
| HCPU2LCPU_MB_CH2_BUF_SIZE | HCPU2LCPU mailbox2共享buffer大小 | 512B | |
| HCPU2LCPU_MB_CH1_BUF_START_ADDR | HCPU2LCPU mailbox1共享buffer起始地址 | 0x200FFE00 | |
| HCPU2LCPU_MB_CH1_BUF_SIZE | HCPU2LCPU mailbox1共享buffer大小 | 512B |
HCPU由rt_malloc可分配的heap空間大小取決于HCPU應(yīng)用程序數(shù)據(jù)段中靜態(tài)變量占用了多大的空間, 比如靜態(tài)變量如果占用了500KB,則heap空間就剩下1007-500=507KB。
OTA地址規(guī)劃表
| 宏 | 說明 | 默認(rèn)值 | 說明 |
|---|---|---|---|
| DFU_FLASH_CODE_START_ADDR | DFU程序代碼段起始地址 | 0x10020000 | |
| DFU_FLASH_CODE_SIZE | DFU程序代碼段大小 | 256KB | |
| DFU_RES_FLASH_CODE_START_ADDR | 應(yīng)用程序升級(jí)區(qū)起始地址 | 0x10060000 | |
| DFU_RES_FLASH_CODE_SIZE | 應(yīng)用程序升級(jí)區(qū)大小 | 640KB | |
| HCPU_FLASH2_IMG_UPGRADE_START_ADDR | 圖片資源升級(jí)區(qū)起始地址 | 0x65000000 | |
| HCPU_FLASH2_IMG_UPGRADE_SIZE | 圖片資源升級(jí)區(qū)大小 | 1MB | |
| HCPU_FLASH2_FONT_UPGRADE_START_ADDR | 字體資源升級(jí)區(qū)起始地址 | 0x65100000 | |
| HCPU_FLASH2_FONT_UPGRADE_SIZE | 字體資源升級(jí)區(qū)大小 | 3MB |
LCPU SRAM地址規(guī)劃表
| 宏 | 說明 | 默認(rèn)值 |
|---|---|---|
| LCPU_RAM_CODE_START_ADDR | LCPU應(yīng)用程序代碼段起始地址 | 0x000FC000 |
| LCPU_RAM_CODE_SIZE | LCPU應(yīng)用程序代碼段大小 | 140KB |
| LPSYS_RAM_SIZE | LCPU應(yīng)用程序代碼與數(shù)據(jù)段總大小 | 160KB |
| LCPU2HCPU_MB_CH1_BUF_START_ADDR | LCPU2HCPU mailbox2共享buffer起始地址 | 0x20123C00 |
| LCPU2HCPU_MB_CH1_BUF_SIZE | LCPU2HCPU mailbox2共享buffer大小 | 512B |
| LCPU2HCPU_MB_CH2_BUF_START_ADDR | LCPU2HCPU mailbox1共享buffer起始地址 | 0x20123E00 |
| LCPU2HCPU_MB_CH2_BUF_SIZE | LCPU2HCPU mailbox1共享buffer大小 | 512B |
LCPU由rt_malloc可分配的heap空間大小取決于LCPU應(yīng)用程序代碼與靜態(tài)變量占用了多大的空間, 比如代碼和靜態(tài)變量總共占用了120KB,則heap空間就剩下160-120=40KB。
如果需要修改默認(rèn)值,可以在工程的Kconfig中增加如下的CUSTOM_MEM_MAP選項(xiàng), 運(yùn)行menucofig并保存設(shè)置后rtconfig.h中就會(huì)增加一個(gè)CUSTOM_MEM_MAP開關(guān), 這樣mem_map.h就能包含custom_mem_map.h,可以在custom_mem_map.h中重定義需要修改的宏。
為了實(shí)現(xiàn)低功耗的Standby模式,HCPU工程的link.sct文件定義一些PM框架使用的接口, 例如example/pm/ble/ec-lb555/hcpu/linker_scripts/link_flash.sct. 如果硬件平臺(tái)支持PSRAM,則需要在link文件中定義如下的區(qū)域,SDK會(huì)使用RW_PSRAM2作為睡眠時(shí)數(shù)據(jù)的備份區(qū)域, 該區(qū)域中的數(shù)據(jù)在睡眠時(shí)無(wú)法保存,對(duì)于需要保存的數(shù)據(jù)可以將其放在RW_PSRAM1區(qū)。
類似的,SRAM也分為RW_IRAM0和RW_IRAM1區(qū),RW_IRAM0中的數(shù)據(jù)在standby睡眠模式時(shí)會(huì)丟失,而RW_IRAM1中數(shù)據(jù)在standby睡眠時(shí)不會(huì)丟失
此外,HCPU還有64KB的Retention RAM,在link.sct文件中由RW_IRAM_RET區(qū)域指定, 對(duì)于沒有PSRAM的硬件平臺(tái),該區(qū)域被用來(lái)備份睡眠時(shí)需要保存的SRAM數(shù)據(jù)。
為了便于指定變量存放的區(qū)域,比如有些變量的值在睡眠時(shí)需要保存,而有些變量不需要,可以使用middleware/include/mem_section.h中定義的宏來(lái)指示變量存放的位置。 例如,下面的代碼將變量g_ble_db指定到了L1_NON_RET_BSS段,也就是RW_IRAM0中,這樣睡眠時(shí)就不會(huì)保存該變量的數(shù)據(jù)。
以$SDK_ROOT/example/ble/ancs_dualcore/project/ec-lb555/為例,
示例的HCPU使用mem_map.h中默認(rèn)的宏定義,代碼存放和執(zhí)行地址為0x10020000,如果想將代碼編譯到0x10060000地址,BIN大小增加到1024KB,可以按以下幾個(gè)步驟修改代碼,
1) 修改hcpu/Kconfig
2) 執(zhí)行menuconfig,保存配置并退出,確認(rèn)更新后的rtconfig.h里增加了CUSTOM_MEM_MAP
3) 在hcpu/linker_scripts目錄下新建custom_mem_map.h,內(nèi)容如下
4) 修改hcpu/board/SConscript,給已有的path列表,增加一個(gè)路徑‘[cwd + ’/../linker_scripts']`
5) 在命令行執(zhí)行scons –clean刪除原來(lái)的編譯結(jié)果,再執(zhí)行scons -j8編譯新的程序, 查看build目錄下生成bf0_ap.map可以看到HCPU代碼的加載和執(zhí)行地址都已經(jīng)變?yōu)?x10060000
系統(tǒng)heap的起始地址由map文件里的段名Image$$RW_IRAM1$$ZI$$Limit指示,結(jié)束地址為ER_IROM1_EX段的起始地址,即0x200FBC00
一般而言,LCPU默認(rèn)的memory規(guī)劃已經(jīng)可以滿足大部分應(yīng)用的需求,無(wú)需定制。 例如在lcpu/linker_scripts/link_lcpu.sct中可以看到,代碼和數(shù)據(jù)段是緊密存放,雖然使用了宏LCPU_RAM_CODE_SIZE限定了代碼段最大不能超過140KB, 但如果實(shí)際代碼段只使用100KB,則數(shù)據(jù)段起始地址就是(0x200FC000+100*1024)=0x20115000,并不會(huì)浪費(fèi)空間, 同時(shí)為了避免RW變量load地址和exec地址的錯(cuò)位導(dǎo)致帶初值的變量初始化錯(cuò)誤,RW區(qū)使用不壓縮格式
以下為生成的map文件片段,代碼段的加載和執(zhí)行地址從0x000FC000開始,數(shù)據(jù)段的執(zhí)行地址從0x201095A0開始,加載地址為0x001095A0, 由前文的LCPU的Memory地址空間可知,他們指向了同一片物理memory。
系統(tǒng)heap的起始地址由map文件里的段名Image$$RW_IRAM1$$ZI$$Limit指示,結(jié)束地址為0x20123C00,即mailbox buffer的起始地址,可見LCPU可用的heap大小為90280字節(jié)。