Blackfin DSP学习心得

呵,学习 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 、形态学处理之类的。更深入的也就不用说了,入门后大家就会渐渐明白适合自己的了。
谈得比较空泛,更具体的还是只能通过实际的例子才讲得明白。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值