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