前言
最近调试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模板匹配算法的测试与移植
-
NCC计算公式
https://docs.opencv.org/3.2.0/df/dfb/group__imgproc__object.html#ga3a7850640f1fe1f58fe91a2d7583695d
归一化积相关算法(Normalized Cross Correlation,简称NCC算法),与上面算法相似,依然是利用子图与模板图的灰度,通过归一化的相关性度量公式来计算二者之间的匹配程度。
image.png去均值的NCC, Zero-NCC
image.png image.png
在DSP端,由于内存,实时性的要求,直接计算的话速度很慢,中间存在大量的冗余计算。
冗余计算部分:
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端交互
image.pngRS422是双端线传送信号。
image.png本系统中,RS422包头2个字节: 0x66, 0x33 之后是数据位和校验位。
DSP端判断RS422是否发送数据的逻辑:
SRIO每一帧同时发送RS422数据和图像一帧的数据。DSP端设置2个缓冲区,一个缓冲区用于保存上一次RS422的数据,另一个缓冲器保存每次SRIO发送的RS422数据, 在每个Doorbell间隔中,DSP判断2者内存的数据是否发生变化,如果发生变化说明外界RS422有新的数据发送,此时DSP解析RS422的命令,执行相应的操作。
总结
嵌入式开发与普通PC程序开发存在着比较大的差异,开发嵌入式程序首先需要了解整体的硬件结构,调试到具体某一个模块或者单元,需要查阅芯片的文档,结合官网自带的例子,调试嵌入式平台,认真总结经验,这样能力才会逐步提高。
网友评论