ccs33中建立编译调试工程及常见错误讲解

上传人:枫** 文档编号:571492701 上传时间:2024-08-11 格式:PDF 页数:14 大小:1.14MB
返回 下载 相关 举报
ccs33中建立编译调试工程及常见错误讲解_第1页
第1页 / 共14页
ccs33中建立编译调试工程及常见错误讲解_第2页
第2页 / 共14页
ccs33中建立编译调试工程及常见错误讲解_第3页
第3页 / 共14页
ccs33中建立编译调试工程及常见错误讲解_第4页
第4页 / 共14页
ccs33中建立编译调试工程及常见错误讲解_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《ccs33中建立编译调试工程及常见错误讲解》由会员分享,可在线阅读,更多相关《ccs33中建立编译调试工程及常见错误讲解(14页珍藏版)》请在金锄头文库上搜索。

1、ccs33 中建立编译调试工程及常见错误讲解 1、连接好板子,将板子上仿真器的 usb 口插到电脑上,启动 ccs 后,ccs 会去获取板子信息并在打开的文件目录中自动生成一个文件,如图所示:笔者使用的是 6437 的板子 2、用 file-new 选择建立一个 dsp/bios 文件 在打开的对话框中选择你使用的板子的型号,如下图: 3、这个时候 ccs 为我们建立了一个 bios 文件,以图表显示,里面按照所选板子的类型添加相应的硬件与其他模块。储存这个文件到工程目录下先,文件类型为 tcf。 4、储存这个文件的同时,ccs 按照 bios 中的配置在当前目录下自动生成了一个 cmd 文件

2、。如今将 tcf 文件与这个 cmd 文件同时添加到工程中,使用 5、然后需要修改一个编译选项,点击下图所示选项进去: 6、 打开后在编译选项对话框总会看到一个命令行,其中最后一句是-mv6400,由于用的是6467 的板子,因此这个选项要修改成 -mv64+;否则编译会报错:编译选项不正确;但并非所有类型的板子都要改,这个只针对型号为 64+的板子。 7、file-new-source file 建立一个 c 源文件,储存并加入到工程中。 下列是示例程序: #include #include #include Int main(Int argc, String argv)/main 函数的类

3、型务必这样写 unsigned int i; unsigned int sum=0; for(i = 0; i warning: entry point symbol _c_int00 undefined undefined first referenced symbol in file - - _printf E:WorkContentprojectExampleTestDebugtest.obj error: symbol referencing errors - ./Debug/Test.out not built 2)假如想要 printf 正确输出信息,cmd 文件中务必指定 hea

4、p 的大小, 即 cmd 文件这样写: -c -stack 0x00001000 /* Stack Size */ -heap 0x00001000 /* Heap Size */ /前面这三项必不可少 MEMORY L2RAM: o = 0x10800000 l = 0x00020000 DDR2: o = 0x80000000 l = 0x10000000 SECTIONS .bss L2RAM .cinit L2RAM .cio L2RAM .const L2RAM .data L2RAM .far L2RAM .stack L2RAM .switch L2RAM .sysmem L2R

5、AM .text L2RAM .ddr2 DDR2 另外, 我在使用dsp/bios自动生成的cmd文件进行编译的时候, 不可能报错误或者警告, 但是printf就是不能输出任何东西,后来解决了,具体解决方法见后面的:“ccs 编译中常见的编译错误及解决方法”的第 4 部分 8、compile-rebuild all;无错误提示。如今项目就建立并编译好了。下面就要把程序加载到板子上运行了。 9、首先要先连接板子,点击 debug-connect 10、假如连接成功,会看到下面的效果: 未连接时: 连接成功后: 连接成功的同时,ccs 会打开一二 Disassembly 窗口,如下图: 11、加

6、载程序吧,程序编译后,会在当前目录的 Debug 目录下生成一个*.out 的文件,此例中的文件是“6467EXAM.out” ;通过 file-load Program 加载这个文件 加载后,Disassembly 窗口中会有所变化,如下图: 12、Debug-Run 去吧 提示: 1 Ccs 的项目不支持创建在中文目录下。 2 项目移动到其他文件夹下面时,需要修改*.pjt 中的 Project Settings ProjectDir=E:WorkContentprojectExample6467EXAM 到新的目录。 很简单的一个例子。希望能帮助入门的朋友。 Part2:ccs 中工程的

7、创建-改变工程目录时注意的细节 以 6437 为例: 1、在安装目录下,打开如下路径下的示例工程:video_loopback C:CCStudio_v3.3boardsevmdm6437_v2testsvideo_loopback Ok,假如板子没问题,确信能编译成功的。 2、有的时候候我们需要搬移自己的工程到别的目录或者别的机器上去,此处,将这个工程拷贝到 F 盘中去,再重新打开,编译,你会发现如今提示下列错误: main.c, line 12: fatal error: could not open source file evmdm6437.h tvp5146.h, line 12:

8、fatal error: could not open source file evmdm6437_i2c.h video_loopback_test.c, line 12: fatal error: could not open source file evmdm6437_dip.h 找不到对应的头文件了?同时你在工程中也打不开这几个文件,打开时会提示: 3、看来 ccs 在找这些个头文件时,没有从工程中获取正确的路径信息,打开项目文件,此处是:video_loopback.pjt,会发下下列几行: Compiler Settings: Debug Options=-g -q -fr.Deb

9、ug -i.include -d_DEBUG -mv6400+ Compiler Settings: Release Options=-q -o3 -fr.Release -i.include -mv6400+ 看意思是说,包含的头文件的路径是在.include目录下面;假如这个项目在原先默认的目录下,那么是正确的。由于的确能看到所谓的 include 文件夹,他们就是在 ti 默认安装目录下面的。 但是由于我们改变了项目的路径,那么这些个目录确信是不对的,因此 ccs 无法找到这些个文件了。 。 4、那是不是修改过来就好了。 答案是确信的也是否定的,假如我们找到这个 include 目录,并

10、写到 pjt 文件中,如下所示: Compiler Settings: Release Options=-q -o3 -fr.Release -iC:CCStudio_v3.3boardsevmdm6437_v2include -mv6400+ 那么确信是能够的。但是假如我们拷贝到别的机器上,而别的机器上的开发板驱动或者 ccs 的安装路径与我们不一样的话呢?难道重新再找一遍再写一遍? 5、可能你已经想到了,使用相对路径,那么我们先看看 ccs 都在我们环境里面注册了那些环境变量: 5.1、打开 cmd,切换到 c 盘。然后输入下列命令: seta.txt Set 命令是查看系统中注册的环境变

11、量的。操作符是用来重定向用的,能够将查询到的结构重定向到一个 txt 文件中。因此上面的命令是那么写的。 5.2 打开 a.txt.会看到一堆的环境变量。其中有这么几个是 ccs 有关的: BIOSDVSDK_INSTALL_DIR=C:dvsdk_1_01_00_15 BIOSUTILS_INSTALL_DIR=C:dvsdk_1_01_00_15biosutils_1_00_02 BIOS_INSTALL_DIR=C:/CCStudio_v3.3/bios_5_31_07 BSL_EVMDM6437_INSTALLDIR=C:CCStudio_v3.3boardsevmdm6437_v2

12、5.3第四个就是我们想要的目录了。 那么现在修改 pjt文件中的那两行内容为: Compiler Settings: Debug Options=-g -q -fr.Debug -i%BSL_EVMDM6437_INSTALLDIR%/include -d_DEBUG -mv6400+ Compiler Settings: Release Options=-q -o3 -fr.Release -i%BSL_EVMDM6437_INSTALLDIR%/include -mv6400+ 5.4 编译,连接成功。同时再也不怕移来移去了。 5.5 注意:有的时候候可能还有一个地方需要该: Projec

13、t Settings ProjectDir=E:WorkContentprojectExamplevideo_loopback 指向项目文件的绝对路径。而项目文件中的相对路径都是基于该路径。 Part3:ccs 编译中常见的编译错误及解决方法 1 fastcopy 提示找不到 ialg.h 等头文件, 打开 cmd 文件后看到目录包含命令有: -i%XDAIS_INSTALL_DIR%/packages 但是系统中没有 XDAIS_INSTALL_DIR 这个环境变量, 因此找到 xdais 的安装目录: C:dvsdk_1_01_00_15xdais_5_21 然后添加系统环境变量: 变量名

14、:XDAIS_INSTALL_DIR 变量值:C:dvsdk_1_01_00_15xdais_5_21 注销或者重启或者者 kill 掉 explorer 后在运行即可 2 ccs 提示:could not open source file ti/sdo/fc/acpy3/acpy3.h。与问题 2 相似,在cmd 文件中找到另一条包含目录命令: -i%FC_INSTALL_DIR%/packages 同样在系统环境变量里面没有这个东西。 由于 acpy3 是属于 framework component 的东西,因此找到 fc 的安装目录 C:dvsdk_1_01_00_15framework

15、_components_1_20_03 添加系统环境变量: 变量名:FC_INSTALL_DIR 变量值:C:dvsdk_1_01_00_15framework_components_1_20_03 3、 在程序中查到其用到了FCPY_IFCPY这个变量: IFCPY_Fxns * fxns = (IFCPY_Fxns *)&FCPY_IFCPY; 但是只在整个工程的.c 或者.h文件中找到如下FCPY_IFCPY的定义: extern far IFCPY_Fxns FCPY_IFCPY; 在当前文件前面这样定义的 按上面的定义, 这个FCPY_IFCPY确信在其它文件中有定义的, 但是并没有

16、找到。 _FCPY_IFCPY = _FCPY_TI_IFCPY; 而且找到 FCPY_TI_IFCPY 定义如下: IFCPY_Fxns FCPY_TI_IFCPY = /* module_vendor_interface */ IALGFXNS, /* IALG functions */ FCPY_TI_control, /* Control function */ FCPY_TI_doCopy /* The fcpy fxn */ ; 因此推断, cmd文件中的这个命令将FCPY_IFCPY FCPY_TI_IFCPY两个东西等同起来了,前面的下划线应该是格式需要。有熟悉这个的朋友给解释

17、下。 4、使用 dsp/bios 时,printf 函数默认不起作用。 这是由于 bios中没有动态分配 heap的原因, 默认情况下 mem对 heap 的分配如下图所示: 1)很明显看到这里选择的是:no dynamic memory heaps 但是取消选中后,会发现下拉框中并没有任何选项让选择把 heap 放在哪里。如下图所示: 同时会之前弹出一个对话框: 大概意思是让你去重新配置一块独立的内存块。 2)另外还有一个地方需要注意,就是 ddr2 的设置。打开 ddr 属性,会发现: 创建 heap 选项居然是灰色的.那我去哪里创建 heap 呢 3)下面是正确的步骤: 3.1) 首先打

18、开 MEM 的属性对话框, 将 no dynamic memory heaps 复选框取消, 并按 应用按钮后,点击确定按钮。如下图所示: 3.2)这时再去打开 ddr2 的属性对话框: 你会发现,这个时候“create a heap in this memory”项能够用了,点选此复选框。然后输入适当的大小,并点击应用 后再点确定 按钮退出。如下图所示: 3.3)如今,我们已经为 heap 分配了一段数据空间了,但是还得回到 mem 属性对话框中: 如今就发现,原本只有一项 MEM_NULL 的下拉列表中多了一项 DDR2;选中 DDR2,segment for dsp/bios objec

19、ts 与 segment for malloc()/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_allo

20、c 中第一个参数,指定的是内存分配的位置;其值与系统内存 heap的定义有关,其具体使用如下: 1)如下图所示,在 ddr 中建立一个 heap,并指定 heap_identifier_label)为“_EXTERNALHEAP” ,这个名字能够自己随便起。 2)然后在程序中,按照 heap label 定义一个变量,变量名务必与 heaplabel 下划线后面的名字一样,同时类型是 external 的,如: extern int EXTERNALHEAP; 3)编译的时候, 编译器会自动将这个整形变量与 heap label 联系起来。 假如不写 “extern”关键字,不仅编译器不能将其

21、与 heap label 联系起来,而且连接的时候会提示“EXTERNALHEAP”被双重定义了。因此程序中不能定义与 heap label 名字相同的变量。假如有,就务必是 extern 类型的,编译器会自动将其指向你创建出来的那段 heap。 4)最后 mem_alloc 就能够这样写了: fcpyInput = (int *)MEM_alloc(EXTERNALHEAP, sizeof(int)*INPUTSIZE, 8); 6、程序编译连接通过,但是在执行的时候提示CIO BUFFER类似的错误: 我在这里是由于在 bios 为 iram 分配空间地址时由于来回修改,结果导致出现的错误

22、。后来重新按照标准修改 bios 的 tcf 文件后,不可能再有这个错误了。 7、Heap 的作用,内存分配中指定段的作用 Heap 相当于程序执行空间,假如 ddr 有 100K,假如划分 20k 为 heap,那么程序只能在这20k 的空间中运行,我们声明的变量、数据均放在所声明的 heap 中,但是 heap 的位置能够有多处,比如 dm6437 中有 128k 的 L2,有 256k 的 DDR(假设),我们分别在 L2 与 DDR 中创建 50k 的 heap,那么我们能够在创建对象时指定创建的位置。这点与计算机运行程序是截然不一致的。 段定义的作用:段定义了程序装入的位置,即存放的

23、位置,这个与运行时的位置是不一样的,从连接后的 map 文件中能够看得出来,程序装入的位置均在 heap 定义地址的后面。即 heap 是用来运行程序的,其它地方是用来放程序与数据的,同时是根据我们定义的段的位置存放。通常来说,调试程序的时候,我们将所有的程序与数据均指定存放到 DDR 中,这样读写方便,无需掉电时储存;现在加入 DDR 的起始地址是 0x8000 0000 ,结束地址是0x8800 0000;在其上定义的 heap 的大小是 0x0000 8000;并设定所有程序或者数据均存放到 DDR 中,并假定程序中定义了一个变量 temp; 编译连接程序后, 我们会看到, map 文件中出现的程序或者数据装入的地址均在 0x8000 8000 地址的后面,而运行时会发现 temp 变量的地址在 0x8000 0000 与 0x8000 7FFF 之间,正好位于我们定义的 heap 的地方。 Heap 的英文意思是“堆” ,但是这里的“堆”与 c+程序中“堆”的概念大概并不一样,叫它“可执行的内存空间”更合适。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号