学习DSP,特别是Blackfin系列的,没数据手册简直是没法学的。
该系列基本上只有英文资料,而就我目前翻过的所有教材基本上都是从数据手册上摘录一个片段,翻译一下就完事了,连个总结都没有。很多关键的地方(比如中断),要想理解完整,必须同时参考多个数据手册,因此只看教材基本上是云里雾里的。
附件里是bf548与bf533的相关手册,与bf561大部分是一样的。bf561是双核的,在编译与链接库参考手册(6389974860119950_BF_cc_man.pdf)里有关于双核编程的指导。
好吧,再讲讲Blackfin DSP与ARM的区别。
可以把嵌入式分成DSP与MCU两种
MCU一般用于管理任务,更注重代码密度,而不是性能的极限(比如只做一个管理系统,更多的是对外设读写,而外设一般是很慢(想想IIC,SPI,速度再快也不过几M比特)的,因此大部分时间都在等待,很少需要考虑算法的优化),ARM便是这类MCU。
DSP一般用于处理图像、音频、视频(不仅是读写,而是处理,比如编码解码,或者从图像完成人脸检测),它更注重地是发挥处理器的极限性能,而其架构(后讲)也自然地与MCU有较大区别。
以前的话,大部分DSP对管理任务的能力很差,而像ARM这种MCU对于算法性能要求高的(比如图像处理)的任务基本是无能为力。于是,既能有MCU出色 的管理功能,又能有DSP出色的计算性能便是很多人的一个目标,Blackfin DSP便是这样诞生的。它既能作为100%的MCU使用,也能作为100%的DSP使用(这句是从U-boot的应用笔记抄的,呵,100%,哥可不敢乱 说)。
好的,以一个例子说明一下图像处理的艰巨来体现DSP的必要性。
我们现在拍摄的图像再一般都是动辄130W像素,或者300W像素,假设想要从图像中识别出人脸(或车牌号识别,都是一样的)。那么便需要用一些图像处理 与机器视觉的算法对图像进行处理。无论对图像作怎样简单的处理,都需要遍历每个像素,对于130W像素的图像,再快也得运算130W次(计算上寻址之类, 得130W*3~7)。那么对于PC的单核3G的CPU来说,一秒只能遍历几千次图像(这里只是举例说明,实际上由于现代CPU的架构良好,GPU、协处 理器的存在,速度并不会这么慢)。把遍历一次图像看成一次加法,那么3G的CPU就相当于一个只能计算几千次加法的CPU,这样的处理速度难以满足实时要 求。而DSP便是为解决这些问题而存在的。
这里看一下Blackfin DSP的一些特点(为了防止太多废话,这里假设大家有一点CPU的架构知识与汇编知识):
零周期循环:
for (i = 0; i < 1000;i++)
for (j = 0; j < 1000 ;j++)
x = 0;
看上例,对于一般的CPU来说,循环都是模拟实现的,即判断是否计数完成,然后减计数,再JUMP,这至少得3个周期(更要命的是,流水线必须重新填充, 这个隐含了更多的周期浪费),也就是说上面的执行至少得消费4M(3 * 1000 000 + 1000 000)个周期。
而Blackfin DSP使用硬件循环,上面的两个for不消耗周期,即只消费了1M个周期,这个节省是很可观的。
同时Blackfin DSP还使用一个缓存区存放循环体内的4条指令,以进一步提高效率。
循环寻址:
for (i = 0; i < 1000;i++)
a[i % 100] += 1;
大家要知道,%运算不是由硬件支持(对于PC与DSP都一样)的,它的执行效率很低,对于DSP,估计一次得上百个周期。在形态学图像处理中,循环寻址是 很常见的,而每理一个像素要上百个周期,这对DSP是无法接受的。因此DSP提供了一组寄存器,叫DAG,通过合适的配置,可以使地址循环,为了让大家更 明白,将上例改成DSP的实现形式:
p = a;
for (i = 0; i < 1000;i++)
*p++ += 1;
这里假设p已经配置好循环长度为100(这里其实应该用汇编写,不过只是为了演示,而忽略了晦涩的细节),当p累加到100时(依此类推),会自动把p重设为a的起地址。相比于上面的代码,每执行一次循环可节省100多个周期。
特别设计的指令集(对应于特别设计的架构):
1、一些高效指令:
Blackfin DSP有两个MAC,可以在一个周期内同时完成2个16位乘法,而PC的CPU一般是几个周期完成一次乘法。
各种专为视频流处理设置的指令(至今没用过,没法细讲)。
更多高效指令与细节,参考指令集参考手册。
3、并行指令:
一个周期内最高可以同时实现一条32位指令加两条16位指令。这里通过一个例子,大家去体会其中的独到之处:
A1+=R0.L*R2.H,A0+=R0.L*R2.L || R2.L=W[I2++] || R0=[I1--] ;
这是一条汇编指令,在单周期内完成,它完成了两次乘法,并累加到专用累加器,完成两次数据存取,同时移动两次指针。将它换到PC上实现,至少得10个周期。
更多的关于DSP与众不同之处就不多说了,数据手册多看些自然也就明白了。
那么学习Blackfin DSP应该学什么?
虽然它既能完成MCU的功能,又有DSP的强悍,我认为还是侧重DSP的方面的学习,因为它比较贵,还有想学MCU,学ARM更合适,资料多。
要学会DSP,至少得学会汇编(Blackfin的汇编与C类似,好学,但是加了限制),才能深刻理解它的架构(有人说,不会汇编的DSP工程师称不上合 格的工程师,而一般一个高度优化的DSP项目的核心部分都会包含一部分汇编)。不会汇编去看架构,我认为最多只能走马观花(至少不会汇编前,哥是看得糊里 糊涂)。
然后实践一些比较需要DSP的例子(一边看例子,一边学汇编),比如FFT、形态学处理之类的。更深入的也就不用说了,入门后大家就会渐渐明白适合自己的了。
谈得比较空泛,更具体的还是只能通过实际的例子才讲得明白。