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