加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

确保内存缓存正确无效

发布时间:2020-12-16 07:27:15 所属栏目:百科 来源:网络整理
导读:所以我有一段代码如下所示: uint8_t *buffer = 16 MB memory regionuint32_t count = 1024;uint32_t position = 0;uint8_t *get_data() { uint8_t *region = buffer + position * 16; position += 1; position %= count; do { __sync_synchronize(); } whil
所以我有一段代码如下所示:

uint8_t *buffer = <16 MB memory region>
uint32_t count = 1024;
uint32_t position = 0;

uint8_t *get_data() {

    uint8_t *region = buffer + position * 16;

    position += 1;
    position %= count;

    do {
        __sync_synchronize();
    } while (reigon[0] != 1);

    return region;
}

有问题的缓冲区由硬件设备写入.在某些时候(可能在我们开始循环之前,也许在我们开始之后),硬件将写入该位置以及缓冲区的其余部分.

我目前正在使用__sync_synchronize来发出内存屏障,因为我想确保编译器无法在region [0] == 1之前的任何时间缓存该内存区域的其余部分.

我知道我可以将整个缓冲区标记为volatile.但是,我希望能够从此函数返回非易失性缓冲区.

那么,有没有办法做__sync_synchronize,但只有它指向我指定的内存范围.在这种情况下,来自[区域,区域1024]的内存?

另外,这段代码存在于用户空间中.内存缓冲区是一个固定的内存区域,我已经分配了内核模块,映射到用户空间,并告诉FPGA最终DMA到它.这是在试图在FPGA完成DMA传输时实现轮询机制的.

解决方法

区域限制的内存栅栏将是一个相当不寻常的架构特征.但是,在循环终止后,您只需要栅栏:

while (*(volatile uint8_t *)region != 1)
    ;

__sync_synchronize();
return region;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读