[应用相关]

CubeIDE-将变量定义到指定的内存

[复制链接]
490|4
手机看帖
扫描二维码
随时随地手机跟帖
磨砂|  楼主 | 2021-9-4 15:25 | 显示全部楼层 |阅读模式
一、前言
在实际项目中,充分发挥STM32H7的性能,必须将频繁存取的数据存放在DTCM内存。TCM:Tightly-Coupled Memory 紧密耦合内存,特点是跟内核速度一样(480M)。但是,其他内存(SRAM1,AXI SRAM,SRAM2,SRAM3等)跟CPU的通讯速度只有200M,CPU需要白白等待一段时间,才能把数据读取出来或者将数据存放进去。为了提高CPU与其他内存的通讯效率,Cortex-M7有了Cache(高速缓冲区,与CPU通讯速度400M)。但是,使用Cache并不是一件简单的事情,需要深入了解Cache的工作原理才能使用,这个笔记不讨论如何使用Cache。想了解Cache的使用,建议学习《安富莱_STM32-V7开发板_用户手册,含BSP驱动包设计(V3.2)》的第23章与第24章节。
8868261331f4156d56.png

STM32H743内存地址的分配:

DTCM(在STM32CubeIDE称为RAM): 0x20000000 ~ 0x20020000(size:128K)
AXI SRAM(RAM_D1) : 0x24000000 ~ 0x24080000(size:512K)
AHB SRAM(RAM_D2):0x30000000 ~ 0x30048000(size:288K)
SRAM4(RAM_D3):0x38000000 ~ 0x38010000(size:64K)

通过STM32CubeIDE编译成功后,可以通过Build Analyzer查看FLASH与RAM的情况,如下图所示:
5561061331f5b35886.png

使用特权

评论回复
磨砂|  楼主 | 2021-9-4 15:26 | 显示全部楼层
二、将变量定义到指定的内存
2.1、将变量定义到DTCM内存
普通方式定义的全局变量都被指定到DTCM内存。在STM32CubeIDE上不需要修改任何配置,普通方式定义的全局变量都被分配到DTCM内存上。试着看看定义的全局数组key[8]被放在哪里?通过Build Analyzer的Memory Detials的搜索功能查看到全局数组key存放的内存地址是0x20001920,属于DTCM内存的范围里。所以,使用CPU读写数组key肯定不会影响CPU的性能。

3122161331f88d5ec0.png
DTCM内存的大小仅仅只有128K,资源很宝贵。从下图看到,DTCM内存已经被使用掉47.52%了。如果项目规模较大,就需要考虑将一些全局变量存放到其他RAM里。比如一些变量仅仅在程序初始化阶段配置使用的,就可以将它们放到其他内存里。如果项目的规模较小,怎么样都不会把DTCM内存挤满,那么根本就不需要继续把这篇笔记看下去了。

9078661331f996fb48.png

使用特权

评论回复
磨砂|  楼主 | 2021-9-4 15:28 | 显示全部楼层
2.2、将变量定义到RAM_D1内存

在ld链接文件分配一个用户段(section),段的名字是_D1_Area,段的地址是>RAM_D1,4个字节对齐。内容看不懂没关系,本文最后会解释。
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg

接着,使用_attribute__((section(“name”)))声明变量。定义变量后,一定编译成功,Build Analyzer才会更新。


__attribute__((section("._D1_Area"))) uint8_t D1_array[8] = {0,};  //将数组定义到段_D1_Area里面。



9932061331fe3a5c37.png

进入DEBUG模式,进一步检查变量的内存地址。进入DEBUG模式后,需要点击“暂停”按钮才能显示变量的信息。从图片看到,数组D1_array的地址是0x24000000,属于RAM_D1的地址范围。
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg


使用特权

评论回复
磨砂|  楼主 | 2021-9-4 15:29 | 显示全部楼层
三、STM32CubeIDE实用技巧之ld链接文件解读
ST官方文件《STM32CubeIDE实用技巧之ld链接文件》,一定要认真读几遍。奇怪的是,我去ST官网试图搜索这份文件,根本搜不出来。我在google搜索上意外地搜到这份文件,看来还是google搜索给力啊。为此,我上传到百度网盘上,方便大家下载学习。一般使用上,只需了解ld链接文件上的MEMORY就可以。
链接:https://pan.baidu.com/s/1oz9wGy6M9A0cbkik0kA4fg
提取码:imim

3.1、内存(MEMORY)
STM32CubeIDE生成的ld链接文件的开头MEMORY,描述了当前项目上STM32芯片的内存架构。除了FLASH的属性是xr外,其他RAM内存都是xrw。xrw表示可执行,可读,可写。所以,在ld链接文件上,FLASH是不可写的。熟悉STM32的同学应该也知道其实FLASH也是可以写的,只需在程序里调用HAL库函数就能将数据写进去。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg

使用特权

评论回复
磨砂|  楼主 | 2021-9-4 15:30 | 显示全部楼层
3.2、段(Section)

在定义变量到指定内存之前,用户需先定义一个段,才能将变量指定到段里(相当于内存里)。所以在调用__attribute__((section("._D1_Area"))) 之前,需要先在ld链接文件里创建段_D1_Area。
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbGxhY2U4OQ==,size_16,color_FFFFFF,t_70.jpg


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

85

主题

3836

帖子

2

粉丝