LVGL 动态内存使用 CCMRAM
Posted Top嵌入式
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LVGL 动态内存使用 CCMRAM相关的知识,希望对你有一定的参考价值。
LVGL 动态内存使用 CCMRAM
使用 STM32F407VET6 开发一个项目,使用了 LVGL,然后关注一下 STM32 的 RAM 信息,官方介绍 STM32F407 的 RAM 可用 RAM 是192K,但这 192 K不是连续的,而是分了三块,其中只有两块是连续的,而因为 STM32F4 没有 MMU 这样的内存管理单元,可以将连续的虚拟内核地址翻译到非连续的物理地址,所以我们使用 STM32F407 的 RAM 时必须要注意地址以及内存空间的大小!
翻芯片手册,看一下具体的 RAM 信息:
可以看到 192K 的 RAM 分为 112K 的 SRAM1、16K 的 SRAM2、64K 的 CCMRAM
其中的 SRAM1 和 SRAM2 由内核总线经过总线矩阵后进行连接,而CCMRAM则直接与内核总线
总线矩阵,用于建立内核指令总线和外部设备总线的传输连接,同时具备仲裁、同时访问等功能,防止访问冲突,提高访问效率
SRAM1 和 2 两块内存,地址上是连续的,从 0x20000000 开始,我们默认使用的便是这块内存段
CCMRAM 和上面的内存地址是分开的,他的起始地址是 0x10000000,关于地址可以在手册中看到
因为 CCMRAM 没有经过矩阵总线,直接与内核的数据总线连接,所以只能用于进行数据存取,并且访问操作速度极快,效率很高恰好我使用了 LVGL 一个图形框架,所以我准备将这 64K 的内存使用上,作为 LVGL 的动态内存存储空间,使用的是 ARM-GCC 编译器,简单介绍一下这段内存的使用方法,我的开发环境是 VSCode,然后 STM32 外设代码是由 STM32CubeMX 生成的 Makefile 工程,工程帮我生成好了链接文件 STM32F407VETx_FLASH.ld,里面有如下的代码,这是一段关于内存空间的描述,有 64K 的 CCMRAM
同时有一段代码,指定了 ccmram 的起始地址和结尾地址:_sccmram 和 _eccmram,以及字节对齐方式
/* CCM-RAM section
*
* IMPORTANT NOTE!
* If initialized variables will be placed in this section,
* the startup code needs to be modified to copy the init-values.
*/
.ccmram :
. = ALIGN(4);
_sccmram = .; /* create a global symbol at ccmram start */
*(.ccmram)
*(.ccmram*)
. = ALIGN(4);
_eccmram = .; /* create a global symbol at ccmram end */
>CCMRAM AT> FLASH
所以我们在自己的代码里面使用 CCMRAM 时,指定使用 CCMRAM 就行,比如定义一个变量
__attribute__((section("CCMRAM"))) int one_dat;
但是注意,我们看他代码生成的注释中有提到,如果要将初始化的变量放到 CCMRAM 里面,我们还需要在启动代码里面加上一段初始化代码,将初始化的变量值,从 Flash 复制到 CCMRAM,和复制到 SRAM 一样,这个我后面会做一篇专门的讲解,这里我因为用来存放动态内存,不需要进行初始化
上面写了如何使用 CCMRAM 了,下面分析一下如何将动态内存和 LVGL 关联起来,进入到 lv_conf.h,找到如下内存管理代码:
将 Size 改成 64K,然后将 LV_MEM_ATTR 修改为 CCMRAM,内存起始地址 LV_MEM_ADR 修改为 0x10000000
在任务中添加一个测试指针,在使用 lvgl 分配一段动态内存:
然后仿真,看一下这个内存测试指针的地址,可以看到这段动态内存指向了 0x10000d44 的地址空间,该空间位于 CCMRAM 上
以上是关于LVGL 动态内存使用 CCMRAM的主要内容,如果未能解决你的问题,请参考以下文章