关于STM32H745xI双核的SRAM内存分配问题

在工程实践中,遇到STM32H745xI微控制器的M7内核使用SRAM作为共享内存时,必须避免地址0x3000_0000,因为它会覆盖M4内核的RAM。M7的内存范围为0x2400_0000到0x2407_FFFF,而M4的内存为0x1000_0000到0x1004_7FFF。SRAM1和SRAM2各128K,SRAM4 64K,DTCM和ITCM分别用于M7。为防止地址冲突,共享内存分配需谨慎。

最近工程中遇到的一些问题,做个笔记

M7的共享内存不能是0x3000_0000开头的SRAM1,因为如果让这个地址写东西,就相当于覆盖了M4的RAM(0x1000_0000),

实验现象是,我M7内核往0x3000_0000写数据,结果M4的SystemD2Clock全局变量和struBitOutput_M4会默认的被修改,struBitOutput_M4被修改,所以Q01被输出,软启动莫名开启。
在这里插入图片描述

手册上的一些说明:

M7运行内存(0x2400_0000到0x2407_FFFF)一共512K
M4运行内存(0x1000_0000到0x1004_7FFF)一共288K,

SRAM1(0x3000_0000到0x3000_1FFFF)一共有128K
SRAM2,(0x3000_2000到0x3000_3FFFF)一共有128K,

SRAM4(0x3800_000 到 0x3800_ FFFF)一共64K。

DTCM(0x2000_000 到 0x2001_FFFF)一共128K。
(数据TCM,400M速度,只能CM7用,不能用DMA.)

ITCM(0x0000_000 到 0x0000_FFFF)未用,一共64K。
(指令TCM,400M速度,只能CM7用).

在这里插入图片描述

在这里插入图片描述

注意:
M4内核所使用的SRAM(alias)是 0x1000_0000开始的地址,注意有alias

而这个地址是SRAM(0x3000_0000)开始的地址映射(别名)过去的

也就是说,M4用的就是地址0x3000_0000开始的SRAM,只不过是映射的不一样,
所以用SRAM做共享内存的时候,注意不要和M4用的内存冲突。

STM32H745 进行合理的内存分区以发挥双核优势,可从以下几个方面着手: ### 1. 了解内存布局 STM32H745 有多种类型的内存,如内部 SRAM、外部 SDRAM 等。不同的内存区域具有不同的特性,如访问速度、容量等。在进行内存分区前,需要对这些内存区域有清晰的了解。 ### 2. 划分内核私有内存 为 Cortex - M7 内核和 Cortex - M4 内核分别划分私有内存区域。私有内存可用于存放各自内核独立运行所需的数据和代码,避免内核间的相互干扰。例如: ```c // 假设 M7 内核私有内存起始地址为 0x24000000,大小为 128KB #define M7_PRIVATE_MEMORY_START 0x24000000 #define M7_PRIVATE_MEMORY_SIZE 0x00020000 // 假设 M4 内核私有内存起始地址为 0x30000000,大小为 64KB #define M4_PRIVATE_MEMORY_START 0x30000000 #define M4_PRIVATE_MEMORY_SIZE 0x00010000 ``` ### 3. 分配共享内存 为两个内核划分共享内存区域,用于内核间的数据交互。共享内存需要进行合理的同步管理,以避免数据冲突。例如,可以使用信号量、互斥锁等机制来实现同步。 ```c // 共享内存起始地址和大小 #define SHARED_MEMORY_START 0x38000000 #define SHARED_MEMORY_SIZE 0x00008000 // 共享数据结构 typedef struct { int data; // 其他共享数据 } SharedData; SharedData *shared_data = (SharedData *)SHARED_MEMORY_START; ``` ### 4. 考虑不同任务需求 根据不同内核所执行的任务特性,分配合适的内存。例如,Cortex - M7 内核通常处理复杂的算法和图形任务,需要较大的内存空间;而 Cortex - M4 内核负责实时控制任务,对内存的实时性要求较高。 ### 5. 优化内存使用 合理使用内存,避免内存碎片。可以采用内存池、动态内存分配等技术来提高内存的使用效率。 ### 6. 利用内存保护单元(MPU) STM32H745 具有内存保护单元,可以通过配置 MPU 来限制内核对不同内存区域的访问权限,增强系统的安全性和稳定性。 ```c // 配置 MPU 保护 M7 私有内存 void configure_mpu_m7_private_memory() { // 配置 MPU 寄存器 // ... } // 配置 MPU 保护 M4 私有内存 void configure_mpu_m4_private_memory() { // 配置 MPU 寄存器 // ... } ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值