You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 19:35:16