Аргумент __builtin_dmaoffset () не является адресом объекта в разделе dma; - PullRequest
0 голосов
/ 02 июля 2019

У меня есть 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;

Но это все же !!!

Кто-нибудь знает, что означает эта ошибка и как я могу использовать переменную так, как я хочу?

1 Ответ

1 голос
/ 02 июля 2019

Я могу представить несколько возможностей

  • Субстанции массива не имеют надлежащих установленных атрибутов, и компилятор не поднимает pinpairs [pairCounter] (pinpair структура)

  • из-за того, что Paircounter является переменной, компилятор не может вычислить адрес времени компиляции для значения.

Если для последнего будет работать фиксированное значение, для первого - ограничение компилятора, которое довольно сложно обойти.

Я бы попробовал что-то вроде

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

(плюс, возможно, некоторые типы, чтобы назначить его)

...