2、CCS工程创建与基础配置:学习如何创建一个新的CCS工程,配置编译器版本、链接器脚本(CMD文件)和头文件路径。
好,咱们正式开始动手了。这一章我带你走一遍CCS工程的创建流程。说实话,很多新手拿到开发板第一件事就是点“New Project”,然后一路Next到底。结果编译报错一脸懵,连问题出在哪都不知道。
我当年刚接触C2000时也干过这事。建了个空工程,编译直接报了几十个错误,全是“找不到头文件”。后来才发现,原来CCS不会自动帮你把DSP的库路径配好。嗯,今天咱们就把这事彻底讲明白。
2.1 创建一个新的CCS工程
打开CCS,点击菜单栏的 File → New → CCS Project。你会看到这样一个对话框:
| 字段 | 说明 | 我的建议 |
|---|---|---|
| Target | 选择你的DSP型号,比如TMS320F28335 | 别选错,否则后面所有配置都白搭 |
| Connection | 仿真器类型,比如XDS100v2或XDS200 | 我习惯先选好,省得后面再改 |
| Project name | 工程名称,建议用英文 | 别用中文,CCS对中文路径支持不好 |
| Compiler version | 编译器版本,比如TI v20.2.x.LTS | 选LTS版本,稳定第一 |
| Project templates and examples | 选择工程模板 | 新手选“Empty Project (with main.c)” |
这里有个小细节——Compiler version。CCS可能会列出好几个版本。我个人的习惯是选最新的LTS版本。为什么?因为LTS版本经过了充分测试,bug少。我曾经被一个非LTS版本的编译器坑过,编译出来的代码跑起来莫名其妙死机,折腾了两天才发现是编译器优化选项的bug。
2.2 配置编译器版本
工程创建好后,第一步就是确认编译器版本对不对。右键点击工程,选择 Properties,然后找到 CCS General 页面。
在这里你可以看到当前使用的编译器版本。如果需要切换,直接在下拉列表里选就行。但要注意——切换编译器版本后,最好做一次 Project → Clean,把之前的编译缓存清掉。否则可能出现一些莫名其妙的链接错误。
为什么会这样?因为不同版本的编译器生成的中间文件格式可能不兼容。不清缓存的话,老的.obj文件和新的编译器打架,报错信息还特别隐晦。我遇到过一回,报的是“unresolved symbol”,我查了半天代码,结果发现只是忘了clean工程。
2.3 配置链接器脚本(CMD文件)
CMD文件,说白了就是告诉链接器:你的代码放哪,数据放哪。没有它,DSP不知道程序该往哪里写。
C2000的CMD文件分两种:
- MEMORY部分:定义芯片的物理存储资源,比如Flash有多大、RAM有多大、起始地址是多少。
- SECTIONS部分:把代码中的段(.text、.data、.bss等)分配到具体的存储区域。
我一般会从TI的官方例程里复制一份CMD文件,然后根据实际硬件修改。直接手写?不推荐,容易写错地址。
下面是一个典型的F28335 CMD文件片段:
MEMORY
{
PAGE 0:
BEGIN : origin = 0x000000, length = 0x000002
RAMM0 : origin = 0x000002, length = 0x0003FE
FLASH : origin = 0x300000, length = 0x020000
PAGE 1:
BOOT_RSVD : origin = 0x000002, length = 0x000001
RAMM1 : origin = 0x000400, length = 0x000400
RAML0L1 : origin = 0x008000, length = 0x002000
}
SECTIONS
{
.text : > FLASH, PAGE = 0
.cinit : > FLASH, PAGE = 0
.switch : > FLASH, PAGE = 0
.stack : > RAMM1, PAGE = 1
.bss : > RAML0L1, PAGE = 1
.ebss : > RAML0L1, PAGE = 1
.sysmem : > RAML0L1, PAGE = 1
}
配置CMD文件的方法很简单:在工程属性里找到 C2000 Linker → File Search Path,在“Include library file or command file as input”里添加你的CMD文件路径。或者直接把CMD文件拖到工程目录下,CCS会自动识别。
2.4 配置头文件路径
头文件路径配置不对,编译时就会报“fatal error: #include: no such file or directory”。这个错误我见得太多了。
配置路径在:Properties → C2000 Compiler → Include Options。在“Add dir to #include search path”里添加你的头文件目录。
常见的头文件路径包括:
- DSP2833x_Headers/include/
- DSP2833x_common/include/
- 你自己的应用层头文件目录
我个人的习惯是把所有头文件路径都列出来,不要偷懒用相对路径。虽然相对路径看起来简洁,但一旦工程移动位置,就全废了。我一般用 ${PROJECT_ROOT} 这个变量来定位工程根目录,然后拼接子目录路径。
举个例子:
${PROJECT_ROOT}/DSP2833x_Headers/include
${PROJECT_ROOT}/DSP2833x_common/include
${PROJECT_ROOT}/Application/inc
这样工程拷贝到任何位置,路径都不会失效。
2.5 验证配置是否成功
配置完成后,别急着写代码。先做一次编译,看看能不能通过。如果编译成功,说明工程配置基本没问题。
如果编译报错,别慌。看错误信息,它通常会告诉你:
- 是头文件找不到(路径问题)
- 还是链接器找不到符号(CMD文件或库文件问题)
- 或者是语法错误(代码问题)
我一般会先双击错误信息,CCS会自动跳转到出错的位置。然后根据错误类型,按上面说的步骤逐一排查。
嗯,到这里,一个能用的CCS工程就建好了。配置虽然琐碎,但一次配好,后面能省很多事。你想想看,如果每次建工程都要重新配一遍,那多浪费时间。所以我把常用的配置保存成模板,下次直接复用。
- 创建工程时选对DSP型号和编译器版本
- CMD文件定义存储分配,从官方例程复制修改最稳妥
- 头文件路径用 ${PROJECT_ROOT} 变量,保证工程可移植
- 配置完成后先编译验证,有问题根据错误类型排查
这张图把整个流程串起来了。从创建工程开始,到配置编译器、CMD文件、头文件路径,最后编译验证。如果报错,根据错误类型回到对应步骤修正。说白了,这就是一个闭环流程,每一步都踩实了,工程就能跑起来。
好,这一章就到这。配置工程虽然看起来琐碎,但这是后面所有调试工作的基础。基础打牢了,后面遇到问题才能快速定位。