LVGL 动态内存使用 CCMRAM

LVGL 动态内存使用 CCMRAM

使用 STM32F407VET6 开发一个项目,使用了 LVGL,然后关注一下 STM32 的 RAM 信息,官方介绍 STM32F407 的 RAM 可用 RAM 是192K,但这 192 K不是连续的,而是分了三块,其中只有两块是连续的,而因为 STM32F4 没有 MMU 这样的内存管理单元,可以将连续的虚拟内核地址翻译到非连续的物理地址,所以我们使用 STM32F407 的 RAM 时必须要注意地址以及内存空间的大小!

翻芯片手册,看一下具体的 RAM 信息:

20220328103326

可以看到 192K 的 RAM 分为 112K 的 SRAM116K 的 SRAM264K 的 CCMRAM

其中的 SRAM1 和 SRAM2 由内核总线经过总线矩阵后进行连接,而CCMRAM则直接与内核总线

总线矩阵,用于建立内核指令总线和外部设备总线的传输连接,同时具备仲裁、同时访问等功能,防止访问冲突,提高访问效率

SRAM1 和 2 两块内存,地址上是连续的,从 0x20000000 开始,我们默认使用的便是这块内存段

CCMRAM 和上面的内存地址是分开的,他的起始地址是 0x10000000,关于地址可以在手册中看到

20220328104357

因为 CCMRAM 没有经过矩阵总线,直接与内核的数据总线连接,所以只能用于进行数据存取,并且访问操作速度极快,效率很高恰好我使用了 LVGL 一个图形框架,所以我准备将这 64K 的内存使用上,作为 LVGL 的动态内存存储空间,使用的是 ARM-GCC 编译器,简单介绍一下这段内存的使用方法,我的开发环境是 VSCode,然后 STM32 外设代码是由 STM32CubeMX 生成的 Makefile 工程,工程帮我生成好了链接文件 STM32F407VETx_FLASH.ld,里面有如下的代码,这是一段关于内存空间的描述,有 64K 的 CCMRAM

20220328110630

同时有一段代码,指定了 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,找到如下内存管理代码:

20220328114334

将 Size 改成 64K,然后将 LV_MEM_ATTR 修改为 CCMRAM,内存起始地址 LV_MEM_ADR 修改为 0x10000000

在任务中添加一个测试指针,在使用 lvgl 分配一段动态内存:

20220328114655

然后仿真,看一下这个内存测试指针的地址,可以看到这段动态内存指向了 0x10000d44 的地址空间,该空间位于 CCMRAM 上

20220328114804

猜你喜欢

转载自blog.csdn.net/qq_45396672/article/details/123791730