我正在尝试使用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);
...
}
如何使内置函数正常工作?
答案 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);