快乐虾
http://blog.csdn.net/lights_joy/
lights@hb165.com
本文适用于
ADSP-BF561
Visual DSP++ 5.0 (update 6)
欢迎转载,但请保留作者信息
写一行很简单的C代码:
float a = 1234.56;
用vdsp编译后的汇编代码为:
R0 = 20972 ( X ) ;
R0.H = 17562 ;
[ FP + 0x10 ] = R0 ;
有点看不懂,呵呵,R0的值转换为十六进制就是0x449A51EC。根据vdsp文档的说法,其单精度浮点数格式为:
浮点数计算公式:
将0x449A51EC转换为二进制:
0100 0100 1001 1010 0101 0001 1110 1100
可得:
Sign = 0
Mantissa = 001 1010 0101 0001 1110 1100
Exponent = 1000 1001
按照公式
将Exponent转换为十进制,其值为137。
将Mantissa转换为十进制,其值为:
2-3 + 2-4 + 2-6 + 2-9 + 2 -11 + 2-15 + 2-16 + 2-17 + 2-18 + 2-20 + 2-21 =
0.125 + 0.0625 + 0.015625 + 0.001953125 + 0.00048828125 + 0.000030517578125 + 0.0000152587890625 + 0.00000762939453125 + 0.000003814697265625 + 0.00000095367431640625 + 0.000000476837158203125 = 0.205625057220458984375
代入浮点数计算公式:
(-1)0 + 1. 205625057220458984375 * 2 (137-127)
= 1234.56005859375
那么编译器又是如何将1234.56转换为0x449A51EC的呢?
首先转换整数部分,用2除,取余数,其结果为:
1234 / 2 = 617 ….. 0
617 / 2 = 308 …….1
308 / 2 = 154 …….0
154 / 2 = 77 ……...0
77 / 2 = 38 ……….1
38 / 2 = 19 ……….0
19/ 2 = 9 ………….1
9 / 2 = 4………… .1
4/ 2 = 2 …………..0
2/2 = 1……………0
1/2 = 0……………1
即100 1101 0010,用16进制表示则为:0x4d2。
再转换小数部分,用2乘,取整数位:
0.56 * 2 = 1.12取1
0.12 * 2 = 0.24取0
0.24 * 2 = 0.48取0
0.48 * 2 = 0.96取0
0.96 * 2 = 1.92取1
0.92 * 2 = 1.84取1
0.84 * 2 = 1.68取1
0.68 * 2 = 1.36取1
0.36 * 2 = 0.72取0
0.72 * 2 = 1.44取1
0.44 * 2 = 0.88取0
0.88 * 2 = 1.76取1
0.76 * 2 = 1.52取1
小数部分的值为0.1000 1111 0101 11
所以1234.56表示成二进制数就是
100 1101 0010. 1000 1111 0101 11
由于浮点数表示法的尾数部分以1开头,所以上面的这个数可以表示为:
1.00 1101 0010 1000 1111 0101 11 * 210
从浮点数的表示公式即可算出
Exponent = 127 + 10 = 137
而尾数部分则为
00 1101 0010 1000 1111 0101 11
因此整个数就是:
0 1000 1001 00 1101 0010 1000 1111 0101 11
符号位 指数 尾数
从整数的角度来看就是:
0100 0100 1001 1010 0101 0001 1110 1011
十六进制表示为:
4 4 9 A 5 1 E B
奇怪得很,最后居然有偏差。莫非VDSP还有什么机关不成?
FLT_MIN是在float.h中定义的一个常量,用以表示单精度浮点数的最小值。
#define FLT_MIN 1.1754943508222875E-38F
那么这个值从何而来?
从浮点数的表示可以知道,尾数必然是大于等于1的,要取最小值,只能将指数设置为最小值,由于浮点数规定将指数为0的情况表示特殊的浮点数,因此指数只能取1,即
0 00000001 00000000000000000000000
符号位 指数 尾数
从16进制整数看它的值就是 0x00 80 00 00。
根据浮点数的计算公式可知这个值为:
1.0 * 2-126
= 1.1754943508222875079687365372222e-38
这个是计算器的计算结果。
FLT_MAX是在float.h中定义的一个常量,用以表示单精度浮点数的最大值。
#define FLT_MAX 3.4028234663852886E+38F
那么这个值从何而来?
从浮点数的表示可以知道,要取最大值,可以将指数和尾数都设置为最大值,由于标准规定将指数全为1留做特殊表示,故指数最大值为255,这个数即
0 11111110 11111111111111111111111
符号位 指数 尾数
从16进制整数看它的值就是 0x7f 7f ff ff。
根据浮点数的计算公式可知这个值为:
1. 9999997615814208984375 * 2(254-127)
= 3.4028234663852886E+38
这个是计算器的计算结果。
FLT_EPSILON是在float.h中定义的一个常量,用以表示一个单精度浮点数的最小分辨率,文档对此值的描述是:
A constant that represents the smallest value that may added to 1.0 and still result in a change of value (for example, FLT_EPSILON)
也就是加1后要能看得出变化!
FLT_EPSILON定义为:
#define FLT_EPSILON 1.1920928955078125E-07F
那么这个值从何而来?
先看1.0的浮点表示:
0 01111111 00000000000000000000000
符号位 指数 尾数
从十六进制的角度看就是0x3f80 0000
要想把这个值加上一个足够小的值但仍然能看出变化,当然就是把尾数直接加1,这个数即2-23,转换成十进制就是FLT_EPSILON的值。
下面是一个很有意思的问题:
float a = FLT_EPSILON;
这个时候a的值会是什么?
在VDSP下试了一下,a的值看成整数是:0x3400 0000,也就是:
0 01101000 00000000000000000000000
符号位 指数 尾数
即1.0 x 2(104-127) = 1.0 x 2-23
1.5 INF和NAN
IEEE754规定了单精度浮点数的类型:
Type
|
Exponent
|
Fraction
|
Value
|
NAN
|
255
|
Nonzero
|
Undefined
|
Infinity
|
255
|
0
|
(–1)s Infinity
|
Normal
|
1 <= e <= 254
|
Any
|
(–1)s (1.f22-0) 2 e–127
|
Zero
|
0
|
0
|
(–1)s Zero
|
INF的表示要求指数为255,尾数为0,即:
0 11111111 00000000000000000000000
符号位 指数 尾数
也就是0x7f80 0000。
在VDSP下可以用:
float a = 1.0 / 0.0;
来生成一个INF的数。
当然,符号位也可以取负数,即:
1 11111111 00000000000000000000000
符号位 指数 尾数
也就是0xff80 0000。
在VDSP下可以用:
float a = -1.0 / 0.0;
来生成一个-INF的数。
上述两个INF都可以用isinf函数来检测它。
NAN的表示要求指数为255,尾数不为0,即:
0 11111111 00000000000000000000001
符号位 指数 尾数(可取任意不为0的值)
也就是0x7f80 0001这样的数。
在VDSP下可以用:
float a = 0.0 / 0.0;
来生成一个NAN的数,不过这个时候它的值为0xffff ffff。
可以使用isnan函数来检测它。
Vdsp(bf561)中的浮点运算(4):FLT_MAX(2009-8-12)
Vdsp(bf561)中的浮点运算(3):FLT_MIN(2008-12-19)
Vdsp(bf561)中的浮点运算(2):float的疑问(2008-12-18)
Vdsp(bf561)中的浮点运算(1):文档的说法(2008-12-16)
分享到:
相关推荐
2. **存储器支持**:BF561支持NandFlash和NorFlash两种非易失性存储器。u-boot需要包含对应的驱动,以便能够读取和写入这些存储介质。这些驱动通常位于`drivers`目录下。 3. **串口通信**:该版本的u-boot支持通过...
### uclinux-2008r1-rc8到...通过以上知识点的总结,可以看出从uclinux-2008r1-rc8到VDSP5 (bf561)的移植工作涉及了多个方面的技术细节,从硬件配置、编译器设置到内核代码的具体实现,每一步都需要细致入微的工作。
### u-boot-1.1.6-2008R1到VDSP5 (bf561) 的移植记录 #### 1.1 #if 在进行u-boot移植的过程中,遇到的第一个问题是关于`#if`预处理器指令的问题。具体来说,在`u-boot-1.1.6-2008R1\include\configs\bf561-ezkit.h`...
#### 五、VDSP 4.5(BF561)中的CPLB - **LDF配置**: 配置LDF文件以支持CPLB。 - **缓存空间定义**: 定义要缓存的空间。 - ***_basiccrt.s**: 更新`*_basiccrt.s`文件以支持CPLB操作。 - **错误处理**: 处理可能出现...
在描述中提到,UBOOT_BF537在这个环境下被编译,这表明用户可能遇到了与VDSP++工具链兼容性或者配置相关的问题。 然而,"这个文件有bug"指出UBOOT_BF537在原始状态下可能存在错误或缺陷,这可能涉及到代码逻辑、...
《uboot_bf537_VDSP++5.0:嵌入式开发的关键组件与实践》 uboot_bf537_VDSP++5.0是针对ADI公司的Blackfin(BF537)处理器设计的一个特定版本的U-Boot引导加载程序。U-Boot是一款广泛应用在嵌入式系统的开源启动加载...
查表法的基本思想是预先计算一系列函数值并存储在一个数组中,当需要计算某个函数值时,直接从表中查找即可,避免了复杂的数学运算,从而大大提高了计算速度。 #### 三、vdsp中的C语言编程实践 本案例展示了如何在...
这是在VDSP5.0++下面编译成功的uboot,支持的命令 base - print or set address offset bootm - boot application image from memory cmp - memory compare cp - memory copy crc32 - checksum calculation erase -...
### 如何在VDSP下生成和调用DSP库 #### 一、生成DSP库(*.dlb) 在本文中,我们将详细介绍如何在VisualDSP++环境下创建一个基于C语言的DSP库文件(*.dlb)。这个过程对于Blackfin处理器特别适用,同时也适用于其他ADI...
5. **编译与烧录**:配置交叉编译工具链,编译生成适合VDSP架构的u-boot二进制文件,然后通过JTAG或串口等手段将其烧录到BF561的存储器中。 6. **测试与调试**:运行u-boot并进行功能测试,如命令行交互、加载内核...
**视觉数字信号处理(VDSP)简介** Visual DSP++ 是一款强大的开发环境,专为数字信号处理(DSP)应用设计,特别是在嵌入式系统中。它由 Analog Devices 公司提供,结合了图形化界面与高效的编译工具,使得开发者...
VDSP软件说明。对于visual dsp++软件的介绍,以及如何创建工程等的介绍
这是将uclinux-2.6 for bf561的内核移植到Visual DSP 4.5下的工程文件。由于csdn空间限制,删除了Documentation及doj,dlb等中间文件或者无关的内容,请先在http://blackfin.uclinux.org/下载2.6.19.3-ADI-2007R1.1-...
### ADI Blackfin 处理器 Vdsp LDF 文件格式详解 #### 一、概述 在ADI (Analog Devices Inc.) 的Blackfin系列处理器中,`.ldf`(Linker Description File)是一种非常重要的文件类型,它主要用于描述链接器如何...
标题中的“BDMA.zip_BDMA_VDSP_dma_字节内存”揭示了我们即将讨论的核心主题:BDMA(Block Direct Memory Access)技术,它与VDSP(Vector Digital Signal Processor)相关,涉及DMA(Direct Memory Access)操作...
本源码是uboot在bf537芯片上的移植,它是在vdsp++5.0环境下编译的,支持uboot绝大部分常用的命令,方便剪裁
本文将深入探讨与uclinux-2.6(bf561)版本配合使用的根文件系统(rootfs)及其核心知识点,以及如何将ext2文件系统集成到VDSP(BF561)处理器中。 首先,根文件系统(rootfs)是Linux系统启动时必须的文件集合,它包含了...
《IDMA.zip_VDSP++5.0百度云_pleasantb4s:深入解析VDSP++5.0在嵌入式系统开发中的应用》 在嵌入式系统开发领域,高性能数字信号处理(DSP)技术扮演着至关重要的角色。本文将深入探讨IDMA.zip文件中的主要内容——...
描述中提到的“将uboot移植到vdsp5的工程”,暗示了这个项目是关于将U-Boot适配到Blackfin系列处理器中的BF561型号。Blackfin处理器是由 Analog Devices 公司设计的一种混合信号处理器,主要用于数字信号处理(DSP)和...
- **浮点/向量寄存器**:同样有64个64位的FP/VDSP寄存器(V0-V31),用于浮点和向量运算。 4. **内存模型**: - **内存访问**:ARMv8-A支持非对称内存访问模式,可以有不同大小的页表条目来适应不同的内存大小和...