stm32 ccmram的使用(stm32f407)
stm32内存分析
stm32 ram使用,例如192k的stm32f407zg,实际看总线分布图,分成了3部分
112k sdram1 + 16k sdram2 + 64k ccm = 192k, 平时使用中,keil的默认设置只会用到128k,不会用到ccm,要用的话,设置工程的IRAM2即可,开了ccm会优先使用这个内存进行分配。
所以在设置heap和stack大小的时候要考虑RW的size不要超过128k,否则程序肯定hardfault。怎么看RW的size,用到keil工具的map,Program Size: Code=218950 RO-data=33350 RW-data=3480 ZI-data=125152, RW-DATA + ZI-DATA就是最后会加载到ram中的总大小。RW是已经初始化好的变量,ZI是未初始化的变量数据包括heap和stack也在其中。
如何使用ccmram
新建一个sct文件
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x08020000 0x000D0000 { ; load region size_region
ER_IROM1 0x08020000 0x000D0000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
.ANY (+XO)
}
RW_IRAM1 0x20000000 0x00030000 { ; RW data
.ANY (+RW +ZI)
}
RW_IRAM2 0x10000000 0x00010000 {
.ANY (ccmram)
}
}
配置工程,加载刚才sct
宏定义指定区域
#define CCMRAM __attribute__((section(“ccmram”)))
声明变量
/** This is the actual memory used by the pools (all pools in one big block)。 */
CCMRAM static u8_t memp_memory[MEM_ALIGNMENT - 1
#define LWIP_MEMPOOL(name,num,size,desc) + ( (num) * (MEMP_SIZE + MEMP_ALIGN_SIZE(size) ) )
#include “lwip/memp_std.h”
];
编译后的map文件中
map中的内存分配已经可以看到了,分配到了ccmram这个区域。
相应的64K ram已经使用了,剩下原来占用的128k也会相应的释放到相同的size。
stm32 ccmram的使用(stm32f407)
stm32内存分析
stm32 ram使用,例如192k的stm32f407zg,实际看总线分布图,分成了3部分
112k sdram1 + 16k sdram2 + 64k ccm = 192k, 平时使用中,keil的默认设置只会用到128k,不会用到ccm,要用的话,设置工程的IRAM2即可,开了ccm会优先使用这个内存进行分配。
所以在设置heap和stack大小的时候要考虑RW的size不要超过128k,否则程序肯定hardfault。怎么看RW的size,用到keil工具的map,Program Size: Code=218950 RO-data=33350 RW-data=3480 ZI-data=125152, RW-DATA + ZI-DATA就是最后会加载到ram中的总大小。RW是已经初始化好的变量,ZI是未初始化的变量数据包括heap和stack也在其中。
如何使用ccmram
新建一个sct文件
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x08020000 0x000D0000 { ; load region size_region
ER_IROM1 0x08020000 0x000D0000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
.ANY (+XO)
}
RW_IRAM1 0x20000000 0x00030000 { ; RW data
.ANY (+RW +ZI)
}
RW_IRAM2 0x10000000 0x00010000 {
.ANY (ccmram)
}
}
配置工程,加载刚才sct
宏定义指定区域
#define CCMRAM __attribute__((section(“ccmram”)))
声明变量
/** This is the actual memory used by the pools (all pools in one big block)。 */
CCMRAM static u8_t memp_memory[MEM_ALIGNMENT - 1
#define LWIP_MEMPOOL(name,num,size,desc) + ( (num) * (MEMP_SIZE + MEMP_ALIGN_SIZE(size) ) )
#include “lwip/memp_std.h”
];
编译后的map文件中
map中的内存分配已经可以看到了,分配到了ccmram这个区域。
相应的64K ram已经使用了,剩下原来占用的128k也会相应的释放到相同的size。
举报