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

MPLABX XC16 unable to resolve built-in identifier __builtin_dmaoffset

我正在尝试使用 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);

    ...
}

如何使用内置函数?

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

    ....
    }


我认为问题可能出在您试图传递一个 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);