繁体   English   中英

c mmap长写入mmaped区域

[英]c mmap write long to mmaped-area

我想编写一个python-c-extension,它将一个整数列表写入ram区,因为我的第一个python版本有点慢(30毫秒)。

在python中,这可以完美地与以下代码配合使用:

with open("/dev/mem", "r+b") as f:                                      # open file
    ddr_mem = mmap.mmap(f.fileno(), PRU_ICSS_LEN, offset=PRU_ICSS)      # map pru shared-ram

while offset < ramSize:
    ddr_mem[(sharedRam+offset):(sharedRam+offset+4)] = struct.pack('i', self.data[self.i])
    offset += 4
    self.i += 1

因为列表中只有长整数值(4个字节),所以对于列表中的每个新值,偏移量都会增加4。

由于mmap区域为12 kB,因此可以在其中写入3072个值,因为12288字节/ 4字节= 3072还是我错了?

现在,在我的c扩展中,我对这段代码尝试了相同的操作:

if(ddrMem == NULL) {
    //printf("\nopen: shared-ram...");
    mem_fd = open("/dev/mem", O_RDWR | O_SYNC);
    if (mem_fd < 0) {
        printf("Failed to open /dev/mem (%s)\n", strerror(errno));
        return NULL;
    }
    /* map the DDR memory */
    ddrMem = mmap(0, 0x0FFFFFFF, PROT_WRITE | PROT_READ, MAP_SHARED, mem_fd, PRU_ICSS + OFFSET_DDR + 0xE000); //TODO: weird offset - 0xE000
    if (ddrMem == NULL) {
        printf("Failed to map the device (%s)\n", strerror(errno));
        close(mem_fd);
        return NULL;
    }

for (i = 0; i < d_len; i++) {
    PyObject* temp = PySequence_Fast_GET_ITEM(seq, i);
    elem = PyInt_AsLong(temp);                  
    *((long*) DDR_regaddr+offset) = elem;    // write to shared ram
    offset = offset + 4;

    if(offset >= (ramSize)){
        offset = 0;
    }

但是现在,ram区中的每个第四个地址都将获得一个新值。 如果我将偏移量增加1,那么它可以工作,但是我能够写入两倍的数据-> 6144元素。

诀窍是什么? 我做错了什么? 这些计算正确吗? 我不确定我的想法是否正确。

您的偏移量是不正确的,因为您正在执行指针算术 ,该算术已经说明了所考虑的long的大小。

尝试将指针增加1而不是4。

long *ptr = 0xff;
long *ptrOffset = ptr + 1; // Will access the next 'long' space in memory
long *ptrOffset2 = ptr + 4; // Will access the fourth next 'long' space in memory

而且,long的大小实际上取决于体系结构和编译器。 假设它是4个字节是不安全的。

好的,对不起.. :(

错误的内存映射!

->错过了偏移量0xF000

但是非常感谢@kevr-这也非常有帮助:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM