如何在 VSCODE 上编辑并编译 C2000 工程

在进行 C2000 开发时,能选择的 IDE 很少,只有 TI 自家的 Code Composer Studio (CCS),是基于 Eclipse 魔改的。新人在一开始上手使用 CCS 的时候可能会一头雾水,而且 CCS 的代码补全功能非常鸡肋,所以在这里介绍一种在宇宙最强编辑器 VSCODE 上编辑并编译 C2000 工程的方法。

从 CCS 中导入 C2000 工程

在将工程导入 VSCODE 之前,我们需要先要将工程导入 CCS 中。

为什么要先使用 CCS 导入工程

CCS 编译工程靠的是 makefile 加 gmake 的方式。gmake 是 TI 自己弄的编译器。在 makefile 文件中包括了编译 C2000 工程所需要的所有信息,包括编译器路径、编译器参数、编译顺序等等。每个子文件夹还有自己的 subdir_rules.mk 和 subdir_vars.mk 文件,用来告诉编译器如何编译子文件夹中的文件。在 makefile 和各种.mk 文件中,编译器所需要知道的文件路径大部分都是以相对路径表示的,但是像项目路径,编译器路径,C2000 专用的头文件路径等,都是以绝对路径表示的。在将例程或者别人的工程导入 CCS 之前,这些绝对路径都是错误的,所以我们需要先使用 CCS 导入工程,CCS 会自动修改这些路径,使得工程可以在 CCS 中正常编译。
第二个原因则是像 C2000ware 中的例程中是不包含 driverlib 驱动库文件的,使用 CCS 导入后,CCS 会将这些文件添加到工程中,并生成对应的 makefile 文件。

如何导入工程

  1. 打开 CCS,点击菜单栏中的 Project -> Import CCS Project,选择要导入的工程文件夹。
  2. 选择文件夹
    这里导入 280049 的空工程 注意事项:
    在导入的时候记得勾上下面两个选项。
  3. 选择 C 语言工程
    我们开发的时候一般使用 C 语言,所以选择 C 语言工程。勾选第二个工程选项。然后点击 finish 完成导入。 完成导入后,CCS 中就有我们的工程了,可以对比一下,CCS 导入后比原文件夹多了不少东西。

在 CCS 中修改工程

在导入工程后,我们需要在 CCS 中修改工程,比如重命名工程,新增文件夹,设置代码烧录位置等等。
但是要记住,以上的操作都要在 CCS 中进行,因为 CCS 在每次编译时都会会自动修改 makefile 文件,使得工程可以在 CCS 中正常编译。如果你在文件资源管理器里面直接修改文件名或文件夹名,makefile 文件中的路径是不会自动更新的,编译器找不到文件,就会报错。
在修改完工程后,可以点击菜单栏上面的小锤子编译一下,看看有没有报错。

将工程导入 VSCODE

在导入工程的文件夹的空白处右键,选择在 VSCODE 中打开。

在 VSCODE 中的操作分为两步,一个是能让 VSCODE 正常跳转和补全,另一个是能在 VSCODE 的终端里面正常编译。

让 VSCODE 正常跳转和补全

在工程根目录下新建.vscode 文件夹,在.vscode 文件夹下新建 c_cpp_properties.json 文件,文件内容如下:

c_cpp_properties.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{
"configurations": [
{
"name": "TI C2000",
"includePath": [
"${workspaceFolder}/**",
"${workspaceFolder}/CPU1_FLASH/syscfg",
"${workspaceFolder}/device/",
"${workspaceFolder}/device/driverlib",
"${workspaceFolder}/device/driverlib/inc",
"C:/ti/ccstheia150/ccs/tools/compiler/ti-cgt-c2000_22.6.1A23259/include"
],
"defines": [
"UNICODE",
"_UNICODE",
"__TMS320C28XX__",
"__interrupt=" // 定义为空,消除红色波浪线
],
"cStandard": "c11",
"compilerPath": "C:/ti/ccstheia150/ccs/tools/compiler/ti-cgt-c2000_22.6.1A23259/bin/cl2000.exe",
"intelliSenseMode": "clang-x64"
}
],
"version": 4
}

第 6 行到第 21 行是我们要根据工程修改的地方,其余的都是文件框架,直接复制就行。
“includePath” 中填写的是编译器搜索头文件的路径。${workspaceFolder} 表示工程根目录,然后依次添加你自己新添加的包括.h 文件的文件夹路径 (我这里没有新建.h 文件以及文件夹,所以只有第 6 行)。
第 7 行的 CPU1_FLASH/syscfg 是为了包含 syscfg 生成的 board.h 文件。如果你设置的是烧录到 RAM,那路径应该改成 CPU1_RAM/syscfg。双核 CPU 同理。
下面的三行是包括的 driverlib 文件夹的路径。
includePath 的最后一行的路径是 C2000 的 C 标准函数库头文件路径。这个要到 CCS 的安装目录里面找。或者你可以在工程文件里面包含一下标准库的头文件的路径,然后跳转进去,CCS 的标题就会变成该头文件的路径,就像下面这样:

“defines” 中填写的是编译器预定义的宏。这里定义了三个宏,第一个是 UNICODE,第二个是_UNICODE,第三个是__TMS320C28XX__。这三个宏在 driverlib 中会使用到。
“compilerPath” 是编译器的路径,添加这个是为了防止 VSCODE 无法跳转某些标准库的头文件,实际上并没有什么用。这个要根据你的安装路径来修改。
“intelliSenseMode” 是智能提示模式,这里选择 clang-x64。
将 c_cpp_properties.json 文件修改好之后,应该就能正常跳转和补全了,而且不会有红色波浪线报错。

让 VSCODE 正常编译

将 gmake 添加到环境变量中

要在 VSCODE 中编译 C2000 的工程,本质上还是调用 CCS 的编译器,也就是 gmake。所以我们首先要把 gmake 添加到环境变量中,然后才在 VSCODE 中调用 gmake。
gmake 的安装路径也在 CCS 的安装目录下,路径为:

然后添加到环境变量中:

然后重启电脑,在 VSCODE 中打开终端,输入 gmake -v,如果出现 gmake 的版本信息,说明添加成功。

创建编译脚本

接下来就是创建一个调用 gmake 的编译脚本,在工程根目录新建一个 build.ps1 文件,文件内容如下:

1
2
3
cd ./CPU1_FLASH
gmake -k -j32 all -O
cd ..

这个脚本是在 powershell 中执行上述三条代码。其中 cd ./CPU1_FLASH 是进入 CPU1_FLASH 文件夹,因为 makefile 文件在这个目录里面,如果你设置的是烧录到 RAM,就改成 cd ./CPU1_RAM,双核的我暂时还没试过。gmake -k -j32 all -O 是调用 gmake 编译工程。cd .. 是返回上一级目录。
添加完文件后在 VSCODE 中打开终端,输入.\build.ps1,如果出现编译信息,说明脚本创建成功。

如果出现报错,查看报错信息,是否存在语法错误;如果报错是找不到变量或函数,而且变量或函数正好在你新添加的文件夹里面,CCS 编译设置中也有包含这个文件夹,可以在 CCS 中先编译一遍,把旧的 makefile 文件路径更新一下,就可以在 VSCODE 中编译了。

创建清理脚本

和上面的编译脚本类似,在工程根目录新建一个 clean.ps1 文件,文件内容如下:

cd ./CPU1_FLASH
gmake clean
cd ..

添加工作区

在 VSCODE 中打开你的工程,然后在菜单栏上点击文件 -> 将工作区另存为,将工作区保存到你的工程根目录。

以后再要打开工程,直接双击打开这个.workspace 后缀的工作区文件即可。