第1章 TI多核C66x DSP介绍 1
1.1 C6678处理器 1
1.1.1 C6678概览 3
1.1.2 外围设备 3
1.2 66AK处理器 3
1.3 66AK2H14/12/06和C6678各项功能对比 4
1.4 C66x处理器内核 6
1.5 电源休眠控制器 8
1.5.1 C66x内核电源休眠管理介绍 9
1.5.2 电源休眠管理特征 9
1.6 锁相环及其设置 10
1.6.1 主PLL和PLL控制器 10
1.6.2 DDR3 PLL 13
1.6.3 PASS PLL 14
1.7 C6678处理器接口通信相关外围设备 15
1.7.1 I2C外围设备 15
1.7.2 SPI外围设备 15
1.7.3 HyperLink外围设备 15
1.7.4 UART外围设备 16
1.7.5 PCIE外围设备 16
1.7.6 TSIP外围设备 16
1.7.7 包加速器 17
1.7.8 EMIF16外围设备 17
1.7.9 安全加速器 17
1.7.10 Gigabit Ethernet开关子系统 17
1.7.11 管理数据输入输出 17
1.7.12 串行RapidIO端口 17
1.7.13 通用目的输入输出 18
1.8 定时器 18
1.9 信号量 18
1.10 多核导航器 19
1.11 设计建议 20
1.11.1 初始化 20
1.11.2 接口驱动程序 20
1.11.3 时间戳的获取 20
1.11.4 EVM板的使用 21
第2章 C66x存储器组织 22
2.1 C66x存储控制器 22
2.1.1 L1P存储控制器 23
2.1.2 L1D存储控制器 23
2.1.3 L2存储控制器 23
2.1.4 外部存储控制器 24
2.1.5 扩展存储控制器 24
2.2 多核共享存储控制器 25
2.2.1 概览 25
2.2.2 C66x内核从接口 26
2.2.3 系统从接口 26
2.2.4 系统主接口 26
2.2.5 外部存储器主接口 26
2.2.6 MSMC存储器 26
2.3 扩展存储控制器XMC 27
2.3.1 存储器映射寄存器概要 28
2.3.2 XMC存储器保护和地址扩展 30
2.3.3 存储器保护和地址扩展过程 33
2.3.4 地址扩展 34
2.3.5 XMC存储器保护结构支持 36
2.3.6 预取缓冲 36
2.4 存储器保护架构 42
2.4.1 存储器保护的目的 42
2.4.2 特权级别 42
2.4.3 存储器保护架构 42
2.5 带宽管理 43
2.5.1 介绍 43
2.5.2 带宽管理架构 44
2.5.3 带宽管理寄存器 45
2.6 设计建议 46
2.6.1 合理规划使用存储器 46
2.6.2 存储器设置成不被Cache缓存和预取 46
第3章 Cache缓存和数据一致性 47
3.1 为什么使用Cache 47
3.2 C64x和C66x DSP之间的Cache区别 48
3.3 Cache存储器结构概览 49
3.4 Cache基础知识 49
3.4.1 直接映射Cache——L1P Cache 50
3.4.2 Cache缺失的类型 51
3.4.3 组相联Cache 52
3.4.4 二级Cache 54
3.5 L1P Cache 55
3.5.1 L1P存储器和Cache 55
3.5.2 L1P Cache结构 56
3.5.3 L1P冻结模式 57
3.5.4 程序启动的一致性操作 57
3.6 L1D Cache 57
3.6.1 L1D存储器和Cache 58
3.6.2 L1D Cache结构 58
3.6.3 L1D冻结模式 59
3.6.4 程序发起的Cache一致性操作 59
3.7 L2 Cache 60
3.7.1 L2存储器和Cache 60
3.7.2 L2 Cache结构 60
3.7.3 L2冻结模式 61
3.7.4 程序发起的Cache一致性操作 62
3.7.5 Cache能力控制 63
3.8 使用Cache 65
3.8.1 配置L1 Cache 65
3.8.2 配置L2 Cache 65
3.9 数据一致性 67
3.9.1 Snoop一致性协议 68
3.9.2 在外部存储器和Cache之间维持一致性 71
3.9.3 对L2 Cache一致性操作使用指导 73
3.9.4 对L1 Cache一致性操作使用指导 74
3.10 片上Debug支持 75
3.11 在运行中改变Cache配置 76
3.11.1 禁用外部存储器Cache功能 76
3.11.2 在运行中改变Cache尺寸 76
3.12 优化Cache性能 76
3.12.1 Cache性能特征 76
3.12.2 阻塞情况 77
3.12.3 优化技术概览 79
3.12.4 应用级优化 79
3.12.5 过程级优化 80
3.12.6 C66x DSP Cache一致性操作小结 89
3.13 设计建议 93
3.13.1 消除虚假地址 93
3.13.2 数据一致性问题 94
第4章 DMA传输 95
4.1 IDMA 95
4.1.1 IDMA结构 96
4.1.2 IDMA通道0 96
4.1.3 IDMA通道1 97
4.2 EDMA3控制器 98
4.2.1 EDMA3控制器介绍 98
4.2.2 EDMA3器件特定的信息 99
4.2.3 EDMA3通道控制器配置 100
4.2.4 EDMA3传输控制器配置 100
4.2.5 EDMA3通道同步事件 101
4.2.6 EDMA3通道控制器 101
4.2.7 EDMA3传输控制器 103
4.3 EDMA3传输类型 104
4.3.1 A同步传输 105
4.3.2 AB同步传输 105
4.4 参数RAM 106
4.4.1 PaRAM参数集 107
4.4.2 Dummy与Null传输比较 108
4.4.3 参数集更新 109
4.4.4 连接传输 109
4.4.5 常数地址模式传输/对齐问题 113
4.4.6 单元大小 113
4.5 发起一个DMA传输 113
4.5.1 DMA通道 113
4.5.2 QDMA通道 115
4.5.3 完成一个DMA传输 116
4.6 提升DMA性能的几点建议 117
4.6.1 尽量用较大的ACNT 117
4.6.2 线性传输 117
4.6.3 地址对齐 118
4.6.4 恰当使用多个CC和TC传输 118
第5章 中断和异常 119
5.1 C6678处理器中断简介 119
5.2 芯片中断控制器 120
5.3 C66x内核中断控制器概述 121
5.3.1 特征 121
5.3.2 功能块图 122
5.4 中断控制器结构 122
5.4.1 事件寄存器 123
5.4.2 事件合并器 124
5.4.3 中断选择器 126
5.4.4 异常合并器 127
5.5 C66x内核事件 128
5.6 中断控制器与DSP交互 129
5.6.1 DSP中断控制器接口 129
5.6.2 DSP服务中断事件 130
5.7 中断设计建议 131
5.7.1 不要过多使用中断或中断嵌套 131
5.7.2 中断服务程序中代码不宜过长 131
5.7.3 中断服务程序改变的全局变量要加上volatile标志 131
第6章 如何使用 132
6.1 常用界面 133
6.1.1 Project Explorer 133
6.1.2 程序窗口 133
6.1.3 目标配置窗口 133
6.1.4 Debug窗口 133
6.1.5 Memory窗口 134
6.1.6 Expressions窗口 134
6.1.7 Breakpoints窗口 135
6.1.8 Problems窗口 135
6.1.9 Console窗口 135
6.2 新建工程 136
6.3 新建一个目标配置文件 138
6.3.1 新建ccxml文件 138
6.3.2 设置仿真器 139
6.3.3 添加器件 140
6.4 常用操作 141
6.4.1 Launch 141
6.4.2 Group 142
6.4.3 Connect 143
6.4.4 加载程序 143
6.4.5 设置断点调试程序 145
6.4.6 复位 145
6.5 常见问题 146
6.5.1 头文件找不到 146
6.5.2 EVM板未初始化,调试找不到DDR3 147
6.5.3 选中不了仿真器 147
6.5.4 加断点调试错误 147
6.5.5 域选择不正确 147
6.5.6 仿真器连接中断电 147
6.6 设置字体和代码风格 147
6.6.1 修改字体 147
6.6.2 代码风格设置 147
6.7 MCSDK 149
6.7.1 MCSDK架构 149
6.7.2 MCSDK特点 149
6.8 TI函数库调用 151
6.8.1 格式选择 151
6.8.2 库的调用 152
6.8.3 库的使用 152
6.9 理解CMD文件 153
6.9.1 CMD文件简介 153
6.9.2 MEMORY命令 154
6.9.3 SECTIONS命令 154
第7章 SYS/BIOS实时操作系统 156
7.1 什么是SYS/BIOS 156
7.1.1 SYS/BIOS的优势 156
7.1.2 SYS/BIOS和XDC TOOL的关系 156
7.2 SYS/BIOS包 159
7.3 SYS/BIOS中使用C++ 159
7.3.1 存储器管理 160
7.3.2 Name Mangling 160
7.3.3 从配置调用对象方法 161
7.3.4 类构造器的折构器 161
7.4 SYS/BIOS配置和编译 161
7.4.1 在工程中添加SYS/BIOS支持 163
7.4.2 创建一个独立的配置工程 163
7.4.3 配置SYS/BIOS应用 164
7.4.4 用XGCONF打开一个配置文件 164
7.4.5 用XGCONF执行任务 165
7.4.6 保存配置 166
7.4.7 关于XCONFG视图 166
7.4.8 使用可用产品视图 167
7.4.9 使用概要视图 167
7.4.10 使用属性视图 168
7.4.11 使用问题视图 169
7.4.12 找到并修正错误 170
7.5 编译一个SYS/BIOS应用 170
7.5.1 了解编译流程 170
7.5.2 编译和连接优化 171
7.6 线程模块 171
7.6.1 SYS/BIOS启动顺序 172
7.6.2 线程模块的概览 173
7.6.3 线程类型 173
7.6.4 线程优先级 173
7.6.5 让步和抢占 173
7.6.6 钩子 175
7.7 硬件中断 176
7.7.1 创建中断 176
7.7.2 硬件中断嵌套和系统堆栈大小 177
7.7.3 硬件钩子 177
7.8 软件中断 178
7.8.1 创建软件中断对象 178
7.8.2 设置软件中断优先级 178
7.8.3 软件中断优先级和系统堆栈大小 178
7.8.4 软件中断执行 179
7.8.5 优点和折中 179
7.8.6 软件中断函数同步 179
7.8.7 软件钩子 179
7.9 任务 180
7.9.1 创建任务 180
7.9.2 任务执行状态和调度 181
7.9.3 任务堆栈 182
7.9.4 测试堆栈溢出 182
7.9.5 任务钩子 182
7.9.6 空闲循环 183
7.10 SYS/BIOS同步模块 184
7.10.1 信号量 184
7.10.2 事件模块 185
7.10.3 门模块 188
7.10.4 邮箱 190
7.10.5 队列 191
7.11 定时服务 191
7.12 Memory 192
7.12.1 新建一个Platform 192
7.12.2 栈 192
7.12.3 Cache配置 194
7.12.4 Cache Runtime API 194
7.12.5 动态存储器分配 194
7.12.6 Heap的实施 196
7.13 硬件抽象层 196
7.14 典型设计实例和建议 196
7.14.1 典型设计 196
7.14.2 设计建议 197
第8章 多核并行设计 199
8.1 并行粒度和并行级别 199
8.2 并行方式 200
8.3 任务类型 200
8.3.1 相同任务的多个副本 200
8.3.2 多个独立任务 201
8.3.3 单个任务拆分成多个子任务 201
8.3.4 多个松散耦合任务 201
8.3.5 耦合度高的任务 202
8.4 依赖关系 202
8.4.1 数据依赖 202
8.4.2 存储器依赖 203
8.5 死锁和活锁 204
8.5.1 死锁 204
8.5.2 活锁 205
8.6 同步 205
8.6.1 SYS/BIOS同步模块 206
8.6.2 采用控制信号实现多核对等同步 206
8.7 fork-join 207
8.8 OpenMP并行设计 208
8.9 任务级优化设计 209
8.9.1 一种典型的任务处理流程 209
8.9.2 优化设计实例 216
第9章 软件优化设计 222
9.1 for循环优化 223
9.1.1 移出能在循环外完成的计算 223
9.1.2 循环体内的大运算换成小运算 224
9.1.3 多重循环 224
9.1.4 for循环中有判断 225
9.2 多核for循环并行任务优化 225
9.2.1 资源占用小的for循环 226
9.2.2 资源占用大的for循环 226
9.3 if声明优化 227
9.3.1 if转换 227
9.3.2 消除if声明 228
9.3.3 相同代码合并减少if声明 229
9.3.4 减少嵌套的if 230
9.3.5 优化条件表达式 230
9.3.6 优化稀疏矩阵 230
9.4 软件流水 231
9.5 正确使用编译指示和关键字 232
9.5.1 restrict关键字 232
9.5.2 nassert关键字 232
9.5.3 interrupt中断关键字 233
9.5.4 near和far关键字 233
9.5.5 const关键字 234
9.5.6 UNROLL编译指示 234
9.5.7 MUST_ITERATE编译指示 234
9.5.8 CODE_SECTION编译指示 235
9.5.9 DATA_SECTION编译指示 235
9.5.10 SET_CODE_SECTION和SET_DATA_SECTION编译指示 236
9.5.11 DATA_ALIGN编译指示 236
9.5.12 STRUCT_ALIGN 236
9.6 采用内建函数 237
9.6.1 数据移动和打包函数 237
9.6.2 使用除法指令 238
9.6.3 使用C66x定点指令实现复数矩阵操作和向量操作 238
9.6.4 浮点和矢量运算 240
9.7 选定正确的优化级别 242
9.8 软件优化小结 243
第10章 距离多普勒成像设计实例 244
10.1 背景介绍 244
10.2 距离多普勒成像算法 244
10.3 数据组织形式 245
10.4 算法的并行化设计 246
10.5 fork-join的设计 247
10.6 脉冲压缩的设计 247
10.6.1 IFFT转为FFT 248
10.6.2 无缓存的大点数FFT、IFFT设计 249
10.6.3 有数据缓冲多核大点数FFT、IFFT设计 249
10.6.4 资源使用情况 250
10.6.5 复数相乘 251
10.6.6 脉冲压缩的伪码实现 251
10.7 其他阶段任务分解 252
10.8 实验结果分析 253
第11章 展望 254
11.1 异构多核SOC处理器 254
11.1.1 异构多核DSP 254
11.1.2 异构多核FPGA 254
11.2 嵌入式软件设计思考 255
11.2.1 掌握系统架构 255
11.2.2 做好软件模块化设计 255
11.2.3 片上系统架构设计的挑战 255
11.2.4 自动化并行设计 255
附录A 257
附录B 265
附录C 272
参考文献 276