CCS使用以及DSP开发

CCS软件操作

workspace 工程文件的存放路径
file->switch workspace->other 更改工程文件的存放路径
project->new ccs project 创建新工程 选择板子型号(6678) 仿真器型号(合众达 blackhawk,spectrum digital,ti)选empty project(with main.c)
view->outline显示当前.h文件所有的宏定义,函数和变量,如果当前窗口是.cpp,那么outline窗口会显示所有的.h文件菜单
view->register显示所有寄存器的值
view->memory browser显示内存地址的值
这几个都是断点调试过程中查看的

DSP进入函数是F3,F5是运行时进入函数,F6运行时下一步,F8运行时到下一个断点
先调试(锤子)再运行(虫子),再加载程序,再LOAD

DSP编程

#pragma DATA_SECTION(in_im, “.ddr3”) 指定变量存储位置,将变量in_im放在".ddr3"段中
#pragma DATA_ALIGN(in_im, 8) 在这个段中以8字节对齐
uint8_t in_im[IM_WID * IM_HEI]; 定义该变量位置大小
volatile提醒编译器它所定义的变量随时会变,因此需要读取时直接从变量地址读取而不是从寄存器读取
memset 将某一内存位置设置为特定值 一般用0来初始化内存单元
Uint16 *a是变量申明,申明一个Uint16类型的指针a
(Uint16 *)a是强制转换,将变量a强制转换为Uint16类型的指针
#include “drv_edma.h” 自定义头文件用""
#include <vlib.h> 系统标准库用<>

开发过程

要在电脑上安装对应仿真器(xds560v2)的驱动,我这次是安了,看网上说有时候不用专门去安装,仿真的时候会自动安装
DSP优化的两种方法:
1对于没有关联性的操作可以用8核来做(比如给每个像素值加一就可,卷积就不行)
2使用库函数
使用库函数肯定会加快的,库函数里有一个_cn的函数是用C写的(它可能只是为了描述算法的思路),但实际在CCS中用到的是另一个汇编语言写的,要是写一个和_cn函数一模一样的C函数那肯定起不到优化的作用,自己写一个函数全是在CPU上跑的,但是它底层汇编语言的库函数用到了DSP的加法器啥的,肯定会优化的。
另 比如有一个Python的库函数,那我写一个和它一模一样的喊叔叔,那这两者的运行速度就是没有区别的!

DSP架构理论

6678是8核DSP,核内有IDMA(双通道),片内集成外设,EDMA(三通道),JTAG仿真器就是seed_xds560v2
EMIF
外部存储器接口(external memory interface)
有WE Strobe Mode和Select Strobe Mode(选通模式)两种工作模式
对外部存储器进行读写(8-bit和16-bit数据宽度)的操作
支持异步存储器(访问速度慢,不需要同步时钟)(ASRAM,NOR和NAND) 程序存储器FLASH
不支持同步存储器(访问速度快,需要同步时钟)(DDR1 SDRAM,SDR SDRAM和Mobile SDR)
SDRAM 最常见的同步存储(还有FIFO),内存条
读写内存时序分为三个部分(setup,strobe,hold) asynchronous:异步
配置CE 空间(定义数据宽度、工作模式、传输时序相关的参数(上面三个))
CE空间:EMIFCE[3:0] (2^23 * 4)/1024/1024=32MB。
dsp的存储空间分为片内和片外两种,片外空间分成四个部分,分别用于映射不同的片外设备,即ce空间
6678为每个CE空间分配了64MB的空间,实际在16位数据宽度模式下,有效空间为32MB,8位数据宽度变为16MB。
DSP是32位数据操作的,也就是每次取得数据宽度是32位,那么16位的EMIF需要将数据分两次传输,
故24位地址线实际对应为[22:0,23],A[23]用于区分高16位还是低16位,同样8位需要分4次传输,需要两位来区分
时序图中的菱形部分表示数据or地址有效
GPIO
通用输入输出(General-purpose input/output)
16个引脚,可以输出,也可以读取引脚状态作为输入 方向寄存器DIR 0输出1输入
可以输出高低电平,也可以设置引脚对上升沿检测,使能上升沿触发中断
SET_DATA 、SET_RIS_TRIG 、CLR_RIS_TRIG
EDMA
增强型直接内存存取(Enhanced Direct Memory Access)
3个通道控制器,10个传输控制器 CC0有2个 CC1有4个 CC2有4个
CC0有16个DMA通道,CC1 64个,CC2 64个
EDMACCRegs->PARAMSET[uiChannel] 对相应的CC和通道进行设置
(每个DMA通道就对应一个中断事件)所以DMA通道的数量等于中断通道的数量????????????????
ACNT表示每一array数据的字节数 BCNT表示每一frame数据的array个数 CCNT表示每一block数据的frame个数
一· 1D数据传输 同一帧中的元素不是连续存放的 有偏移(ELEIDX)有两种同步方式:
ELEIDX表示元素之间的偏移
(1)OPT.FS=0 元素同步 一次同步事件引起一帧中一个元素的传输,传输一次BCNT减一
FRMIDX表示一帧的最后一个元素与后一帧的第一个元素之间的偏移
(2)OPT.FS=1 帧同步 一次同步事件引起一帧数据的传输
FRMIDX表示一帧的第一个元素与后一帧的第一个元素之间的偏移
二· 2D数据传输 同一帧的元素时候连续存放的 因此ELEIDX无意义
(1)OPT.FS=0 一次同步事件传输一帧
https://wenku.baidu.com/view/b5d7f143e45c3b3567ec8bc4.html
(2)OPT.FS=1 一次同步事件传输一帧

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值