我正在尝试做一些基本的电子邮件发送使用的dsPIC33FJ128GP802和它的内置DMA。我面临的问题是,文档中的所有代码示例都使用内置函数__builtin_dmaoffset()来设置DMA起始缓冲寄存器DMA1STA,但我的编译器一直告诉我:
unable to resolve built-in identifier __builtin_dmaoffseim使用的代码是:
#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);
...
}我如何让内建函数工作?
发布于 2019-05-08 19:35:39
__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);
....
}发布于 2019-05-09 08:09:34
我认为问题可能是您试图传递一个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);https://stackoverflow.com/questions/56038359
复制相似问题