3. 开发环境搭建:CCS 安装与多核工程创建

说实话,搞多核DSP开发,第一步就是把家伙事儿备齐。CCS这玩意儿,我用了快十年了,从4.0版本一路跟到现在。每次装新版本,总有些小坑等着你。今天我就把这些年踩过的坑、攒下的经验,一股脑儿倒出来。

3.1 CCS版本选择——别盲目追新

很多人一上来就问:「是不是装最新版最好?」我的回答是:不一定。

我自己就吃过这个亏。有一回项目赶进度,我兴冲冲装了CCS 12.0,结果发现某个老项目的BIOS组件不兼容,折腾了两天才回退到11.2。你想想看,这时间浪费得多冤枉。

我的建议是:

  • 新项目:用CCS 12.x或13.x,支持最新的C66x/ C7x内核
  • 老项目维护:保持跟原开发环境一致的版本
  • 多核开发:至少CCS 10.0以上,对SYS/BIOS和OpenMP支持更好
我的小习惯:电脑上常驻两个版本——一个最新版尝鲜,一个稳定版干活。用虚拟机隔离,互不干扰。

3.2 安装流程——一步步来,别跳步

安装CCS其实不复杂,但有几个关键点容易忽略。我列个清单,你照着做就行。

3.2.1 下载与准备

去TI官网下载离线安装包。别用在线安装,除非你网速特别快。我见过有人在线装了三个小时,最后还失败了。

  • 下载前先注册TI账号,免费
  • 选择对应操作系统的版本(Windows/Linux)
  • 建议下载完整版(Full Installer),大概2-3GB

3.2.2 安装步骤

  1. 关闭杀毒软件——这个很重要。我遇到过安装到一半被拦截,结果注册表写坏了,只能重装系统。
  2. 以管理员身份运行——右键,你懂的。
  3. 选择组件——这里要注意,别全选。只勾选你需要的器件支持包。比如你做C6678,就勾选C6000多核DSP系列。
  4. 安装路径——不要有中文,不要有空格。我习惯用 C:\ti\ccs12xx 这种简洁路径。
  5. 等待——大概20-40分钟,取决于你的电脑配置。
我曾经踩过的坑:安装到99%卡住了,等了半小时没反应。后来发现是Windows Defender在后台扫描。所以,装之前把实时防护关掉,装完再开。

3.3 多核工程创建——从零开始

环境装好了,咱们来建个多核工程。以TMS320C6678为例,这是个8核的DSP,很经典。

3.3.1 创建新工程

打开CCS,点 File → New → CCS Project。会弹出一个对话框,这里有几个关键选项:

选项 推荐设置 说明
Target TI C66x Multicore DSP 选对器件型号
Project name my_multicore_demo 不要中文,不要空格
Output type Executable 生成可执行文件
Device endianness little endian 大多数场景用这个
Compiler version TI v20.2.x (最新) 选最新的稳定版

3.3.2 配置多核启动

多核DSP的启动方式跟单核不一样。每个核都有自己的入口地址。我一般用这种方式:

// main.c - 主核(Core 0)入口
#include <stdio.h>
#include <csl.h>

void main(void) {
    // 初始化系统
    CSL_init();
    
    printf("Core 0 is running!\n");
    
    // 启动其他核
    // 这里用IPC中断唤醒Core 1-7
    for(int i = 1; i < 8; i++) {
        // 设置每个核的入口函数地址
        // 实际项目中用IPCGR寄存器触发
        printf("Starting Core %d...\n", i);
    }
    
    // 主核自己的任务
    while(1) {
        // 调度、监控、数据分发
    }
}

关键点:每个核的代码可以放在同一个工程里,通过编译选项区分。也可以用多个工程,各自生成.out文件,再通过加载器分别加载到对应核。

3.3.3 配置CMD文件

CMD文件决定了代码和数据放在哪里。多核场景下,每个核通常有自己的L2 SRAM,共享的MSMC SRAM和DDR3。我分享一个常用的配置思路:

// 以Core 0为例的CMD片段
MEMORY
{
    /* 本地L2 SRAM,每个核独享 */
    CORE0_L2:  o = 0x10800000  l = 0x00080000  /* 512KB */
    
    /* 共享MSMC SRAM */
    MSMC_SRAM: o = 0x0C000000  l = 0x00400000  /* 4MB */
    
    /* 共享DDR3 */
    DDR3:      o = 0x80000000  l = 0x10000000  /* 256MB */
}

SECTIONS
{
    .text    >  CORE0_L2      /* 代码放本地L2 */
    .data    >  CORE0_L2      /* 数据放本地L2 */
    .bss     >  CORE0_L2
    .stack   >  CORE0_L2
    
    /* 共享数据段 */
    .shared  >  MSMC_SRAM     /* 核间通信数据放这里 */
    .heap    >  DDR3          /* 大块数据放DDR */
}
我的经验:L2 SRAM速度最快,但容量有限。我一般把关键代码和频繁访问的数据放L2,大块数据放DDR。MSMC SRAM适合放核间共享的变量,比如消息队列、标志位。

3.4 多核调试——让所有核跑起来

工程建好了,怎么让8个核同时跑?这里有个小技巧。

在CCS的Debug配置里,选择 Target Configuration,添加所有核。然后右键点击 Connect Target,CCS会依次连接每个核。

连接成功后,你会看到8个核的窗口。每个核都可以单独加载程序、设置断点、查看变量。我习惯的做法是:

  1. 先让Core 0跑起来,初始化共享资源
  2. 再依次加载并启动Core 1-7
  3. 用全局变量或IPC寄存器同步状态
注意:不要同时给所有核加载程序,容易造成JTAG带宽瓶颈。我一个一个来,虽然慢点,但稳定。

3.5 常见问题与避坑

这些年帮不少同事解决过CCS安装和工程配置的问题,总结几个高频坑:

  • 安装后打不开:检查Java环境,CCS依赖JRE。我遇到过JDK版本不兼容的情况。
  • 编译报错找不到头文件:检查Include路径配置。右键工程 → Properties → Build → Include Options。
  • 连接仿真器失败:先检查驱动,再检查仿真器固件版本。XDS100/200/560各有各的驱动。
  • 多核调试时某个核跑飞:大概率是CMD文件配置错了,代码或数据放到了其他核的私有空间。

嗯,说到这个,我想起一个项目。当时调试一个8核的雷达信号处理程序,Core 3总是莫名其妙死机。查了两天,最后发现是CMD文件里把Core 3的堆栈地址写到了Core 2的L2空间里。你说冤不冤?

3.6 本章小结

开发环境搭建这事儿,说难不难,说简单也不简单。关键是要细心,别跳步。CCS装好了,多核工程建起来了,后面的事情就好办了。

我建议你装好环境后,先跑一个简单的「Hello World」多核版本——每个核打印自己的编号。确认所有核都能正常工作,再开始写真正的业务代码。这一步能帮你排除90%的环境问题。

一句话总结:环境搭得好,调试少烦恼。多核开发,从CCS开始。

专注资料整理