重复定义问题
在ccs5编译后出现报错#10056 symbol"_gBufferRcvPing"redefined:first defined in "./main.obj";redefined in "./initFunction.obj"请问是什么原因及解决方法
重复定义了,错误这么明显,定义一次不就解决了,你的_gBufferRcvPing,在主函数和initFunction.c中重复定义,删掉一个定义就可以 NWPU_CHEN 发表于 2014-8-4 15:22 static/image/common/back.gif
重复定义了,错误这么明显,定义一次不就解决了,你的_gBufferRcvPing,在主函数和initFunction.c中重复定 ...
但我在initfunction中没有定义,是不是因为包含的头文件里有对它的定义 stdenis 发表于 2014-8-4 17:19 static/image/common/back.gif
但我在initfunction中没有定义,是不是因为包含的头文件里有对它的定义
如果文件里边没定义的话,就是头文件的问题,你可以把相关部分贴上来 CCS有搜索功能 找找看 都在哪里定义了 NWPU_CHEN 发表于 2014-8-4 22:04 static/image/common/back.gif
如果文件里边没定义的话,就是头文件的问题,你可以把相关部分贴上来
这是其中的一个头文件有如下定义:
Int16 gBufferXmtPing;// Transmit PING buffer
Int16 gBufferXmtPong;// Transmit PONG buffer
Int16 gBufferRcvPing;// Receive PING buffer
Int16 gBufferRcvPong;// Receive PONG buffer zhangmangui 发表于 2014-8-4 23:27 static/image/common/back.gif
CCS有搜索功能 找找看 都在哪里定义了
是FIND选项么,应该怎么搜索 stdenis 发表于 2014-8-5 09:54 static/image/common/back.gif
是FIND选项么,应该怎么搜索
你就贴了这么几个,我表示无能为力,这个顶多就能看出来你定义了这个变量,用Find in Files(一个望远镜上边有个文件夹,在工具栏)查找文件中所有的关于这个变量,看看是不是有重复定义 NWPU_CHEN 发表于 2014-8-5 10:59 static/image/common/back.gif
你就贴了这么几个,我表示无能为力,这个顶多就能看出来你定义了这个变量,用Find in Files(一个望远镜 ...
找了一下,在bufferhead.h中Int16 gBufferXmtPing;
在configstructure.h中(Uint32)&gBufferXmtPing,
在main.c中memset((void *)gBufferXmtPing, 0, BUFFSIZE * 4 * 2); 在configstructure.h中(Uint32)&gBufferXmtPing---------------这个一整句就是这个?完整的代码贴出来 stdenis 发表于 2014-8-5 09:54 static/image/common/back.gif
是FIND选项么,应该怎么搜索
ctrl F试试 看着是一个望远镜的图标 NWPU_CHEN 发表于 2014-8-5 21:11 static/image/common/back.gif
在configstructure.h中(Uint32)&gBufferXmtPing---------------这个一整句就是这个?完整的代码贴出来 ...
下面是configstructure.h的代码/*******************FPGA与DSP通信**********************/
/****Config structure****/
#ifndef CONFIG_STRUCTURE
#define CONFIG_STRUCTURE
/* Transmit side EDMA configuration */
EDMA_Config gEdmaConfigXmt = {
EDMA_FMKS(OPT, PRI, HIGH) |// Priority
EDMA_FMKS(OPT, ESIZE, 16BIT) |// Element size
EDMA_FMKS(OPT, 2DS, NO) |// 2 dimensional source?
EDMA_FMKS(OPT, SUM, INC) |// Src update mode
EDMA_FMKS(OPT, 2DD, NO) |// 2 dimensional dest
EDMA_FMKS(OPT, DUM, NONE) |// Dest update mode
EDMA_FMKS(OPT, TCINT, YES) |// Cause EDMA interrupt?
EDMA_FMKS(OPT, TCC, OF(0)) |// Transfer complete code
EDMA_FMKS(OPT, LINK, YES) |// Enable link parameters?
EDMA_FMKS(OPT, FS, NO), // Use frame sync?
// Src address
EDMA_FMK (CNT, FRMCNT, NULL) |// Frame count
EDMA_FMK (CNT, ELECNT, BUFFSIZE), // Element count
EDMA_FMKS(DST, DST, OF(0)), // Dest address
EDMA_FMKS(IDX, FRMIDX, DEFAULT) |// Frame index value
EDMA_FMKS(IDX, ELEIDX, DEFAULT), // Element index value
EDMA_FMK (RLD, ELERLD, NULL) |// Reload element
EDMA_FMK (RLD, LINK, NULL) // Reload link
};
/* Receive side EDMA configuration */
EDMA_Config gEdmaConfigRcv = {
EDMA_FMKS(OPT, PRI, HIGH) |// Priority
EDMA_FMKS(OPT, ESIZE, 16BIT) |// Element size
EDMA_FMKS(OPT, 2DS, NO) |// 2 dimensional source?
EDMA_FMKS(OPT, SUM, NONE) |// Src update mode
EDMA_FMKS(OPT, 2DD, NO) |// 2 dimensional dest
EDMA_FMKS(OPT, DUM, INC) |// Dest update mode
EDMA_FMKS(OPT, TCINT, YES) |// Cause EDMA interrupt?
EDMA_FMKS(OPT, TCC, OF(0)) |// Transfer complete code
EDMA_FMKS(OPT, LINK, YES) |// Enable link parameters?
EDMA_FMKS(OPT, FS, NO), // Use frame sync?
EDMA_FMKS(SRC, SRC, OF(0)), // Src address
EDMA_FMK (CNT, FRMCNT, NULL) |// Frame count
EDMA_FMK (CNT, ELECNT, BUFFSIZE), // Element count
(Uint32)&gBufferRcvPing, // Dest address
EDMA_FMKS(IDX, FRMIDX, DEFAULT) |// Frame index value
EDMA_FMKS(IDX, ELEIDX, DEFAULT), // Element index value
EDMA_FMK (RLD, ELERLD, NULL) |// Reload element
EDMA_FMK (RLD, LINK, NULL) // Reload link
};
/* McBSP codec data channel configuration */
static MCBSP_Config mcbspCfg1 = {
MCBSP_FMKS(SPCR, FREE, NO) |
MCBSP_FMKS(SPCR, SOFT, NO) |
MCBSP_FMKS(SPCR, FRST, YES) |
MCBSP_FMKS(SPCR, GRST, YES) |
MCBSP_FMKS(SPCR, XINTM, XRDY) | //XINT输出中断由字结束和帧结束触发XRDY;
MCBSP_FMKS(SPCR, XSYNCERR, NO) |
MCBSP_FMKS(SPCR, XRST, YES) | // 串口输出使能;
MCBSP_FMKS(SPCR, DLB, OFF) | // 不使用内部反馈环;
MCBSP_FMKS(SPCR, RJUST, RZF) | // 右对齐,自动补零;
MCBSP_FMKS(SPCR, CLKSTP, DISABLE) | // 时钟停止模式,不使用SPI;
MCBSP_FMKS(SPCR, DXENA, OFF) | // DX不使能;
MCBSP_FMKS(SPCR, RINTM, RRDY) | // 接收中断模式,字结束或帧结束;
MCBSP_FMKS(SPCR, RSYNCERR, NO) |
MCBSP_FMKS(SPCR, RRST, YES), // 串口接收器停止工作,处于复位状态;
MCBSP_FMKS(RCR, RPHASE, SINGLE) | // 单相one phase数据;
MCBSP_FMKS(RCR, RFRLEN2, DEFAULT) | // 第二相默认;
MCBSP_FMKS(RCR, RWDLEN2, DEFAULT) | // 第二相默认;
MCBSP_FMKS(RCR, RCOMPAND, MSB) | // 数据不压缩;
MCBSP_FMKS(RCR, RFIG, NO) | // 接收帧同步信号不忽略第一个脉冲;
MCBSP_FMKS(RCR, RDATDLY, 0BIT) | // 接收数据延迟位0 bit;(1bit?)
MCBSP_FMKS(RCR, RFRLEN1, OF(1)) | // 接收帧长度1个字;
MCBSP_FMKS(RCR, RWDLEN1, 16BIT) | // 每个字16位;
MCBSP_FMKS(RCR, RWDREVRS, DISABLE), // 接收32位数据不翻转;
MCBSP_FMKS(XCR, XPHASE, SINGLE) |
MCBSP_FMKS(XCR, XFRLEN2, DEFAULT) |
MCBSP_FMKS(XCR, XWDLEN2, DEFAULT) |
MCBSP_FMKS(XCR, XCOMPAND, MSB) |
MCBSP_FMKS(XCR, XFIG, NO) |
MCBSP_FMKS(XCR, XDATDLY, 0BIT) |
MCBSP_FMKS(XCR, XFRLEN1, OF(1)) |
MCBSP_FMKS(XCR, XWDLEN1, 16BIT) |
MCBSP_FMKS(XCR, XWDREVRS, DISABLE),
MCBSP_FMKS(SRGR, GSYNC, DEFAULT) |
MCBSP_FMKS(SRGR, CLKSP, DEFAULT) |
MCBSP_FMKS(SRGR, CLKSM, CLKS) | // 采样速率发生器时钟外部clks输入;
MCBSP_FMKS(SRGR, FSGM, FSG) |
MCBSP_FMKS(SRGR, FPER, OF(0x00f)) | // 帧宽度16位;
MCBSP_FMKS(SRGR, FWID, DEFAULT) |
MCBSP_FMKS(SRGR, CLKGDV, OF(0x03)), // 4分频;
MCBSP_MCR_DEFAULT,
MCBSP_RCER_DEFAULT,
MCBSP_XCER_DEFAULT,
MCBSP_FMKS(PCR, XIOEN, SP) |
MCBSP_FMKS(PCR, RIOEN, SP) |
MCBSP_FMKS(PCR, FSXM, EXTERNAL) |
MCBSP_FMKS(PCR, FSRM, EXTERNAL) |
MCBSP_FMKS(PCR, CLKXM, INPUT) |
MCBSP_FMKS(PCR, CLKRM, INPUT) |
MCBSP_FMKS(PCR, CLKSSTAT, DEFAULT) |
MCBSP_FMKS(PCR, DXSTAT, DEFAULT) |
MCBSP_FMKS(PCR, FSXP, ACTIVEHIGH) |
MCBSP_FMKS(PCR, FSRP, ACTIVEHIGH) |
MCBSP_FMKS(PCR, CLKXP, FALLING) |
MCBSP_FMKS(PCR, CLKRP, RISING)
};
#endif 这里边没有相关定义,你把initFunction和主函数的头文件及它包含的头文件贴出来,你也仔细看看 NWPU_CHEN 发表于 2014-8-6 20:27 static/image/common/back.gif
这里边没有相关定义,你把initFunction和主函数的头文件及它包含的头文件贴出来,你也仔细看看 ...
主函数
/*****************FPGA与DSP通信*******************/
/*****************use_McBSP_&_EDMA****************/
/******include*******/
#define CHIP_6713
#include <stdio.h>
#include "cslinclude.h"
#include "BufferHead.h"
#include "ConfigStructure.h"
/******define*******/
/******global*******/
Uint32 i;
Uint32 TempData=0;
Uint32 Reg=0;
Uint32 i1;
Uint32 i2;
Uint32 i3;
Uint32 j=0; //数据存储计数;
Uint32 j1=0; //PingBuffer计数;
Uint32 j2=0; //PongBuffer计数;
Int16 tempdata;
Int16 wavedata;
volatile short xpingOrpong = PING;// Ping-pong state variable
volatile short rpingOrpong = PING;
volatile short xmtdone = 0;
volatile short rcvdone = 0;
/******function_prototypes*******/
extern void initMcbsp(void);
extern void initEdma(void);
extern void initIrq(void);
extern void initGpio(void);
void copyData(Int16 *inbuf, Int16 *outbuf, Int16 length);
void processBuffer(void);
void edmaHwi(void);
extern far void vectors();
void setupInterrupts(void);
/******extern*******/
/******main*******/
void main()
{
// Initialize CSL
CSL_init();
/*CACHE_clean(CACHE_L2ALL, 0, 0);
CACHE_enableCaching(CACHE_CE00);
CACHE_setL2Mode(CACHE_64KCACHE);*/
/* Clear buffers */
memset((void *)gBufferXmtPing, 0, BUFFSIZE * 4 * 2);
initMcbsp(); // Initialize McBSP1 for audio transfers
IRQ_globalDisable(); // Disable global interrupts during setup
initEdma(); // Initialize the EDMA controller
initIrq(); // Initialize interrupts
IRQ_globalEnable(); // Re-enable global interrupts
initGpio();
while(1)
{
if(rcvdone && xmtdone)
{
rcvdone=0;
xmtdone=0;
if(rpingOrpong == PING)
{
tempdata=gBufferRcvPing;
j1++;
rpingOrpong = PONG;
}
if(rpingOrpong == PONG)
{
tempdata=gBufferRcvPing;
j2++;
rpingOrpong = PING;
}
printf("data = %d \n",tempdata);
wavedata=tempdata;
j++;
}
}
}
/******functions*******/
void copyData(Int16 *inbuf, Int16 *outbuf, Int16 length)
{
Int16 i = 0;
for (i = 0; i < length; i++) {
outbuf= inbuf ;
printf("outbuf=%d\n",outbuf);
}
}
/* ---------------------- Interrupt Service Routines -------------------- */
/*
*edmaHwi() - Interrupt service routine for the DMA transfer.It is
* triggered when a complete DMA receive frame has been
* transferred. The edmaHwi ISR is inserted into the interrupt
* vector table at compile time through a setting in the DSP/BIOS
* configuration under Scheduling --> HWI --> HWI_INT8.edmaHwi
* uses the DSP/BIOS Dispatcher to save register state and make
* sure the ISR co-exists with other DSP/BIOS functions.
*/
void edmaHwi(void)
{
//LOG_printf(&trace, \"edmaHwi start!\\n\"; \\???
/* Check CIPR to see which transfer completed */
if (EDMA_intTest(gXmtChan))
{
EDMA_intClear(gXmtChan);
xmtdone = 1;
}
if (EDMA_intTest(gRcvChan))//如果收到数据;
{
EDMA_intClear(gRcvChan);
rcvdone = 1;
}
}
/* ------------------------------- Threads ------------------------------ */
/*
*processBuffer() - Process audio data once it has been received.
*/
void processBuffer(void)
{
Uint32 pingPong;
//LOG_printf(&trace, \"processBuffer start!\\n\");
/* Get contents of mailbox posted by edmaHwi */
pingPong =SWI_getmbox();
/* Copy data from transmit to receive, could process audio here */
if (pingPong == PING) {
/* Copy receive PING buffer to transmit PING buffer */
copyData(gBufferRcvPing, gBufferXmtPing, BUFFSIZE);
} else {
/* Copy receive PONG buffer to transmit PONG buffer */
copyData(gBufferRcvPong, gBufferXmtPong, BUFFSIZE);
}
}
initFunction
/*****************FPGA与DSP通信*******************/
/*****************use_McBSP_&_EDMA****************/
/******include*******/
#define CHIP_6713
#include <stdio.h>
#include "cslinclude.h"
#include "BufferHead.h"
#include "ConfigStructure.h"
/******define*******/
/******global*******/
Uint32 i;
Uint32 TempData=0;
Uint32 Reg=0;
Uint32 i1;
Uint32 i2;
Uint32 i3;
Uint32 j=0; //数据存储计数;
Uint32 j1=0; //PingBuffer计数;
Uint32 j2=0; //PongBuffer计数;
Int16 tempdata;
Int16 wavedata;
volatile short xpingOrpong = PING;// Ping-pong state variable
volatile short rpingOrpong = PING;
volatile short xmtdone = 0;
volatile short rcvdone = 0;
/******function_prototypes*******/
extern void initMcbsp(void);
extern void initEdma(void);
extern void initIrq(void);
extern void initGpio(void);
void copyData(Int16 *inbuf, Int16 *outbuf, Int16 length);
void processBuffer(void);
void edmaHwi(void);
extern far void vectors();
void setupInterrupts(void);
/******extern*******/
/******main*******/
void main()
{
// Initialize CSL
CSL_init();
/*CACHE_clean(CACHE_L2ALL, 0, 0);
CACHE_enableCaching(CACHE_CE00);
CACHE_setL2Mode(CACHE_64KCACHE);*/
/* Clear buffers */
memset((void *)gBufferXmtPing, 0, BUFFSIZE * 4 * 2);
initMcbsp(); // Initialize McBSP1 for audio transfers
IRQ_globalDisable(); // Disable global interrupts during setup
initEdma(); // Initialize the EDMA controller
initIrq(); // Initialize interrupts
IRQ_globalEnable(); // Re-enable global interrupts
initGpio();
while(1)
{
if(rcvdone && xmtdone)
{
rcvdone=0;
xmtdone=0;
if(rpingOrpong == PING)
{
tempdata=gBufferRcvPing;
j1++;
rpingOrpong = PONG;
}
if(rpingOrpong == PONG)
{
tempdata=gBufferRcvPing;
j2++;
rpingOrpong = PING;
}
printf("data = %d \n",tempdata);
wavedata=tempdata;
j++;
}
}
}
/******functions*******/
void copyData(Int16 *inbuf, Int16 *outbuf, Int16 length)
{
Int16 i = 0;
for (i = 0; i < length; i++) {
outbuf= inbuf ;
printf("outbuf=%d\n",outbuf);
}
}
/* ---------------------- Interrupt Service Routines -------------------- */
/*
*edmaHwi() - Interrupt service routine for the DMA transfer.It is
* triggered when a complete DMA receive frame has been
* transferred. The edmaHwi ISR is inserted into the interrupt
* vector table at compile time through a setting in the DSP/BIOS
* configuration under Scheduling --> HWI --> HWI_INT8.edmaHwi
* uses the DSP/BIOS Dispatcher to save register state and make
* sure the ISR co-exists with other DSP/BIOS functions.
*/
void edmaHwi(void)
{
//LOG_printf(&trace, \"edmaHwi start!\\n\"; \\???
/* Check CIPR to see which transfer completed */
if (EDMA_intTest(gXmtChan))
{
EDMA_intClear(gXmtChan);
xmtdone = 1;
}
if (EDMA_intTest(gRcvChan))//如果收到数据;
{
EDMA_intClear(gRcvChan);
rcvdone = 1;
}
}
/* ------------------------------- Threads ------------------------------ */
/*
*processBuffer() - Process audio data once it has been received.
*/
void processBuffer(void)
{
Uint32 pingPong;
//LOG_printf(&trace, \"processBuffer start!\\n\");
/* Get contents of mailbox posted by edmaHwi */
pingPong =SWI_getmbox();
/* Copy data from transmit to receive, could process audio here */
if (pingPong == PING) {
/* Copy receive PING buffer to transmit PING buffer */
copyData(gBufferRcvPing, gBufferXmtPing, BUFFSIZE);
} else {
/* Copy receive PONG buffer to transmit PONG buffer */
copyData(gBufferRcvPong, gBufferXmtPong, BUFFSIZE);
}
}
bufferhead.h
#ifndef BUFFER_HEAD
#define BUFFER_HEAD
/* Constants for the buffered ping-pong transfer */
#define PING 0
#define PONG 1
#define BUFFSIZE 1000
//#define NN 480
/* Create Buffers for the use of EDMA
* Data buffer declarations - the program uses four logical buffers of size
* BUFFSIZE, one ping and one pong buffer on both receive and transmit sides.
*/
Int16 gBufferXmtPing;// Transmit PING buffer
Int16 gBufferXmtPong;// Transmit PONG buffer
Int16 gBufferRcvPing;// Receive PING buffer
Int16 gBufferRcvPong;// Receive PONG buffer
Int16 gXmtChan; // TCC codes (see initEDMA())
Int16 gRcvChan;
#endif
你开始说的是gBufferRcvPing,后来咋又改成了gBufferXmtPing?估计你写错了吧,现在不管是哪个了,就当是gBufferXmtPing:两个c函数都用到了,把这个参数定义放到两个C函数(initFunction或者是main函数)文件之一的顶部,将bufferhead.h中的定义删除,然后另一C函数顶部添加extern Uint16 gBufferXmtPing【BUFFSIZE],全局作用,就没错误了,BUFFSIZE的宏定义不变;另外如果还有相同错误的变量也这么干;
我建议你在CCS中编程一个C文件对应一个相应的头文件,所用该文件中用到的变量仅包含在所对应头文件中,其他文件引用时,在对应头文件中添加extern+定义变量!
谢谢,问题解决了!结贴了 stdenis 发表于 2014-8-7 14:44 static/image/common/back.gif
谢谢,问题解决了!结贴了
好吧 看来还不会结贴
结贴是要操作的
问题解决了给大家分享一下 请问楼主是怎么解决的
页:
[1]