ccs33中建立编译调试工程及常见错误讲解Word下载.docx
- 文档编号:22694149
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:19
- 大小:386.97KB
ccs33中建立编译调试工程及常见错误讲解Word下载.docx
《ccs33中建立编译调试工程及常见错误讲解Word下载.docx》由会员分享,可在线阅读,更多相关《ccs33中建立编译调试工程及常见错误讲解Word下载.docx(19页珍藏版)》请在冰豆网上搜索。
i++)
{
sum+=i;
}
printf("
thesum=%d。
\n”,sum);
theprogramrunover!
\n"
);
printf(”theprogramrunover!
}
注意:
1)如果想要printf正确输出信息,需要添加对应平台的rts64plus。
lib文件。
这里是64+平台所以是在C:
\CCStudio_v3.3\C6000\cgtools\lib目录下的rts64plus.lib文件,否则ccs会提示如下警告和错误:
>
〉warning:
entrypointsymbol_c_int00undefined
undefinedfirstreferenced
symbolinfile
———--—-—---——-—-———-———-—
_printfE:
\\WorkContent\\projectExample\\Test\\Debug\\test。
obj
error:
symbolreferencingerrors-’./Debug/Test.out'
notbuilt
2)如果想要printf正确输出信息,cmd文件中必须指定heap的大小,即cmd文件这样写:
—c
—stack0x00001000/*StackSize*/
-heap0x00001000/*HeapSize*/
//前面这三项必不可少
MEMORY
{
L2RAM:
o=0x10800000l=0x00020000
DDR2:
o=0x80000000l=0x10000000
}
SECTIONS
{
.bss>
L2RAM
.cinit〉L2RAM
。
cio>
const>
data>
far>
stack>
.switch〉L2RAM
sysmem〉L2RAM
.text>
ddr2〉DDR2
另外,我在使用dsp/bios自动生成的cmd文件进行编译的时候,不会报错误或警告,但是printf就是不能输出任何东西,后来解决了,具体解决方法见后面的:
“ccs编译中常见的编译错误及解决方法”的第4部分
8、compile-rebuildall;
无错误提示。
此时项目就建立并编译好了.下面就要把程序加载到板子上运行了。
9、首先要先连接板子,点击debug->
connect
10、如果连接成功,会看到下面的效果:
未连接时:
连接成功后:
连接成功的同时,ccs会打开一二Disassembly窗口,如下图:
11、加载程序吧,程序编译后,会在当前目录的Debug目录下生成一个*.out的文件,此例中的文件是“6467EXAM。
out”;
通过file—〉loadProgram加载这个文件
加载后,Disassembly窗口中会有所变化,如下图:
12、Debug—>
Run去吧
提示:
1Ccs的项目不支持创建在中文目录下。
2项目移动到其他文件夹下面时,需要修改*。
pjt中的
[ProjectSettings]
ProjectDir="
E:
\WorkContent\projectExample\6467EXAM”
到新的目录。
很简单的一个例子。
希望能帮助入门的朋友。
Part2:
ccs中工程的创建-改变工程目录时注意的细节
以6437为例:
1、在安装目录下,打开如下路径下的示例工程:
video_loopback
C:
\CCStudio_v3。
3\boards\evmdm6437_v2\tests\video_loopback
Ok,如果板子没问题,肯定能编译成功的。
2、有时候我们需要搬移自己的工程到别的目录或别的机器上去,此处,将这个工程拷贝到F盘中去,再重新打开,编译,你会发现此时提示以下错误:
"
main.c"
line12:
fatalerror:
couldnotopensourcefile”evmdm6437.h”
”tvp5146.h”,line12:
fatalerror:
couldnotopensourcefile"
evmdm6437_i2c.h”
”video_loopback_test.c”,line12:
evmdm6437_dip.h”
找不到对应的头文件了?
?
并且你在工程中也打不开这几个文件,打开时会提示:
3、看来ccs在找这些个头文件时,没有从工程中获取正确的路径信息,打开项目文件,此处是:
video_loopback。
pjt,会发下以下几行:
["
Compiler”Settings:
"
Debug"
]
Options=—g-q-fr”.\Debug\"
-i”。
。
\。
.\include\"
—d"
_DEBUG”—mv6400+
["
Compiler"
Settings:
Release"
Options=-q—o3-fr"
.\Release\”—i"
\include\"
—mv6400+
看意思是说,包含的头文件的路径是在。
\.。
\include\目录下面;
如果这个项目在原来默认的目录下,那么是正确的.因为的确能看到所谓的include文件夹,他们就是在ti默认安装目录下面的.
但是由于我们改变了项目的路径,那么这些个目录肯定是不对的,所以ccs无法找到这些个文件了。
4、那是不是修改过来就好了.
答案是肯定的也是否定的,如果我们找到这个include目录,并写到pjt文件中,如下所示:
[”Compiler”Settings:
”Release”]
Options=-q-o3-fr”.\Release\”-i”C:
\CCStudio_v3.3\boards\evmdm6437_v2\include\"
-mv6400+
那么肯定是可以的。
但是如果我们拷贝到别的机器上,而别的机器上的开发板驱动或ccs的安装路径和我们不一样的话呢?
难道重新再找一遍再写一遍?
5、可能你已经想到了,使用相对路径,那么我们先看看ccs都在我们环境里面注册了那些环境变量:
5。
1、打开cmd,切换到c盘.然后输入以下命令:
set>
a.txt
Set命令是查看系统中注册的环境变量的.〉操作符是用来重定向用的,可以将查询到的结构重定向到一个txt文件中。
所以上面的命令是那么写的。
2打开a。
txt.会看到一堆的环境变量。
其中有这么几个是ccs相关的:
BIOSDVSDK_INSTALL_DIR=C:
\dvsdk_1_01_00_15
BIOSUTILS_INSTALL_DIR=C:
\dvsdk_1_01_00_15\biosutils_1_00_02
BIOS_INSTALL_DIR=C:
/CCStudio_v3.3/bios_5_31_07
BSL_EVMDM6437_INSTALLDIR=C:
3\boards\evmdm6437_v2
3第四个就是我们想要的目录了。
那么现在修改pjt文件中的那两行内容为:
Compiler”Settings:
]
Options=—g-q—fr”.\Debug\”-i"
%BSL_EVMDM6437_INSTALLDIR%/include”—d"
[”Compiler"
”Release"
Options=-q-o3-fr"
.\Release\”-i”%BSL_EVMDM6437_INSTALLDIR%/include”-mv6400+
5.4编译,连接成功。
并且再也不怕移来移去了。
5注意:
有时候可能还有一个地方需要该:
[ProjectSettings]
E:
\WorkContent\projectExample\video_loopback"
指向项目文件的绝对路径.而项目文件中的相对路径都是基于该路径。
Part3:
ccs编译中常见的编译错误及解决方法
1fastcopy提示找不到ialg.h等头文件,打开cmd文件后看到目录包含命令有:
-i”%XDAIS_INSTALL_DIR%/packages
但是系统中没有XDAIS_INSTALL_DIR这个环境变量,于是找到xdais的安装目录:
\dvsdk_1_01_00_15\xdais_5_21\
然后添加系统环境变量:
变量名:
XDAIS_INSTALL_DIR
变量值:
注销或重启或者kill掉explorer后在运行即可
2ccs提示:
couldnotopensourcefile”ti/sdo/fc/acpy3/acpy3。
h”。
和问题2相似,在cmd文件中找到另一条包含目录命令:
-i”%FC_INSTALL_DIR%/packages”
同样在系统环境变量里面没有这个东西.因为acpy3是属于frameworkcomponent的东西,所以找到fc的安装目录
\dvsdk_1_01_00_15\framework_components_1_20_03
添加系统环境变量:
FC_INSTALL_DIR
变量值:
3、在程序中查到其用到了FCPY_IFCPY这个变量:
IFCPY_Fxns*fxns=(IFCPY_Fxns*)&
FCPY_IFCPY;
但是只在整个工程的。
c或。
h文件中找到如下FCPY_IFCPY的定义:
externfarIFCPY_FxnsFCPY_IFCPY;
[在当前文件前面这样定义的]
按上面的定义,这个FCPY_IFCPY肯定在其它文件中有定义的,但是并没有找到。
最后在命令连接文件.cmd文件中找到如下一行语句:
_FCPY_IFCPY=_FCPY_TI_IFCPY;
而且找到FCPY_TI_IFCPY定义如下:
IFCPY_FxnsFCPY_TI_IFCPY={/*module_vendor_interface*/
IALGFXNS,/*IALGfunctions*/
FCPY_TI_control,/*Controlfunction*/
FCPY_TI_doCopy/*Thefcpyfxn*/
};
因此推断,cmd文件中的这个命令将FCPY_IFCPYFCPY_TI_IFCPY两个东西等同起来了,前面的下划线应该是格式需要。
有熟悉这个的朋友给解释下。
4、使用dsp/bios时,printf函数默认不起作用.
这是因为bios中没有动态分配heap的原因,默认情况下mem对heap的分配如下图所示:
1)很明显看到这里选择的是:
nodynamicmemoryheaps
但是取消选中后,会发现下拉框中并没有任何选项让选择把heap放在哪里.如下图所示:
并且会之前弹出一个对话框:
大概意思是让你去重新配置一块独立的内存块。
2)另外还有一个地方需要注意,就是ddr2的设置。
打开ddr属性,会发现:
创建heap选项居然是灰色的。
.。
.那我去哪里创建heap呢?
3)下面是正确的步骤:
3。
1)首先打开MEM的属性对话框,将nodynamicmemoryheaps复选框取消,并按应用按钮后,点击确定按钮。
如下图所示:
3.2)这时再去打开ddr2的属性对话框:
你会发现,这个时候“createaheapinthismemory”项可以用了,点选此复选框。
然后输入适当的大小,并点击应用后再点确定按钮退出。
如下图所示:
3.3)此时,我们已经为heap分配了一段数据空间了,但是还得回到mem属性对话框中:
此时就发现,原本只有一项MEM_NULL的下拉列表中多了一项DDR2;
选中DDR2,[segmentfordsp/biosobjects和segmentformalloc()/free()都选中ddr2]。
然后点应用、确定按钮后退出。
再去试试程序。
Printf函数可以用了。
5、内存分配:
MEM_alloc:
如何指定分配对象的位置?
比如分配到ddr中或sram中
当时的Dm6467内存分配:
然后定义变量:
fcpyInput=(int*)MEM_alloc(1,sizeof(int)*INPUTSIZE,8);
fcpyOutput=(int*)MEM_alloc(0,sizeof(int)*INPUTSIZE,8);
调试的时候结果是这样的:
经查资料得知,mem_alloc中第一个参数,指定的是内存分配的位置;
其值与系统内存heap的定义相关,其具体使用如下:
1)如下图所示,在ddr中建立一个heap,并指定heap_identifier_label)为“_EXTERNALHEAP”,这个名字可以自己随便起.
2)然后在程序中,按照heaplabel定义一个变量,变量名必须和heaplabel下划线后面的名字一样,并且类型是external的,如:
externintEXTERNALHEAP;
3)编译的时候,编译器会自动将这个整形变量和heaplabel联系起来.如果不写“extern”关键字,不仅编译器不能将其和heaplabel联系起来,而且连接的时候会提示“EXTERNALHEAP”被双重定义了。
因此程序中不能定义和heaplabel名字相同的变量。
如果有,就必须是extern类型的,编译器会自动将其指向你创建出来的那段heap。
4)最后mem_alloc就可以这样写了:
fcpyInput=(int*)MEM_alloc(EXTERNALHEAP,sizeof(int)*INPUTSIZE,8);
6、程序编译连接通过,但是在执行的时候提示”CIOBUFFER”类似的错误:
我在这里是因为在bios为iram分配空间地址时由于来回修改,结果导致出现的错误。
后来重新按照标准修改bios的tcf文件后,不会再有这个错误了.
7、Heap的作用,内存分配中指定段的作用
Heap相当于程序执行空间,如果ddr有100K,如果划分20k为heap,那么程序只能在这20k的空间中运行,我们声明的变量、数据均放在所声明的heap中,但是heap的位置可以有多处,例如dm6437中有128k的L2,有256k的DDR(假设),我们分别在L2和DDR中创建50k的heap,那么我们可以在创建对象时指定创建的位置。
这点和计算机运行程序是截然不同的.
段定义的作用:
段定义了程序装入的位置,即存放的位置,这个和运行时的位置是不一样的,从连接后的map文件中可以看得出来,程序装入的位置均在heap定义地址的后面。
即heap是用来运行程序的,其它地方是用来放程序和数据的,并且是根据我们定义的段的位置存放。
一般来说,调试程序的时候,我们将所有的程序和数据均指定存放到DDR中,这样读写方便,无需掉电时保存;
现在加入DDR的起始地址是0x80000000,结束地址是0x88000000;
在其上定义的heap的大小是0x00008000;
并设定所有程序或数据均存放到DDR中,并假定程序中定义了一个变量temp;
编译连接程序后,我们会看到,map文件中出现的程序或数据装入的地址均在0x80008000地址的后面,而运行时会发现temp变量的地址在0x80000000和0x80007FFF之间,正好位于我们定义的heap的地方。
Heap的英文意思是“堆"
但是这里的“堆”和c++程序中“堆"
的概念似乎并不一样,叫它“可执行的内存空间”更合适。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ccs33 建立 编译 调试 工程 常见 错误 讲解