MPLABX XC16无法解析内置标识符__builtin_dmaoffset

时间:2019-05-08 10:14:50

标签: c warnings built-in microchip mplab

我正在尝试使用dsPIC33FJ128GP802及其内置DMA进行一些基本的ECAN发送。我面临的问题是文档中的所有代码示例都使用内置函数__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 个答案:

答案 0 :(得分:2)

__ 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);

    ....
    }


答案 1 :(得分:0)

我认为问题可能是您试图传递2数组作为参数。尝试创建一个包含数组的联合,然后将其发送到内置数组。我认为内置函数是作为提取参数地址的宏实现的,如果它不是简单的标量变量,则可能会引起问题。

我还在dsPIC33E处理器上成功使用了eds属性。

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);