__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])
(加上一些类型转换来分配它)
我有一个 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])
(加上一些类型转换来分配它)