DSP

C66xx DSP调试

2019-07-13 14:53发布

前言

最近调试DSP也有一段时间了,期间遇到了不少的问题与新的发现。之前,主要的调试经验是PC程序,比如C/C++, JAVA, Python等,在PC端,操作系统屏蔽了硬件底层,因此在编写和调试应用程序/算法时候,无需关注内存,缓存,中断等问题。但是在嵌入式端,底层非常重要,比如内存的分区,程序中各个段的分配(数据段,代码段,bss段等),这些都需特别注意。

开发、测试环境

  • C66xx DSP
  • windows10

开发过程

主要完成的内容:
  • DSP,FPGA端 SRIO通信
  • NCC模板匹配算法的测试与移植
  • Nand Flash固化与启动
  • RS422串口数据解析及PC端交互

DSP,FPGA端SRIO通信

实现功能:
FPGA端: FPGA通过SRIO发送视频,60fps帧率。
DSP端: 接收FPGA端的视频

NCC模板匹配算法的测试与移植

归一化积相关算法(Normalized Cross Correlation,简称NCC算法),与上面算法相似,依然是利用子图与模板图的灰度,通过归一化的相关性度量公式来计算二者之间的匹配程度。 11478104-eed59ee22dc70947.png image.png 去均值的NCC, Zero-NCC
11478104-ae20d5416c75bc18.png image.png 11478104-021d3b3eaacc4e71.png image.png 在DSP端,由于内存,实时性的要求,直接计算的话速度很慢,中间存在大量的冗余计算。 冗余计算部分:
11478104-96c7de39e46e6dd6.png image.png 优化之后的程序测试:
模板图像存储在L2 SRAM中, 图像存储在MSM核间共享内存中。
32x32模板, 48x48搜索区域, 时间为2ms。
32x32模板, 96x96搜索区域,时间为8ms。
32x32模板, 128x128搜索区域,时间约为15~17ms 由于NCC算法与SRIO控制流程是完全独立的,为了将算法与控制逻辑分离,因此将NCC编译为静态链接库。并且进行了充分的测试,保证结果的一致性。

Nand Flash固化与启动

NAND Flash烧写详细见其他文章 实验了2中启动方式:
1. DSP ROM Bootloader + Nand Flash启动
2. I2C EEPROM + Nand Flash启动 方式2(二次引导)在EVM评估板上测试工程,但是启动速度特别慢,大约10sec+。 方式1在EVM和原板子上测试成功,启动速度快,烧写也相对简单。

RS422串口数据解析及PC端交互

11478104-ccf01f087f80cffe.png image.png RS422是双端线传送信号。 11478104-cc9cebd3d1f0b894.png image.png
本系统中,RS422包头2个字节: 0x66, 0x33 之后是数据位和校验位。 DSP端判断RS422是否发送数据的逻辑:
SRIO每一帧同时发送RS422数据和图像一帧的数据。DSP端设置2个缓冲区,一个缓冲区用于保存上一次RS422的数据,另一个缓冲器保存每次SRIO发送的RS422数据, 在每个Doorbell间隔中,DSP判断2者内存的数据是否发生变化,如果发生变化说明外界RS422有新的数据发送,此时DSP解析RS422的命令,执行相应的操作。

总结

嵌入式开发与普通PC程序开发存在着比较大的差异,开发嵌入式程序首先需要了解整体的硬件结构,调试到具体某一个模块或者单元,需要查阅芯片的文档,结合官网自带的例子,调试嵌入式平台,认真总结经验,这样能力才会逐步提高。