MPLABX XC16 не может разрешить встроенный идентификатор __builtin_dmaoffset - PullRequest
0 голосов
/ 08 мая 2019

Я пытаюсь выполнить простую отправку ECAN с использованием dsPIC33FJ128GP802 и встроенного DMA. Проблема, с которой я сталкиваюсь, заключается в том, что все примеры кода в документации используют встроенную функцию __builtin_dmaoffset() для установки регистра буфера начала DMA DMA1STA, но мой компилятор постоянно говорит мне:

unable to resolve built-in identifier __builtin_dmaoffse

Код, который я использую:

#include <stdio.h>
#include <stdlib.h>
#include <xc.h>

#include <ADCConfig.h>
#include <ECANConfig.h>

int main(void) {

    oscConfig();

    initADC1();
    initDMA0();

    initECAN1();
    initDMA1();
    initDMA2();

    ... 

    unsigned int ecan1MsgBuf[32][8] __attribute__((space(dma)));
    DMA1STA=__builtin_dmaoffset(ecan1MsgBuf);

    ...
}

Как мне заставить работать встроенную функцию?

Ответы [ 2 ]

2 голосов
/ 08 мая 2019

__ builtin_dmaoffset () должен знать реальный адрес для вычисления значения смещения DMA.Попробуйте следующим образом -

#define MSG_BUF_LENGTH 32

int main(void) {
    ....

    unsigned int ecan1MsgBuf[32][8] __attribute__((space(dma),aligned(MSG_BUF_LENGTH*16)));
    DMA1STA=__builtin_dmaoffset(ecan1MsgBuf);

    ....
    }


0 голосов
/ 09 мая 2019

Я думаю, что проблема может быть в том, что вы пытаетесь передать 2-массив в качестве аргумента. Попробуйте создать объединение, включающее ваш массив, и отправить его во встроенную систему. Я считаю, что встроенная функция реализована в виде макроса, который извлекает адрес параметра, и это может вызвать проблемы, если это не простая скалярная переменная.

Я также успешно использовал атрибут eds на процессоре dsPIC33E.

typedef union
{
   uint16_t   u16Dummy;
   uint16_t   ecan1MsgBuf[32][8];
} CAN_TYPE;

CAN_TYPE   __attribute__((eds, space(dma), aligned(MSG_BUF_LENGTH*16))) Data;

DMA1STA = __builtin_dmaoffset(Data.u16Dummy);
...