DSP编程与MPU编程的区别

信息处理 DSP核心
2022-02-09 21:25:29

我在编程经典微控制器方面有一定的熟练度。嵌入式 C,内置外设,中断,嵌入式程序员的日常面包。

我有兴趣将我的技能组合扩展到编程 DSP。当然,基本步骤是获取一些开发工具包、一些手册和教程,然后开始写作。

但我见过一位经验丰富的 Java 开发人员从嵌入式开始编写的微控制器代码。我见过一位嵌入式工程师试图编写 Web 应用程序。我自己从桌面应用程序开发转向编写在服务器场上运行的后端,每秒有数千个请求。

结果并不漂亮——范式、习惯、风格、挂断导致使用设计模式根本不适用,优化给定平台不应该优化的元素,等等。它需要一些有经验的人的辅导来学习必需品并忘记错误的部分。

那么 - 作为具有标准 MPU(ARM7、8052 等)背景的 DSP 初级程序员,我必须学习什么,我必须忘记什么才能编写好的 DSP 代码?两者编程的风格和先决条件之间的基本区别是什么?

2个回答

首先,您当然可以使用 ARM 或 Intel 或 Arduino 或其他任何东西。DSP 芯片是针对最常见的 DSP 操作进行优化的 MPU。

考虑一个 FIR 滤波器。

y[n]=i=0N1h[i]x[ni]

条指令中执行该操作,DSP 必须在一条指令中执行以下操作:N

  1. 和样本相乘h[i]x[ni]
  2. 将乘积添加到累加器中。h[i]x[ni]
  3. 预取,对于下一条指令h[i+1]x[n(i+1)]
  4. 后递增指向h[i+2]x[n(i+2)]

如果累加器是定点的,它的宽度应该足够宽,以至于右边没有舍入,左边有足够的保护位来溢出。那么应该有一个饱和指令(或者当单词移动到输出时会自动完成饱和)。

最后,指向的指针必须具有循环或模寻址模式,以便它“环绕”,因为中的数据存储在循环 FIFO 缓冲区中。x[ni]x[n]

现在,一个 DSP 芯片可能会用它的专用硬件来完成所有这些工作,但你不需要使用 DSP,只要,程序员,愿意处理这些细节。鉴于某些 MPU 的运行时钟速率比大多数廉价 DSP 快得多,即使必须使用多条指令执行所有这些操作,它仍然可能在 ARM 上比在 SHArC 上运行得更快。也许不吧。

在进行循环寻址时,最简单的方法是使用常规数组(如在 C 中),但将该数组的大小定义为 2 的幂(例如)。然后使用AND操作(如C 中的“&”)屏蔽除低位之外的所有位。这将完成对数据索引或地址的模运算。2pp

除此之外,这主要是了解 DSP 的数学,了解有关有限宽度字的数字问题,无论它们是固定的还是浮点的,并且要小心。DSP 编程实际上与任何其他数学编程没有什么不同。

DSP算法在方程中定义,理解这些方程很重要。c/c++编码复杂度不是很高,和驱动代码差不多。