STM32MP157C-DK2开发板M4与A7核内存共享Linux读取问题求助
STM32MP157C-DK2双核SRAM3共享内存读取问题解决步骤
1. 配置Linux设备树,确保共享内存区域可访问
在设备树中添加SRAM3共享内存节点,避免Linux内核占用或缓存该区域:
ipc_shm: ipc-shm@10041000 { compatible = "st,stm32mp1-shm"; reg = <0x10041000 0x4>; // 对应M4端变量x的4字节大小 no-map; // 禁止内核将该区域映射到虚拟地址空间,避免缓存冲突 };
重新编译设备树并烧写至开发板,重启生效。
2. Linux端读取共享内存的两种方法
方法一:用devmem命令直接读取
执行以下命令(需root权限):
sudo devmem 0x10041000 w
该命令会读取物理地址0x10041000处的4字节内容,输出十六进制值。
方法二:编写用户态C程序映射读取
创建shm_read.c文件,内容如下:
#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <sys/mman.h> #include <unistd.h> #include <stdint.h> #define SHM_PHYS_ADDR 0x10041000 #define SHM_SIZE 4 int main() { int fd = open("/dev/mem", O_RDWR | O_SYNC); if (fd == -1) { perror("open /dev/mem failed"); return 1; } uint8_t *shm_ptr = mmap(NULL, SHM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, SHM_PHYS_ADDR); if (shm_ptr == MAP_FAILED) { perror("mmap failed"); close(fd); return 1; } // 清除缓存,确保读取最新值 __builtin___clear_cache(shm_ptr, shm_ptr + SHM_SIZE); printf("Shared memory values: %02x %02x %02x %02x\n", shm_ptr[0], shm_ptr[1], shm_ptr[2], shm_ptr[3]); munmap(shm_ptr, SHM_SIZE); close(fd); return 0; }
编译并运行:
gcc shm_read.c -o shm_read && sudo ./shm_read
3. 解决M4与A7的缓存一致性问题
M4核无缓存,A7核有L1/L2缓存,需在M4写入后添加内存屏障确保数据同步:
// M4端写入变量x后执行以下指令 __DSB(); // 数据同步屏障,等待所有内存写入完成 __ISB(); // 指令同步屏障,确保后续指令看到内存更新
4. 验证内存区域权限
查看Linux内核日志,确认共享内存区域未被占用:
dmesg | grep 10041000
若输出显示该区域被标记为reserved或未被其他设备占用,则配置正确。
内容的提问来源于stack exchange,提问作者Telmo
相关产品推荐
相关产品推荐

