Linux对DSP的开发环境搭建

Linux下对DSP28335的开发


在Windows下,一般我们使用CCS开发套件对TI的芯片进行开发,这通常只需要打开CSS新建工程就很容易进行开始编写代码。 但是CCS看起来比较臃肿。 于是就想着在Linux 下尝试搭建开发环境。

环境准备


  • Linux服务器一台(笔者用的是docker容器下Ubuntu)

搭建步骤


  1. 准备工具链

    • 编译器(TI C2000-CGT) 不是GCC
    • 下载https://www.ti.com/tool/C2000-CGT
    • linux版本

    进入上边的连接,网页拉到最下行下载C2000-CGT — C28x/CLA code generation tools (CGT) - compiler 这是工具链的下载器,他有很多和版本,默认选择最新版的,但是我们用的DSP28335芯片比较老旧,新编编译器兼容性不是很好,我在Window下CCS6中看到编译器是15.12.1TLS ,这里也选择对应的版本,注意下载的是linux版本

  2. 我们用wget将下载器download下来

1
wget https://dr-download.ti.com/software-development/ide-configuration-compiler-or-debugger/MD-xqxJ05PLfM/15.12.1.LTS/ti_cgt_c2000_15.12.1.LTS_linux_installer_x86.bin
  1. 检查校验和be4c55eff0f723851feeadca07076312af6b9f80d33cd3149b5352b8c61011b3 是个好习惯
1
sha256sum ti_cgt_c2000_15.12.1.LTS_linux_installer_x86.bin
  1. 目前我们只是下载了下载器,需要用下载器拉去编译链工具。使用前记得提权
1
chmod +x ti_cgt_c2000_15.12.1.LTS_linux_installer_x86.bin
  1. 然后就可以运行下载器
1
2
3
4
$ ./ti_cgt_c2000_15.12.1.LTS_linux_installer_x86.bin

# root @ 7ca288ec64b8 in /opt/ti/ti-cgt-c2000_15.12.1.LTS [12:44:12] C:127
$

这里报错了,看不出来是什么问题

可能是:

  1. 需要图形界面 - 该安装程序可能需要GUI

  2. 缺少依赖库 - 如 GTK 或其他图形库

  3. 强制使用控制台模式安装测试

1
2
3
# 强制使用控制台模式
./ti_cgt_c2000_15.12.1.LTS_linux_installer_x86.bin --console
也没有用
  1. 查看FILE取查看文件头
1
2
3
4
5
6
7
8
9
10
# root @ 7ca288ec64b8 in /opt/ti/ti-cgt-c2000_15.12.1.LTS [12:48:17]
$ head -c 100 ti_cgt_c2000_15.12.1.LTS_linux_installer_x86.bin | od -c
0000000 177 E L F 001 001 001 003 \0 \0 \0 \0 \0 \0 \0 \0
0000020 002 \0 003 \0 001 \0 \0 \0 270 262 306 \0 4 \0 \0 \0
0000040 \0 \0 \0 \0 \0 \0 \0 \0 4 \0 \0 003 \0 ( \0
0000060 \0 \0 \0 \0 001 \0 \0 \0 \0 \0 \0 \0 \0 \0 300 \0
0000100 \0 \0 300 \0 351 304 006 \0 351 304 006 \0 005 \0 \0 \0
0000120 \0 020 \0 \0 001 \0 \0 \0 x 035 \0 \0 x ] 026 \b
0000140 x ] 026 \b
0000144
  1. 这是一个 ELF 32-bit LSB executable
  2. Intel 80386 - 32位架构
  3. 静态链接,没有section header

我的docker 容器是64位的,32位程序需要32位库支持(ia32-libs)

  1. 安装32位库支持
1
apt-get install -y libc6-i386 lib32stdc++6

再次运行下载器

1
2
3
4
5
6
7
8
9
10
11
$ ./ti_cgt_c2000_15.12.1.LTS_linux_installer_x86.bin

Welcome to the C2000 Code Generation Tools Setup Wizard.

----------------------------------------------------------------------------
Select Installation Directory

Please specify the directory where C2000 Code Generation Tools will be
installed. The installation requires 120125 KB.

Destination Directory [/opt/ti/ti-cgt-c2000_15.12.1.LTS/ti-cgt-c2000_15.12.1.LTS]:

这里要填写工具包安装到哪里我设定的是/opt/ti/ti-cgt-c2000_15.12.0LTS 手动输入一下

然后一路回车,安装

  1. 安装完成验证一下是否安装成功
1
2
3
4
5
6
7
$ ls /opt/ti/ti-cgt-c2000_15.12.1.LTS/bin/cl2000
/opt/ti/ti-cgt-c2000_15.12.1.LTS/bin/cl2000

# root @ 7ca288ec64b8 in /opt/ti/ti-cgt-c2000_15.12.1.LTS [12:50:56]
$ /opt/ti/ti-cgt-c2000_15.12.1.LTS/bin/cl2000 --version
>> WARNING: invalid compiler option --version (ignored)
>> ERROR: no source files, nothing to do

至此,编译器工具链安装完成,可以着手编写代码。

工程编写


一般编写dsp28335程序都是移植官方给的标准库,在标准库之上调用。而工程的建立依赖CCS管理,以win 为例,在工程根目录下看到.ccsproject cproject project

ccsproject

  • 项目类型(Executable, Library等)
  • 目标设备配置
  • 编译器工具链设置
  • 调试器配置
  • 构建配置引用

cproject

作用:Eclipse CDT构建系统配置文件(CCS基于Eclipse)
内容

  • C/C++ Build - 构建设置、工具链选项
  • Build Variables - 构建变量
  • Scanner Settings - 代码索引设置
  • Project References - 引用项目
    包含的关键信息
  1. 编译器选项 - 所有 -v28, -ml, --float_support=fpu32
  2. 包含路径 - -I./Driver/inc
  3. 宏定义 - --define=CPU1
  4. 链接器选项 - .cmd 文件、库文件等
文件 作用 编译必需 迁移到Makefile
.ccsproject CCS主配置(设备/调试器) 提取设备信息
.ccsproject Eclipse CDT构建配置 核心来源
.project Eclipse项目描述 不需迁移
.ccxml 调试器连接配置 烧写/调试用

而开发者在编写工程时,一般都是用将标准库链接参与编译,DSP2833x_commonDSP2833x_headers两个文件夹 里边包含了系统库文件、 链接器命令文件、目标配置文件,大部分教程告诉你让你包含对应的头文件路径,在CCS中编译你的工程文件。

这是就是对的。但现在我们的目标是丢掉臃肿的CSS,自己手动管理工程(makefile), 我们需要将库文件复制到工程Library里边。在编写工程前先保证层次工程结构。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-Application  应用层
|-inc
|-src
-Middleware 中间层
|-inc
|-src
-Driver 驱动层
|-inc
|-src
-Library 系统库
|-inc
|-src
DSP2833x_Header_nonBIOS.cmd
F28335.md
-build
main.c
Makefile

由Makefile替代掉原来的.ccsproject 也就是如何编译的问题。

根据目前的层级管理来编写Makefile

编译选项复制CCS6 的配置。

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# ============================================================
# DSP28335 Makefile - Linux 命令行编译
# 编译产物输出到 build/ 目录
# ============================================================
# ---- 编译器配置 ----
CGT_DIR := /opt/ti/ti-cgt-c2000_15.12.1.LTS
COMPILER := $(CGT_DIR)/bin/cl2000
# ---- 输出目录 ----
BUILD_DIR := build
# ---- 编译选项 (来自CCS6) ----
CFLAGS := -v28 -ml -mt --float_support=fpu32 -g \
--display_error_number --diag_warning=225 --diag_wrap=off
# ---- 头文件路径 ----
INCLUDES := -I./Driver/inc \
-I./Library/inc \
-I./Middleware/inc \
-I./Application/inc \
-I$(CGT_DIR)/include
# ---- 源文件目录 ----
SRC_DIRS := Driver/src Library/src Middleware/src Application/src
# ---- 收集源文件 ----
C_SRCS := $(foreach dir,$(SRC_DIRS),$(wildcard $(dir)/*.c)) \
main.c
ASM_SRCS := $(foreach dir,$(SRC_DIRS),$(wildcard $(dir)/*.asm))

# ---- 目标文件 (输出到 build/ 目录) ----
C_OBJS := $(C_SRCS:%.c=$(BUILD_DIR)/%.obj)
ASM_OBJS := $(ASM_SRCS:%.asm=$(BUILD_DIR)/%.obj)
OBJS := $(C_OBJS) $(ASM_OBJS)
# ---- 链接配置 ----
CMD_FILE := ./Library/F28335.cmd
RTS_LIB := /opt/ti/ti-cgt-c2000_15.12.1.LTS/lib/rts2800_fpu32.lib
TARGET := $(BUILD_DIR)/firmware.out
# ============================================================
.PHONY: all clean info
all: info $(TARGET)
@echo ""
@echo "Build complete!"
@ls -lh $(TARGET)
info:
@echo "Output directory: $(BUILD_DIR)/"
@echo "Source files: $(words $(C_SRCS)) C files"
@echo "Target: $(TARGET)"
# 链接规则
$(TARGET): $(OBJS)
@echo "Linking..."
$(COMPILER) --run_linker --library=$(CMD_FILE) \
--output_file=$@ $(OBJS) -l $(RTS_LIB)
# C文件编译规则
$(BUILD_DIR)/%.obj: %.c
@mkdir -p $(dir $@)
$(COMPILER) $(CFLAGS) $(INCLUDES) -o $(notdir $@) $<
@mv $(notdir $@) $@
# 汇编文件编译规则
$(BUILD_DIR)/%.obj: %.asm
@mkdir -p $(dir $@)
$(COMPILER) $(CFLAGS) $(INCLUDES) -o $(notdir $@) $<
@mv $(notdir $@) $@
# 清理规则
clean:
rm -rf $(BUILD_DIR)

编译结果产出firmware.outfrimware.hex

将其烧录到板子上

编译过程中一些出错问题

  1. 提示某些库文件找不到,可库文件已经添加到Library目录下,这是由于库的.h的文件名不匹配改一下文件名就可以了,linux下对文件名大小写非常敏感,原来在windows下,标准库的部分文件名大小写不对,也能编译通过。

比如:DSP2833x_I2c_defines.h → DSP2833x_I2C_defines.h

提示那个不存在就修改对应的大小就ok

安装


使用工具安装UNIFLASH