SAM4E单片机之旅——24、使用DSP库求向量数量积
DSP(Digital Signal Processing,数字信号处理)中会使用大量的数学运算。Cortex-M4中,配置了一些强大的部件,以提高DSP能力。同时CMSIS提供了一个DSP库,提供了许多数学函数的高效实现。
这次就先做一个简单的尝试,求两个向量的数量积。
一、 硬件

MAC单元
MAC(Multiply-ACcumulate,乘积累加),是DSP中常用的一种运算。Cortex-M4配置了一个32位的MAC单元,它能在1个周期里实现最高难度为32位乘32位再加64位的运算,或是两个16位乘16位的运算。Cortex-M4支持的MAC指令如下,这些指令都能在1个周期内完成:

SIMD
SIMD(Single Instruction Multiple Data,单指令多数据),可以提高DSP时的计算效率。这在Cortex-M3中不可用的。使用Cortex-M4的SIMD指令,可以在一个周期内并行地完成4个8位数的加减,或是2个16位数的加减。
FPU
FPU是Cortex-M4增加的可选的部件(SAM4E配备了FPU)。其实现了单精度的浮点数运算,包括一些MAC运算:

二、 使用CMSIS的DSP库
CMSIS中,提供了一个DSP库。这里对DSP中常用的数学运算做了很高效的实现。而对于Cortex-M4,其实现也针对SIMD进行了优化。
在CMSIS\Include文件夹中,头文件arm_math.h 声明了这些函数。而在CMSIS\Lib\GCC 中,有针对各平台编译好了的静态库文件。在CMSIS\DSP_Lib\Source 中,有DSP的实现源码。
而在使用arm_math.h 文件的过程中,需要根据目标平台预定义宏ARM_MATH_CM4,ARM_MATH_CM3 或ARM_MATH_CM0 。而若需要使用FPU,则需要在设备头文件(如sam4e16e.h)中将宏__FPU_PRESENT 的值定义为1。
在AS6中,默认已经添加了DSP的支持。
进入工程属性的toolchain选项卡,可以在ARM/GNU C Complier的Directories中选择编译时搜索头文件的路径。AS6在建立工程时,就会一些需要的头文件拷贝到工程目录下,同时做好了路径设置。比如AS6已经把arm_math.h 拷贝到下图中方框指出的路径了:

在ARM/GNU Linker的Libraries选项中,可以选择链接时使用的库以及库的路径。同样,AS6已经把静态库文件拷贝到了工程目录下,且设置好了文件:

在ARM/GNU C Complier的Symbols选项中,可以设置预定义的宏。可以在这里声明说明DSP的目标平台的宏ARM_MATH_CM4:

在设备头文件件中声明__FPU_PRESENT 的值。如果有FPU,则将该宏定义为1,否则定义为0。CMSIS已经做好了定义:
//File: …src\ASF\sam\utils\cmsis\sam4e\include\sam4e16e.h
//Line: 266
/**< SAM4E16E does provide a FPU */
#define __FPU_PRESENT 1另外,如果不使用AS6提供的startup文件,或者需要在自己的代码中使用FPU的话,还需要做额外的设置。相关内容在FPU的示例中做了说明。
三、 简单示例
DSP库里有计算向量数量积的函数。DSP库的函数支持多种类型的定点数,且对于配备了FPU的部件,也支持浮点数。所以只需要简单地调用下所需函数即可:
// 向量为(0.0, 1.1, 2.2, ..., 16.5)
const int VEC_SIZE = 16;
float32_t vec[VEC_SIZE];
for (int i = 0; i < VEC_SIZE; ++i)
vec[i] = 1.1f * i; // 计算向量与自身的数量积
float32_t result = 0;
arm_dot_prod_f32(vec, vec, VEC_SIZE, &result);
// result == 1500.4
查看arm_dot_prod_f32() 的实现,发现其已经为了效率进行了循环展开。而查看另外一些有关定点数的运算,可以发现其实现已经使用了SIMD等特殊指令;有些甚至针对内存访问的延迟进行了优化。不难看出,这个库的实现进行了细致优化的。
另外,除了基本的数学函数,DSP库也实现了快速数学函数(三角函数、开平方等)、实数相关、矩阵运算、统计、滤波、变换(FFT等)、马达控制等功能。arm_math.h 中,已经对各个函数的功能、参数意义等做了详细的说明。
SAM4E单片机之旅——24、使用DSP库求向量数量积的更多相关文章
- SAM4E单片机之旅——23、在AS6(GCC)中使用FPU
浮点单元(Floating Point Unit,FPU),是用于处理浮点数运算的单元. 为使用FPU,除了需要启用FPU外,还需要对编译器进行设置,以使其针对浮点运算生成特殊的指令.虽然在Atmel ...
- SAM4E单片机之旅——13、LCD之ASF初步
在Atmel Studio 6中,集成了Atmel Software Framework(ASF框架).通过它提供的库,可以很快速地完成新的项目. 这次的最终目标使用ASF在LCD上显示出文字“Hel ...
- SAM4E单片机之旅——3、LED闪烁之定时器中断
让一个LED灯闪烁不过瘾,我们应该让这块开发板完成一点更高难度的任务:比如让两个LED灯闪烁. …… 当然了,以我们的现在使用的空循环技术,还是可以实现这点的.但是这样显得略为低端.所以我们使用一个高 ...
- SAM4E单片机之旅——18、通过AFEC(ADC)获取输入的电压
很多时候,一个电压不仅仅需要定性(高电平或者低电平),而且要定量(了解具体电压的数值).这个时候就可以用到模数转换器(ADC)了.这次的内容是测量开发板搭载的滑动变阻器(VR1)的电压,然后把ADC转 ...
- SAM4E单片机之旅——17、通过UART进行标准IO
交互还是很有必要的,而且使用键盘和显示器的交互效率还是很高的.当然,可以直接使用UART进行字符的输入和输出.但是又何必浪费了C的标准输入输出的格式控制之类的功能呢? 这次内容就是使用scanf() ...
- SAM4E单片机之旅——2、LED闪烁之轮询定时器
之前我们使用空循环,达到了延迟的目的,但是这样子的延迟比较不精确.现在就使用实时定时器(RTT)来进行更为精确的计时.RTT虽然不是特别通用,在某些单片机上可能没有,但它较为简单. RTT内部有一个计 ...
- SAM4E单片机之旅——1、LED闪烁之空循环
最近因为导师要写一本关于SAME4单片机的书籍,而我也作为一个嵌入式的初学者看了这本书.现在也让我写写几个小的程序,做做示例.既然写了文档之类的,就发到博客上来吧. 目前关于这芯片能参考的书籍大概就只 ...
- SAM4E单片机之旅——22、GMAC和PHY的介绍与初始化
网络通信的作用不用多说,而这次进行的工作即是对以太网通信过程中,需要用到的硬件部分进行初始化,也介绍了发送和接收数据的方法. 由于较为复杂,所以使用了ASF框架.但是也会对用到的库函数的实现做一个介绍 ...
- SAM4E单片机之旅——21、DMAC之USART回显
DMAC也可以和外设进行数据交互.之前我们曾使用PDC进行USART的数据回显,这次就使用DMAC完成相同的工作.而且由于DMAC有内部的缓冲区,实现起来更为简单. 一. USART设置 因为之前已经 ...
随机推荐
- 【SQL】SQL2012离线帮助文档安装不上的处理手记
注:解决方法在最后,心急的童鞋可以直接往下滚动. 我SQL实例装的是2008 R2版,由于该版自带的SSMS(Microsoft SQL Server Management Studio 管理工具)存 ...
- 驱动开发利器Microsoft Windows Driver Kit 7.1.0下载
在Windows 2000 与Windows XP 系统采用是WINDDK来开发WINDOWS驱动程序,我手头也有WINDDK,可是从Windows Vista开始之后,一般采用Microsoft W ...
- JSON+YAML初步学习+ciscoconfparse
Git git clone 在github.com右上角点击加号创建新的repository 在Linux或Mac命令行下,找到你想存放这个repository的目录,然后git clone 某个re ...
- browser.html – HTML 实现 Firefox UI
browser.html 是一个实验性的项目,用于证明一个概念:使用 HTML 重新实现 Firefox UI ,并作为一个应用程序.它是基于浏览器的 API ,并以浏览器的方式和系统的应用工作.即使 ...
- jQuery 浮动标签插件,帮助你提升表单用户体验
浮动标签模式(Float Label Pattern)是最新流行的一种表单输入域的内容提示方式,当用户在输入框输入内容的时候,原先占位符的内容向上移动,显示在输入的内容的上面.这里推荐的这款 jQue ...
- ABAP 动态生成内表的几种方法
最近要写个程序,既有更新的,也有删除的,需要涉及到很多系统表,如果一个表一个表进行更新或者删除太慢了,于是就想通过创建动态内表来实现这些功能,在网上找了一些资料,经过多次尝试,终于测试成功了.网上讲述 ...
- form中动态生成Radiobutton控件
public partial class GetLabelFields : Form { int tableCount; public GetLabelFields(AxMapControl axma ...
- ArcPy之Python介绍
1.Python简介 Python是一种面向对象.解释型计算机程序设计语言;Python是一种简单易学,功能强大的编程语言.它有高效率的高层数据结构,简单而有效地实现面向对象编程.Python简洁的语 ...
- Hadoop 2.5.1编译
1.环境安装 gcc.gcc-c++.make.cmake.svn yum install lzo-devel zlib-devel gcc gcc-c++ make cmake autoconf a ...
- SharePoint 2013 开发文档管理字段小记
前言 最近有这样一个需求,就是要求在列表库里管理文档,需要多文档管理.带版本控制.可以单独授权等基本操作.于是乎,就开发了一个自定义段,这里介绍一下字段的思路,里面有一些遇到的问题,在群友的帮助下已解 ...