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

10-11 18:42