簡介:
i.MX.RT1062內置1MB OCRAM,其中512KB Flex RAM與ITCM/DTCM共享。OCRAM,ITCM,DTCM占的比例大小,可以根據具體應用來配置調整。
OCRAM的頻率只有主頻的1/4,而ITCM和DTCM的頻率跟主頻一樣,為了獲取更好的性能,不同的數據需分配 到相應的RAM。
- ITCM一般用來存放需要運行在RAM的函數代碼(大多情況下,開啟Cache,單純把函數從XIP(Flash)拷貝到ITCM運行,其速度未見明顯提高,因為cache的效果跟TCM差不多)
- DTCM一般用來存放內核讀寫的變量數據,如堆棧,在處理大量數據時,比OCARM明顯快很多
- OCRAM用於普通變量,外設讀寫的緩存(如攝像頭數據緩存,DMA讀寫緩存等)
應用舉例:
Flex RAM配置為512KB OCRAM, 64KB ITCM, 448KB DTCM。
Cortex M7要求TCM的大小必須是2的N次方,實際分配可以不受此限制,例如上面配置448KB,但設置時大小512KB,應用只需保證訪問不超出448KB就可以了。
512KB Flex RAM,RT1062默認配置(由fuse決定)是256KB OCRAM,128KB ITCM,128KB DTCM。
Flex RAM應該在復位中斷進行配置,避免RAM未配置,訪問到非法內存。
需要配置的寄存器及功能如下:
- IOMUXC_GPR_GPR17:配置OCRAM,ITCM,DTCM所占512KB Flex RAM的比例
該寄存器每兩位表示一個bank(32KB),其中
00表示未使用
01表示配置為OCRAM
10表示配置為DTCM
11表示配置為ITCM
- IOMUXC_GPR_GPR16:TCM使能控制,以及配置源選擇(選擇Flex RAM的配置是由fuse還是由FLEXRAM_BANK_CFG決定)
- IOMUXC_GPR_GPR14:指明ITCM,DTCM的大小
源碼:
1 __attribute__ ((section(".after_vectors.reset"))) 2 void ResetISR(void) { 3 4 // Disable interrupts 5 __asm volatile ("cpsid i"); 6 /* 7 * GPR17 (32KB per bank, every two bits means one bank) 8 * 00 Not used 9 * 01 OCRAM 10 * 10 DTCM 11 * 11 ITCM 12 */ 13 /*64KB ITCM, 448KB DTCM, 0KB OCRAM*/ 14 IOMUXC_GPR->GPR17 = 0xFAAAAAAA; 15 16 IOMUXC_GPR->GPR16 &= ~IOMUXC_GPR_GPR16_INIT_ITCM_EN_MASK; 17 IOMUXC_GPR->GPR16 &= ~IOMUXC_GPR_GPR16_INIT_DTCM_EN_MASK; 18 /* 19 * GPR14 bit23-bit20 20 0000 0 KB (No DTCM) 21 0011 4 KB 22 0100 8 KB 23 0101 16 KB 24 0110 32 KB 25 0111 64 KB 26 1000 128 KB 27 1001 256 KB 28 1010 512 KB 29 */ 30 IOMUXC_GPR->GPR14 &= ~IOMUXC_GPR_GPR14_CM7_CFGDTCMSZ_MASK; 31 /* 32 * GPR17 set DTCM 448KB , but here sizes are 512KB 33 * see AN12077 Using the i.MX RT FlexRAM.pdf 34 * 3.1.3.2. Ignoring Cortex-M7 TCM size limitations 35 * 36 */ 37 IOMUXC_GPR->GPR14 |= 10<<20u; 38 /* 39 * GPR14 bit19-bit16 40 0000 0 KB (No ITCM) 41 0011 4 KB 42 0100 8 KB 43 0101 16 KB 44 0110 32 KB 45 0111 64 KB 46 1000 128 KB 47 1001 256 KB 48 1010 512 KB 49 */ 50 IOMUXC_GPR->GPR14 &= ~IOMUXC_GPR_GPR14_CM7_CFGITCMSZ_MASK; 51 IOMUXC_GPR->GPR14 |= 7<<16u; 52 IOMUXC_GPR->GPR16 |= IOMUXC_GPR_GPR16_FLEXRAM_BANK_CFG_SEL_MASK | 53 IOMUXC_GPR_GPR16_INIT_DTCM_EN_MASK | 54 IOMUXC_GPR_GPR16_INIT_ITCM_EN_MASK; 55 56 ....... 57 58 // Reenable interrupts 59 __asm volatile ("cpsie i"); 60 61 #if defined (__REDLIB__) 62 // Call the Redlib library, which in turn calls main() 63 __main(); 64 #else 65 main(); 66 #endif 67 68 // 69 // main() shouldn't return, but if it does, we'll just enter an infinite loop 70 // 71 while (1) { 72 ; 73 } 74 }