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