首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MPLABX XC16无法解析内置标识符__builtin_dmaoffset

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

Stack Overflow用户
提问于 2019-05-08 18:14:50
回答 2查看 565关注 0票数 0

我正在尝试做一些基本的电子邮件发送使用的dsPIC33FJ128GP802和它的内置DMA。我面临的问题是,文档中的所有代码示例都使用内置函数__builtin_dmaoffset()来设置DMA起始缓冲寄存器DMA1STA,但我的编译器一直告诉我:

代码语言:javascript
复制
unable to resolve built-in identifier __builtin_dmaoffse

im使用的代码是:

代码语言:javascript
复制
#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);

    ...
}

我如何让内建函数工作?

EN

回答 2

Stack Overflow用户

发布于 2019-05-08 19:35:39

__builtin_dmaoffset()需要知道实际地址才能计算DMA偏移值。尝试如下所示:

代码语言:javascript
复制
#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
EN

Stack Overflow用户

发布于 2019-05-09 08:09:34

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

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

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56038359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档