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。

小提示:如果你不确定选哪个编译器版本,可以打开CCS的 Help → Check for Updates,把编译器更新到最新。然后选那个带“LTS”字样的版本。

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文件里的地址一定要和芯片数据手册一致。我曾经把FLASH的起始地址写错了,结果程序下载进去后,一运行就跳转到错误地址,直接死机。查了两天才发现是origin写成了0x310000,而实际是0x300000。

配置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

这样工程拷贝到任何位置,路径都不会失效。

小技巧:配置完头文件路径后,可以在代码里右键点击 #include 语句,选择“Open Declaration”。如果能跳转到对应的头文件,说明路径配置正确。如果不能,检查路径拼写或目录是否存在。

2.5 验证配置是否成功

配置完成后,别急着写代码。先做一次编译,看看能不能通过。如果编译成功,说明工程配置基本没问题。

如果编译报错,别慌。看错误信息,它通常会告诉你:

  • 是头文件找不到(路径问题)
  • 还是链接器找不到符号(CMD文件或库文件问题)
  • 或者是语法错误(代码问题)

我一般会先双击错误信息,CCS会自动跳转到出错的位置。然后根据错误类型,按上面说的步骤逐一排查。

嗯,到这里,一个能用的CCS工程就建好了。配置虽然琐碎,但一次配好,后面能省很多事。你想想看,如果每次建工程都要重新配一遍,那多浪费时间。所以我把常用的配置保存成模板,下次直接复用。

核心要点回顾:
  • 创建工程时选对DSP型号和编译器版本
  • CMD文件定义存储分配,从官方例程复制修改最稳妥
  • 头文件路径用 ${PROJECT_ROOT} 变量,保证工程可移植
  • 配置完成后先编译验证,有问题根据错误类型排查
CCS工程创建与配置流程 1. 创建CCS工程 选择型号/编译器/模板 2. 配置编译器版本 选择LTS版本 3. 配置CMD文件 定义MEMORY和SECTIONS 4. 配置头文件路径 Include Options 5. 编译验证 检查是否通过 6. 调试运行 下载并运行程序 编译报错?根据错误类型排查 头文件找不到 → 检查Include路径 | 链接错误 → 检查CMD文件 | 语法错误 → 检查代码 修正后重新编译

这张图把整个流程串起来了。从创建工程开始,到配置编译器、CMD文件、头文件路径,最后编译验证。如果报错,根据错误类型回到对应步骤修正。说白了,这就是一个闭环流程,每一步都踩实了,工程就能跑起来。

好,这一章就到这。配置工程虽然看起来琐碎,但这是后面所有调试工作的基础。基础打牢了,后面遇到问题才能快速定位。