IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 定点DSP的浮点数操作耗时实验 -> 正文阅读

[嵌入式]定点DSP的浮点数操作耗时实验

? ? ? ? 以经典的F28035为例,对于习惯了浮点DSP的朋友来说,用定点DSP,刚开会感觉很烦人,算个数特别麻烦。特别是经常要计算小数,也就是浮点数,例如3.14*3.22,这样的计算在浮点DSP里面不是事儿,很快,但是在定点dsp里面,仅仅这个简单的乘法,就好消耗2us的时间,这样想完成一定功能的计算,那时间消耗多得让控制功能无法实现。

F28035系统时钟定位60M,? 周期为16.67s

但是如果在定点DSP里面进行浮点数的读取和赋值呢?这个会不会消耗很多时间呢?

? ? ? ?下面对一些列的情况做实验来具体看看,以加深印象。

? ? ? ? 实验思路是,通过置低,置高IO口,在这个置低置高之间插入语句,通过示波器看低电平确定语句执行时间。

大概形式如下:

volatile float      f32Temp    = 0.45785;
volatile float      f32Temp1   = 235435.544;
volatile Uint32     u32CNTemp  = 3454324;
volatile Uint32     u32CNTemp1 = 1234556;

void main(void)
{
    Chipinit();
	while(1)
    {
	    GpioDataRegs.GPACLEAR.bit.GPIO28 = 1;  //1
        GpioDataRegs.GPASET.bit.GPIO28 = 1;

        GpioDataRegs.GPACLEAR.bit.GPIO28 = 1;  //2
        u32CNTemp = u32CNTemp1;  u32CNTemp = u32CNTemp1;  
        u32CNTemp = u32CNTemp1;  u32CNTemp = u32CNTemp1;   u32CNTemp = u32CNTemp1;
        GpioDataRegs.GPASET.bit.GPIO28 = 1;
    }
}

?? ? ? ?GpioDataRegs.GPACLEAR.bit.GPIO28 = 1; ?//1
? ? ? ? GpioDataRegs.GPASET.bit.GPIO28 = 1;这两句话,对应下面第一个低电平,时间为118ns

? ? ? ? GpioDataRegs.GPACLEAR.bit.GPIO28 = 1; ?//2
? ? ? ? u32CNTemp = u32CNTemp1; ?u32CNTemp = u32CNTemp1; ?u32CNTemp = u32CNTemp1; ?u32CNTemp = u32CNTemp1; ? u32CNTemp = u32CNTemp1;
? ? ? ? GpioDataRegs.GPASET.bit.GPIO28 = 1;这段话对应下面第二个低电平,时间为300ns,中间执行了五条整形赋值语句,300-118=182,182/5 = 36.4ns, 36.4/16.666667=2.18个系统时钟周期,

即一条整形赋值语句耗费2sysclk。

再讲赋值改为浮点数据赋值:
?

? ? ? ? GpioDataRegs.GPACLEAR.bit.GPIO28 = 1; ?//1
? ? ? ? GpioDataRegs.GPASET.bit.GPIO28 = 1;

        GpioDataRegs.GPACLEAR.bit.GPIO28 = 1; ?//3
? ? ? ? f32Temp = f32Temp1; ?f32Temp = f32Temp1; ? f32Temp = f32Temp1; ? f32Temp =? ? ? ? ? ?       f32Temp1;? ? ?f32Temp = f32Temp1;
? ? ? ? GpioDataRegs.GPASET.bit.GPIO28 = 1;

下图是五条浮点数赋值的情况,第二个低电平时间为400ns,282/5=56.4ns,56.4/16.6667=3.38

即执行一条浮点数的赋值语句耗时大概3个sysclk。

	    GpioDataRegs.GPACLEAR.bit.GPIO28 = 1;  //1
        GpioDataRegs.GPASET.bit.GPIO28 = 1;

        GpioDataRegs.GPACLEAR.bit.GPIO28 = 1;  //4
        u32CNTemp = u32CNTemp1 + u32CNTemp;  
        u32CNTemp = u32CNTemp1 + u32CNTemp;   u32CNTemp = u32CNTemp1 + u32CNTemp;   
        u32CNTemp = u32CNTemp1 + u32CNTemp;    u32CNTemp = u32CNTemp1 + u32CNTemp;
        GpioDataRegs.GPASET.bit.GPIO28 = 1;

再看上面的整形数加法,下面第二个电平可以看出,一条整数加法大概3个sysclk

再来看浮点数加法,如下,就写一条

	    GpioDataRegs.GPACLEAR.bit.GPIO28 = 1;  //1
        GpioDataRegs.GPASET.bit.GPIO28 = 1;

        GpioDataRegs.GPACLEAR.bit.GPIO28 = 1;  //5
        f32Temp = f32Temp + f32Temp1;
        GpioDataRegs.GPASET.bit.GPIO28 = 1;

下图第二个低电平时间为3.3us,即执行浮点加法:f32Temp = f32Temp + f32Temp1;耗费的时间3us以上。
?

?所以,在定点dsp里面千万不能直接做浮点运算,虽然可以算出来,但是特别耗费时间。

但是在定点DSP里面,可以对浮点数进行读取和赋值,这样在寄存器里面对赴定点数搬来搬去的,可以耗时稍微比搬运整形费时一点点。可以接受。

上面浮点数的运算,不管是算数运算还是逻辑运算,都是非常耗时的。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 23:35:27  更:2022-04-01 23:36:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:53:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码