__builtin_dmaoffset() 的参数不是 dma 部分中对象的地址;

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

我有一个 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])

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