中级会员
- 积分
- 419
- 金钱
- 419
- 注册时间
- 2018-2-22
- 在线时间
- 81 小时
|
简介:
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 }
https://www.cnblogs.com/greyorbit/p/10062407.html
|
|