0

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

但它虽然!

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

4

1 回答 1

1

我可以想象多种可能性

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

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

如果是后者,一个固定值会起作用,如果是前者,那么编译器的限制就很难解决。

我会尝试类似的东西

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

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

于 2019-07-02T12:28:34.960 回答