c - __builtin_dmaoffset() 的参数不是 dma 节中对象的地址;

标签 c dma microchip mplab dspic

我有一个 dsPIC33,并使用 MPLAB X 对其进行编程。

我有三个文件:main.c ADC.c ADC.h

在 ADC.h 中,我进行了一系列变量初始化,如下所示:

typedef struct pinPair{
    unsigned CH0:5,CH123:1,STAT:8,:2;
    unsigned I:16;
    unsigned V0:16;
    unsigned V1:16;
    unsigned V2:16;
}pinPair;

typedef pinPair PINPAIRS [5];   
extern PINPAIRS pinPairs __attribute__((space(dma)));

然后在我的 main.c 文件中我实现了 pinPairs 变量:

//Define pinPairs data buffers
PINPAIRS pinPairs __attribute__((space(dma),aligned(256)));

int main(void) {

...

}

现在,在我的 ADC.c 文件中出现了令人困惑的部分,变量 pinPair 在大坝内存中的某个位置明显对齐,因为如果我这样做:

DMA0STA=__builtin_dmaoffset(pinPairs);

编译器只是做它的事情,但如果我按照我想要的方式做:

DMA0STA=__builtin_dmaoffset(pinPairs[pairCounter]);

我收到错误:

error: Argument to __builtin_dmaoffset()  is not the address of an object in a dma section;

但是确实如此!!!

有谁知道这个错误意味着什么以及我如何以我想要的方式使用该变量?

最佳答案

我可以想象多种可能性

  • 数组的子实体没有设置正确的属性, 并且编译器不会提升 pinpairs[pairCounter] (一个 pinpair 结构)

  • 由于 Paircounter 是一个变量,编译器无法计算值的编译时地址。

如果是后者,固定值就可以工作,如果是前者,则编译器限制很难解决。

我会尝试类似的事情

DMA0STA=__dmaoffset(pinpairs)+dmacounter*uint16(&pinpairs[1]-&pinpairs[0])

(也许加上一些类型转换来分配它)

关于c - __builtin_dmaoffset() 的参数不是 dma 节中对象的地址;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56852152/

相关文章:

c - linux中/usr/include下的各种unistd.h有什么区别?

caching - 在此示例中,数据缓存如何路由对象?

c - 如何在 C 编程的图片中连接 vars?

java - 大 uint64_t 从 C 到 Java 的模除法

有人可以解释给定循环的行为吗?

c - 从内存中读取 6 个字节的更优雅的方法

linux - Linux 内核知道哪条指令与 DMA 相关吗?

fpga - 从 PC 到 FPGA 的 DMA PCIe 读取传输

c - 效率 : 8 arrays vs a multidimensional array

c - 是否可以用HI-TECH C为PIC12 MCU创建多线程程序