搜索
bottom↓
回复: 32

【资料分享】K60系列 cortex-m4硬件浮点的使用(转载)

[复制链接]

出100入101汤圆

发表于 2014-12-14 10:44:10 | 显示全部楼层 |阅读模式
http://wmbp520.blog.163.com/blog ... 420121116102022656/

在KEIL中使用MDK-ARM开发cortex-m4(硬件浮点的使用)  

最近在学习ARM公司新推出的cortex-m4系列的ARM芯片,选用的是飞思卡尔的K60系列,它采用的就是cortex-m4核心。cortex-m4比cortex-m3多了个dsp处理单元。增加了dsp单元的优势是显而易见的:在涉及到大量的数学运算时可以采用dsp来处理,大大节约了运算时间和代码量。(K60的浮点运算单元是个可选的部件,由于我拿到的K60还不支持FPU,所以下面涉及到的浮点调试只能用仿真的方式进行)

最新的KEIL MDK-ARM开发环境已经增加了对cortex-m4的支持(我是用的是MDK-ARM Standard Version 4.20),包括仿真支持,也就是说即使你没有拿到开发板也可以来学习cortex-m4. 在器件选择中,这个版本已经增加了飞思卡尔K60系列,在新建工程时可以选择(我选择了Freescale Semiconductor--MK60X256VMD100这个器件)。下面写一下我自己的学习过程。



一、不使用K60的浮点运算单元。

  在默认情况下,K60的浮点单元并没有被打开,一切浮点运算还是软件浮点。

①打开Keil uVision4,新建工程,选择保存路径,选择器件,找到Freescale Semiconductor,展开,在最下面选择MK60X256VMD100。程序问你是否添加这个系列的启动代码到工程中,选择 是(如果没有出现这个选项,可以自己在Keil的安装目录里找,自己添加,其路径为C:\Keil\ARM\Startup\Freescale\K60)。这时一个新的工程就建好了,默认增加了startup_MK60N512MD100.s这个启动文件。

  ②测试浮点运算。我们可以新建一个C文件,用来测试浮点运算使用的是软浮点还是硬浮点。新建c文件里的代码可以如下:

int main(void)
{
    float a=3.14259265357,b=12.98635463738,result;
    result=a*b*b;
    return result;
        
}

extern void SystemInit(void)
{
    int a=1;
    while(a) a--;
}
其中void SystemInit(void)这个函数是为了满足启动文件startup_MK60N512MD100.s中对SystemInit的调用,本来是对器件的初始化,这里只是做测试用,没有实际内容。(如果要得到完整的系统初始化函数,可以到Keil路径C:\Keil\ARM\Startup\Freescale\K60下找到system_MK60N512MD100.c,K60的头文件可以去Keil官方下载:http://www.keil.com/dd/chip/5359.htm)。  然后全部编译,进入调试状态,这里默认进入的是仿真调试。

在生成的汇编代码中我们可以看到以下内容:

0x000002B0 E92D41F0  PUSH          {r4-r8,lr}

     3:         float a=3.14259265357,b=12.98635463738,result;

0x000002B4 480D      LDR           r0,[pc,#52]  ; @0x000002EC

0x000002B6 4604      MOV           r4,r0

0x000002B8 480D      LDR           r0,[pc,#52]  ; @0x000002F0

0x000002BA 4605      MOV           r5,r0

     4:         result=a*b*b;

0x000002BC 4629      MOV           r1,r5

0x000002BE 4620      MOV           r0,r4

0x000002C0 F000F8A6  BL.W          _fmul (0x00000410)



可以看到,生成的汇编代码并没有使用浮点指令(一般是以V打头),进行乘法运算是调用在0x00000410处的_fmul函数来实现的,找到_fmul这个函数,可以发现进行浮点运算是用软件模拟的方式。



二、使用K60的浮点运算单元。

对于内部有浮点运算单元的K60,不使用FPU就是一种资源浪费,所以要开启它。由于默认并没有开启FPU运算,所以这里还有点小小的麻烦。

退出调试状态,在菜单中选择file--Device Database...,打开器件数据库,找到 Freescale Semiconductor--MK60X256VMD100 双击,在Options:中第一行后面添加空格,后面加入FPU2,这一行的最后变为CPUTYPE("Cortex-M4") ESEL ELITTLE FPU2,点击Update,再点击close关闭。 这样这个器件就修改好了。(注:为了防止把数据库中的器件搞乱,可以自己新建一个分类,增加一个器件,把K60这个器件的内容统统拷进这个新建的器件里,再在这个器件里面修改其属性)

器件修改完以后,可以再新建一个Keil工程,跟前面一样,选择被修改过的K60,添加启动代码,添加上面的main函数。这时我们可以打开工程属性窗口,看里面的设置:

Project--Options for Target 'Target1'...(或者直接按Alt+F7),在Target选项卡中,在Code Generation区域可以找到Floating Point Hardware下拉框,默认选择了Use FPU.

工作还没有完成,cortex-m4在默认状态下寄存器并没有打开浮点运算,还要修改启动代码。在Reset_Handler函数中,找到 LDR     R0, =__main 这个代码,在前面加入这几行:

; CPACR is located at address 0xE000ED88
LDR.W R0, =0xE000ED88
; Read CPACR
LDR R1, [R0]
; Set bits 20-23 to enable CP10 and CP11 coprocessors
ORR R1, R1, #(0xF << 20)
; Write back the modified value to the CPACR
STR R1, [R0]
上面这段代码设定寄存器开启了浮点运算单元,否则在执行浮点运算代码时会发生HardFault。

重新编译,进入调试状态,这时可以发现生成的汇编代码跟原来的不一样了:


     3:         float a=3.14259265357,b=12.98635463738,result;

0x000002B0 EDDF1A0E  VLDR          s3,[pc,#0x38]

0x000002B4 EEF00A61  VMOV.F32      s1,s3

0x000002B8 EDDF1A0D  VLDR          s3,[pc,#0x34]

0x000002BC EEB00A61  VMOV.F32      s0,s3

     4:         result=a*b*b;

0x000002C0 EE601A80  VMUL.F32      s3,s1,s0

0x000002C4 EE611A80  VMUL.F32      s3,s3,s0

0x000002C8 EEB01A61  VMOV.F32      s2,s3



所有的浮点运算都是调用的硬件浮点运算指令,在Register观察窗口中也多了个FPU寄存器列表。

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2014-12-14 11:39:09 | 显示全部楼层
有了浮点运算加入让小车程序执行更快。

出100入101汤圆

 楼主| 发表于 2014-12-14 11:39:11 | 显示全部楼层
基于Cortex-M4的飞思卡尔Kinetis的DSP功能

http://blog.chinaaet.com/detail/24339

当今各种处理器主频疯长和硬件资源的不断改进完善,使各种复杂算法的实现成为可能,从而也大大扩展了复杂算法的应用领域。因此,一款处理器的数字信号处理能力也成为衡量其性能的灰常重要的一个指标,我们在芯片选型的时候也常把DMIPS,MFLOPS等衡量计算处理能力的参数作为关键因素,甚至在一些对信号处理能力要求苛刻的项目里,成为决定因素。(注一下,呵呵,省得大家再去谷歌百度了:DMIPS为每秒百万次整数运算指令,MFLPS为每秒百万次浮点运算指令,对我们这些搞单片机的人来说,这两个参数希望记住了)

    说完大方向了,呵呵,咱再转向小方向,在嵌入式领域,对于信号处理的要求已经从专用处理器转向了混合微控制器。人们往往期望一款片子在能够提供出色的数字信号控制的同时,又能为有效地进行其它处理操作提供灵活性。因此在去年二月份,ARM公司发布了为数字信号控制,就是我们传说中的DSC,提供解决方案的Cortex-M4核,在低功耗的数字信号微控制器领域占有了领先地位,在这里不得不对ARM的敏锐的市场定向和商机的捕捉赞一个。

    简单的说,M4相当于M3+DSP指令,呵呵。如果用一句官方对cortex-M4的说法,就是”Cortex-M4处理器完美融合了高效的信号处理能力以及Cortex-M 系列处理器诸多无可比拟的优势,包括低功耗、低成本和易于使用,旨在满足那些新兴的、灵活多变的解决方案的需求”,够官方吧,呵呵。Cortex-M4核具有一个单时钟周期乘法累加(MAC)单元、优化的单指令多数据(SIMD)指令、饱和运算指令和一个可选的单精度浮点运算单元(FPU),因此我们说其为简单的DSC也不为过。

    话完了ARM下面改FSL了,晕,敢情给这俩公司做广告了,哈哈。ARM发布M4核没多久,紧接着飞思卡尔6月份就发布了业界首款针对Cortex-M4的Kinetis系列MCU,行动够迅速的了,呵呵。90nm的工艺,最高150MHz的主频,丰富的外设等等,造就了Kinetis。目前在Kinetis家族的7个成员之中(明年要加Kinetis X了,我有一篇提到过,呵呵),K10,K20,K60,K70有可选的单精度浮点运算单元。下面简单说说Cortex-M4的DSP的一些特点,注意了,又要上图了,呵呵~



图一,Cortex-M4的内核架构,其ARMv指令集为ARMv7E-M,注意了,这可不是咱口中老说的ARM7,指令集和内核不是一回事啊,呵呵。



(1) 对数字信号处理来说,饱和算法是很重要的一个功能(没听过饱和算法的可以到谷歌一下,呵呵,要恶补啊),上图,从左到右为原始波形信号,标准CPU算法(瞧瞧,完全失真了,这就是因为饱和之后溢出造成的运算错误,以致于严重失真),带有饱和算法的dsp指令(可以看出来,溢出部分顶多被滤掉,其他部分正常)。看出效果来了吧,呵呵,咱的Cortex-M4核当然属于第三种,厉害吧,哈哈~

   (2)Cortex-M4核支持的数据类型,定点数据M4支持8位、16位、32位和64位,浮点数据支持8位、16位、32位。

   (3)Cortex-M4核支持的部分DSP指令,包括饱和指令(上面提到的)、乘加指令(MAC,单周期哈)、单指令多数据指令(SIMD)。

   (4)算法支持上,包括滤波算法(最常用的FIR,IIR算法了),域之间的转换(频率到时域,时域到频率等,FFT,DCT等),闭环控制等等。

    当然这些特点介绍完了,大家最关心的就是怎么用它了,呵呵,这个放心,Cortex-M4处理器得到Cortex微控制器软件接口标准(CMSIS)的完全支持,同时ARM公司正在对CMSIS进行扩展,将加入支持Cortex-M4扩展指令集的 C编译器(对我们广大C的爱好者是一个福音啊,呵呵,毕竟汇编虽然在优化性上会好些,不过太难记了),而且ARM也在完善一个DSP优化库,其中包含数字滤波算法和其他基本功能,例如数学计算、三角计算和控制功能等。数字滤波算法也将可以与滤波器设计工具和设计工具包(例如MATLAB和LabVIEW)配套使用,当然这都是后话,具体应用我也没有实际用,所以无法给大家太多的借鉴了,在这方面期待高手的解答和分享,哈哈~

    不过最后要说的是,Cortex-M4虽然带有DSP扩展指令集,不过它只具有简单的DSP特点,比那些功能强大的专用DSP片子差距还是灰常大的,不过毕竟市场定位不一样,咱也不能太期望它给咱们太大的DSP享受,那些对DSP功能要求敏感的项目,这款片子不是好的选择,不过对一些简单的电机控制类而且对成本敏感的项目,注意了哈,这个该是不错的选择吧~

出0入0汤圆

发表于 2014-12-14 11:57:58 | 显示全部楼层
不错,要看看。。DSP 怎么去用,还没有研究过哈

出0入0汤圆

发表于 2014-12-14 12:13:34 | 显示全部楼层
到现在,我还不知道这DSP要用到哪里,在我接触的程序里,似乎没有需要用到浮点运算的

出100入101汤圆

 楼主| 发表于 2014-12-14 13:12:26 | 显示全部楼层
IAR 6.3中自带的基于Cortex-M4核的DSP应用库

http://adi.chinaaet.com/analog/blogdetail/25526.html

今天在玩飞思卡尔Kinetis的时候探索了一下新下载的IAR 6.3,发现了一个惊喜,相比于6.1,在6.3版本中我发现多了CMSIS文件夹(CMSIS解释一下,就是基于ARM Cortex 核的软件接口库),点击进去眼前一亮,看到了DSP_Lib,顿时觉得对IAR的崇拜之情有如滔滔江水连绵不绝了,哈哈,我只能说“好吧,谢谢了,收下了”(咳咳,有点像我们下载资料或者看到好的分享时的评论了),当然也是小小的幻想了本篇博客如果能收到同样的效果的话,那俺就心满意足了,哈哈~

    例程里提供了包括M0,M3,M4核的DSP应用库(提供了整数或者浮点数的复杂运算,包括一些矩阵运算,倒数反相运算,控制函数PID,FIR滤波器,统计功能函数,FFT等等复杂函数),很多功能C文件,即使现在用不到也建议收藏下来,没准以后就用到了。另外,提到DSP库,就不得不多提一句相比于M0和M3,M4有先天的优势,即增加了DSP扩展指令包括一个单时钟周期乘法累加(MAC)单元、优化的单指令多数据(SIMD)指令、饱和运算指令和一个可选的单精度浮点运算单元(FPU),自然优势多多,所以说玩飞思卡尔Kinetis,意法的STM32F4,恩智浦的LPC4000的同志们有福了,哈哈~

    下面就一睹IAR 6.3给我们提供的DSP库工程的风采吧,上图啦:




出0入0汤圆

发表于 2014-12-14 13:32:34 | 显示全部楼层
M4带DSP 不用再软解了 这个 野火的文档里也讲过 有详细例程 可以参考下

出0入0汤圆

发表于 2014-12-14 16:22:57 | 显示全部楼层
fpu是m4的一大亮点啊

出0入0汤圆

发表于 2014-12-14 18:31:19 | 显示全部楼层
M4核自带的DSP 在浮点运算时,优势比较明显 !

出0入0汤圆

发表于 2014-12-14 19:29:35 | 显示全部楼层
学习了,之后做一些浮点运算的时候要用得到

出0入0汤圆

发表于 2014-12-14 20:04:02 | 显示全部楼层
这个要好好研究一下,我的MK22F512是带FPU的

出0入0汤圆

发表于 2014-12-14 20:10:59 | 显示全部楼层
我还在用M0,M4的太高大上了,短期用不到

出0入0汤圆

发表于 2014-12-14 20:13:04 | 显示全部楼层
K60和stm32F407/429同属M4核,它们的DSP功能相同吗?

出100入101汤圆

 楼主| 发表于 2014-12-14 20:15:17 | 显示全部楼层
tian_zi 发表于 2014-12-14 20:13
K60和stm32F407/429同属M4核,它们的DSP功能相同吗?

应该相同,看前面的文章,dsp库都在cmsis下。

出100入101汤圆

 楼主| 发表于 2014-12-17 13:02:55 | 显示全部楼层
http://zhan.renren.com/wwchang?g ... 88&checked=true

M4的DSP功能使用(转载)
STM32F4xx FPU的设置(转)
来源: 杨盛的日志
浮点运算一直是定点CPU的难题,比如一个简单的1.1+1.1,定点CPU必须要按照IEEE-754标准的算法来完成运算,对于8位单片机来说已经完全是噩梦,对32为单片机来说也不会有多大改善。虽然将浮点数进行Q化处理能充分发挥32位单片机的运算性能,但是精度受到限制而不会太高。对于有FPU(浮点运算单元)的单片机或者CPU来说,浮点加法只是几条指令的事情。
        现在又FPU或者硬件浮点运算能力的主要有高端DSP(比如TI F28335/C6000/DM6XX/OMAP等),通用CPU(X87数学协处理器)和高级的ARM+DSP处理器等。
        STM32-F4属于Cortex-M4F构架,这和M0、M3的最大不同就是多了一个F-float,即支持浮点指令集,因此在处理数学运算时能比M0/M3高出数十倍甚至上百倍的性能,但是要充分发挥FPU的数学性能,还需要一些小小的设置:
        1.编译控制选项:虽然STM32F4XX固件库的例程之system_stm32f4XXX.c文件中添加了对应的代码,但给用户评估使用的STM32F4-Discovery例程中却没有,因此MDK4.23编写浮点运算程序时,虽然编译器正确产生了V指令来进行浮点运算,但是因为system_stm32f4XXX.c文件没有启用FPU,因此CPU执行时只认为是遇到非法指令而跳转到HardFault_Handler()中断中原地踏步。因此要保证这个错误不发生,必须要在system_init()函数里面添加如下代码:
/* FPU settings ------------------------------------------------------------*/
  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
  #endif
          因为这个选项是有条件编译控制的,因此需要在工程选项(Project->Options for target "XXXX")中的C/C++选项卡的Define中加入如下的语句:__FPU_PRESENT=1,__FPU_USED =1。这样编译时就加入了启动FPU的代码,CPU也就能正确高效的使用FPU进行简单的加减乘除了。
        但这还远远不够。对于复杂运算,比如三角函数,开方等运算,如果编程时还是使用math.h头文件,那是没法提升效率的:因为math.h头文件是针对所有ARM处理器的,其运算函数都是基于定点CPU和标准算法(IEEE-754),并没有预见使用FPU的情况,需要很多指令和复杂的过程才能完成运算,也就增加了运算时间。因此要充分发挥M4F的浮点功能,就需要使用固件库自带的arm_math.h,这个文件根据编译控制项(__FPU_USED == 1)来决定是使用那一种函数方法:如果没有使用FPU,那就调用keil的标准math.h头文件中定义的函数;如果使用了FPU,那就是用固件库自带的优化函数来解决问题。
        在arm_math的开头部分是有这些编译控制信息:
         #ifndef _ARM_MATH_H
         #define _ARM_MATH_H

         #define __CMSIS_GENERIC              /* disable NVIC and Systick functions */

         #if defined (ARM_MATH_CM4)
                    #include "core_cm4.h"
         #elif defined (ARM_MATH_CM3)
                     #include "core_cm3.h"
         #elif defined (ARM_MATH_CM0)
                     #include "core_cm0.h"
         #else
                   #include "ARMCM4.h"
                   #warning "Define either ARM_MATH_CM4 OR ARM_MATH_CM3...By Default building on ARM_MATH_CM4....."
         #endif

         #undef  __CMSIS_GENERIC              /* enable NVIC and Systick functions */
               #include "string.h"
                #include "math.h"
        就是说如果不使用CMSIS的,就会调用keil自带的标准库函数。否则就用CMSIS的定义。这里因为是用的STM32F4,所以应该要ARM_MATH_CM4控制,即加入core_cm4.h,否则就用使用ARMCM4.h——但在编译时keil会提示找不到这文件。因此需要在工程选项之C/C++选项卡的define中继续加入语句ARM_MATH_CM4。
        加入上述编译控制项之后,高级数学函数的使用基本没问题了,比如正余弦三角函数的计算。但需要注意,如果你直接使用sin()、cos()、sqrt()这样的函数,那结果还算调用keil的math.h,你可以在debug时看对应的代码,其汇编指令为BL.W __hardfp_xxx。因此这时要完成三角函数的计算就要使用arm_sin_f32()或者arm_cos_f32(),用法不变,这两个函数的原型分别在arm_sin_f32.c和arm_cos_f32.c中。通过对256点三角函数表的查询和插值算法得到任意角度的精确函数值,这就比“原装”的sin()、cos()快多了。
        当然有些例外的是开发函数sqrt(),在arm_math.h中是这么定义的:
             static __INLINE arm_status  arm_sqrt_f32(float32_t in, float32_t *pOut)
                     {
                        if(in > 0)
                             {
                                     //    #if __FPU_USED
                                    #if (__FPU_USED == 1) && defined ( __CC_ARM   )
                                              *pOut = __sqrtf(in);
                                   #else      
                                              *pOut = sqrtf(in);
                                   #endif
                                 return (ARM_MATH_SUCCESS);
                            }
                        else
                           {
                               *pOut = 0.0f;
                                return (ARM_MATH_ARGUMENT_ERROR);
                          }
               }   
        即开方用的函数是arm_sqrt_f32(),其中首先判断被开发的书是否大于0,只有大于0的才能进行运算,否则输出结果为0并返回“错误”标志。如果大于0,并且实用了FPU和__CC_ARM控制项,那调用__sqrtf()来完成编译,否则调用sqrtf()——这个sqrtf()是能在keil的math.h中找到的,即调用子函数来完成运算,而__sqrtf()呢?新出现的,相信大家都能猜到是什么玩意儿:对,就是VSQRT指令!因此要把这点性能也要发挥出来,就需要工程选项之C/C++选项卡的define中继续加入语句__CC_ARM才行。大家可以比较一下是否加入__CC_ARM编译后会汇编代码的差别巨大差别。
       当然,对于arm_sqrt_f32()函数还是有些麻烦,如果你确认被开方的书是大于等于0的,那就直接使用__sqrtf()函数完成运算,即一条简单的VSQRT指令。
       STM32F4固件库还提供了其他很有用的数学函数,都位于DSP_Lib文件夹,请大家慢慢探索,Discovery!

出100入101汤圆

 楼主| 发表于 2014-12-17 13:19:51 | 显示全部楼层
本帖最后由 fengyunyu 于 2014-12-17 13:21 编辑

http://www.cnblogs.com/h46incon/p/3516593.html


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 = 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 中,已经对各个函数的功能、参数意义等做了详细的说明。

出0入0汤圆

发表于 2014-12-18 08:48:06 | 显示全部楼层
lzl000 发表于 2014-12-14 16:22
fpu是m4的一大亮点啊

FPU是不是只有FX的芯片里有?DN里有没有呢  FN呢

出0入0汤圆

发表于 2014-12-18 09:11:52 来自手机 | 显示全部楼层
谢谢分享,学习了啊!

出0入0汤圆

发表于 2014-12-18 12:51:59 | 显示全部楼层
luckner 发表于 2014-12-18 08:48
FPU是不是只有FX的芯片里有?DN里有没有呢  FN呢

这个我不清楚,可以查手册

出0入0汤圆

发表于 2014-12-18 15:06:26 | 显示全部楼层
lzl000 发表于 2014-12-18 12:51
这个我不清楚,可以查手册

好的  谢谢了  

出0入0汤圆

发表于 2014-12-18 15:07:25 | 显示全部楼层
学习了,硬件浮点运算速度更快

出0入0汤圆

发表于 2014-12-18 18:12:51 | 显示全部楼层
不知道这个DSP 到底能起多大的作用 。

出0入0汤圆

发表于 2014-12-18 19:37:42 来自手机 | 显示全部楼层
也许这个fpu能让我做做滤波器实验,应该可以用在数字电源里面吧。

出0入0汤圆

发表于 2014-12-19 11:49:31 | 显示全部楼层

F都有FPU,后面X/N貌似描述片上闪存情况。

撸主资料真细。

出0入0汤圆

发表于 2014-12-19 12:53:32 | 显示全部楼层
浮点运算都是调用的硬件浮点运算指令

出0入0汤圆

发表于 2014-12-19 12:59:19 | 显示全部楼层
mmswza 发表于 2014-12-19 11:49
F都有FPU,后面X/N貌似描述片上闪存情况。

撸主资料真细。

这样啊 谢谢分享

出0入0汤圆

发表于 2014-12-19 13:10:33 | 显示全部楼层
谢谢楼主。。。

出0入0汤圆

发表于 2014-12-20 00:13:15 | 显示全部楼层
学习下~   谢谢LZ

出0入0汤圆

发表于 2014-12-21 13:01:06 | 显示全部楼层
顶一下,之前研究过

出0入0汤圆

发表于 2015-1-23 17:01:25 | 显示全部楼层


非常有用额资料 !

出0入0汤圆

发表于 2015-1-23 17:33:58 来自手机 | 显示全部楼层
感谢楼主分享

出0入0汤圆

发表于 2015-1-23 20:33:09 | 显示全部楼层
硬件浮点运算就是好,浮点运算性能提升很多吧

出0入0汤圆

发表于 2015-1-24 16:30:59 | 显示全部楼层
话说iar中开浮点呢,只要设置中弄下吗,请教楼主
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-3 18:39

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表