转载:

http://www.embedu.org/Column/Column821.htm

http://blog.sina.com.cn/s/blog_602f87700100r5xe.html

作者:程老师,华清远见嵌入式学院讲师。

很多时候我们要处理的数据,不仅仅是整数和字符串,还有浮点数即小数。在多媒体数据处理方面表现的更多。是不是所有的CPU都支持,浮点运算呢?答案:不是。

我们常常听到赢浮点和软浮点,这些到底说的是什么呢?下面我们就来一探究竟吧。在这里我们说的是ARM核浮点运算。

(1)硬浮点(hard-float)

编译器将代码直接编译成硬件浮点协处理器(浮点运算单元FPU)能识别的指令,这些指令在执行的时候ARM核直接把它转给协处理器执行。FPU 通常有一套额外的寄存器来完成浮点参数传递和运算。使用实际的硬件浮点运算单元(FPU)会带来性能的提升。

(2)软浮点(soft-float)

编译器把浮点运算转成浮点运算的函数调用和库函数调用,没有FPU的指令调用,也没有浮点寄存器的参数传 递。浮点参数的传递也是通过ARM寄存器或者堆栈完成。现在的Linux系统默认编译选择使用hard-float,如果系统没有任何浮点处理器单元,这 就会产生非法指令和异常。因而一般的系统镜像都采用软浮点以兼容没有VFP的处理器。

用一句话总结,软浮点是通过浮点库去实现浮点运算的,效率低;硬浮点是通过浮点运算单元(FPU)来完成的,效率高。

一、使用浮点库实现浮点运算(soft-float)

例如:我想实现两个浮点数相加,代码如下:

使用GNU ARM编译器翻译成的部分汇编代码如下:

从图中我们可以知道,默认情况下,编译器使用的是软浮点,图中__aeabi_fadd这个函数是在浮点库中实现。如果想让代码能正常的运行,还需要在连接的时候静态连接一下浮点库。

在这里我们以一个完成的案例来说明一下,软浮点库的使用方法。

start.S:
        .global _start
        #define USER_MODE 0x10
        _start:
        @设置CPU为user模式
        mov r0,#USER_MODE
        msr cpsr_c,r0
        @跳到main函数
        ldr sp,=0x34000
        bl main
        stop:
        b stop
        main.c:
        int main()
        {
                float f1,f2,f3;
                f1 = 1.24;
                f2 = 1.22;
                f3 = f1 + f2;
                return 0;
        }
        Makefile:
        LD=arm-none-eabi-ld
        OBJDUMP=arm-none-eabi-objdump
        RM=rm -rf
        CFLAG= -g -c
        ASFLAG=-g -c
        OBJ=start.o main.o
        LDFLAGS= -static -L\
        #指定浮点库所在的路径
        "C:\Program Files\yagarto\lib\gcc\arm-none-eabi\4.6.2" -lgcc
        #设置编译模式
        %.o:%.S
        $(CC) $(ASFLAG) $< -o $@

%.o:%.c
        $(CC) $(CFLAG) $< -o $@
        all:$(OBJ)
        $(LD) -Ttext=0x20000 $^ -o arm.elf $(LDFLAGS)
        $(OBJDUMP) -D arm.elf > arm.dis
        clean:
        $(RM) *.o arm.dis arm.elf

使用硬件浮点实现浮点运算(hard-float)

使用硬件浮点的时候,我们需要给编译器传递一些参数,让编译器编译出硬件浮点单元处理器能识别的指令。

(1)-mfpu=name

参数-mfpu就是用来指定要产生那种硬件浮点运算指令,常用的右vfp和neon等。

浮点协处理器指令:

ARM10 and ARM9:
        -mfpu=vfp(or vfpv1 or vfpv2)
        Cortex-A8:
        -mfpu=neon

(2) -mfloat-abi=value

-mfloat-abi=soft 使用这个参数时,其将调用软浮点库(softfloat
lib)来支持对浮点的运算,GCC编译器已经有这个库了,一般在libgcc里面。这时根本不会使用任何浮点指令,而是采用常用的指令来模拟浮点运算。
但使用的ARM芯片不支持硬浮点时,可以考虑使用这个参数。在使用这个参数时,连接时一般会出现下面的提示:

undefined reference to `__aeabi_fdiv'

或者类似的提示,主要因为一般情况下连接器没有去主动寻找软浮点库,这时使用将libgcc库加入即可。

-mfloat-abi=softfp

-mfloat-abi=hard

这两个参数都用来产生硬浮点指令,至于产生哪里类型的硬浮点指令,需要由

-mfpu=xxx参数来指令。这两个参数不同的地方是:

-mfloat-abi=softfp生成的代码采用兼容软浮点调用接口(即使用-mfloat-
abi=soft时的调用接口),这样带来的好处是:兼容性和灵活性。库可以采用-mfloat-abi=soft编译,而关键的应用程序可以采用
-mfloat-abi=softfp来编译。特别是在库由第三方发布的情况下。

-mfloat-abi=hard生成的代码采用硬浮点(FPU)调用接口。这样要求所有库和应用程序必须采用这同一个参数来编译,否则连接时会出现接口不兼容错误。

我们对main.c文件使用硬件浮点重新编译:

翻译成的汇编代码如下:

start.s:
        .global _start
        #define USER_MODE 0x10
        _start:
        @ 设置为所有模式都可以访问协处理器,cortex-A8手册 3.2.27
        mov r0, #0xfffffff
        mcr p15, 0, r0, c1, c0, 2
        @ 使能NEON and VFP协处理器,NEON and VFP enable bit.
        @ 设置fpexc的30位为1去使能NEON and VFP,cortex-A8 手册 13.4.3
        ldr r0, =1<<30
        fmxr fpexc, r0
        @设置CPU为user模式
        mov r0,#USER_MODE
        msr cpsr_c,r0
        @跳到main函数
        ldr sp,=0x34000
        bl main
        stop:
        b stop
        main.c:
        int main()
        {
                float f1,f2,f3;
                f1 = 1.24;
                f2 = 1.22;
                f3 = f1 + f2;
                return 0;
        }
        Makefile:
        CC=arm-none-eabi-gcc
        AS=arm-none-eabi-as
        LD=arm-none-eabi-ld
        OBJDUMP=arm-none-eabi-objdump
        RM=rm -rf
        CFLAG=-g -c -mfpu=neon -mfloat-abi=softfp
        ASFLAG=-g -c -mfpu=neon -mfloat-abi=softfp
        OBJ=start.o main.o

#设置编译模式
        %.o:%.S
        $(CC) $(ASFLAG) $< -o $@

%.o:%.c
        $(CC) $(CFLAG) $< -o $@

all:$(OBJ)
        $(LD) -Ttext=0x20000 $^ -o arm.elf
        $(OBJDUMP) -D arm.elf > arm.dis

clean:
        $(RM) *.o arm.dis arm.elf


一:早期ARM上的浮点模拟器:

早期的ARM没有协处理器,所以浮点运算是由CPU来模拟的,即所需浮点运算均在浮点运算模拟器(float math emulation)上进行,需要的浮点运算,常要耗费数千个循环才能执行完毕,因此特别缓慢。

直到今天,在ARM Kernel配置时,都有如下选项:

Floating point emulation  --->

[ ] NWFPE math emulation

[ ] FastFPE math emulation (EXPERIMENTAL)

在这里,可以配置ARM 浮点模拟器。

浮点模拟器 模拟浮点是利用了undefined instrction handler,这么做带来的后果是带来极频繁的exception,大大增加中断延迟,降低系统实时性。

二:软浮点技术:

软浮点支持是由交叉工具链提供的功能,与Linux内核无关。当使用软浮点工具链编译浮点操作时,编译器会用内联的浮点库替换掉浮点操作,使得生成的机器码完全不含浮点指令,但是又能够完成正确的浮点操作。

三:浮点协处理器:

在较新版本的ARM中,可以添加协处理器。 一些ARM CPU为了更好的处理浮点计算的需要,添加了浮点协处理器。

并定义了浮点指令集。 如果不存在实际的硬件,则这些指令被截获并由浮点模拟器模块(FPEmulator)来执行。

四: 硬件浮点协处理器以及对应指令集的使用:

这里Sam是这样理解的:

想要使用硬件浮点协处理器来帮助运算Application中的浮点运算。需要以下几个前提条件:

1. Kernel中设置支持 硬件协处理器。

2. 编译器支持将浮点运算翻译成硬件浮点运算指令。

1. Kernle的支持:

如果Kernel不支持浮点协处理器,则因为协处理器寄存器等使用权限等问题,协处理器对应指令无法运行。

网络上有位高手指出:

CP15 c1 协处理器访问控制寄存器,这个寄存器规定了用户模式和特权对协处理器的访问权限。我们要使用VFP当然要运行用户模式访问CP10和CP11。

另外一个寄存器是VFP的FPEXC Bit30这是VFP功能的使用位。
其实操作系统在做了这两件事情之后,用户程序就可以使用VFP了。当然,Kernel
除了这2件事外,还处理了其他一些事情。

Sam看了看Kernel中对应代码,发现是汇编后就放弃继续研究了。

Floating point emulation 
--->
[*] VFP-format floating point
maths

Include VFP support code in the kernel. This is needed IF your
hardware includes a VFP unit.

2. 编译器指定浮点指令:

编译器可以显式指定将浮点运算翻译成何种浮点指令。

如果编译器支持软浮点,则其可能会将浮点运算翻译成编译器中自带的浮点库。则不会有真正的浮点运算。

否则,可以翻译成FPA(Floating Point Accelerator)指令。
FPA指令再去查看是否有浮点模拟器。

还可以将浮点运算指定为VFP(vector floating point)指令。

五.
编译器指定编译硬浮点指令:

Sam有个测试程序,测试CPU浮点性能。例如:浮点加减乘除等运算的时间长度:

float src_mem_32[1024] = {1.024};

float dst_mem_32[1024] = {0.933};

for(j = 0; j < 1024; j++)
{
     for(i
= 0; i < 1024; i++)
     {

src_32
= src_mem_32[i] + dst_mem_32[i];
     }

}

通过printf 计算前后毫秒数的差值来看计算能力。

编译:

arm-hisiv200-linux-gcc
-c   -Wall fcpu.c -o
fcpu.o

arm-hisiv200-linux-gcc fcpu.o -o FCPU -L./

运行,则得到32位浮点数加1024次所需要时间。

如果要使用VFP呢?

arm-hisiv200-linux-gcc
-c   -Wall -mfpu=vfp
-mfloat-abi=softfp  fcpu.c -o fcpu.o

arm-hisiv200-linux-gcc -Wall -mfpu=vfp
-mfloat-abi=softfp   fcpu.o -o
FCPU -L./

则运行后发现,所需要时间几乎减小了一半。 说明还是非常有效果的。

关于-mfpu  
-mfloat-abi讲解:见附录2。

另外,如何才能在直观的检查出是否使用VFP呢?

可以通过察看编译出的ASM程序得到结论。

#arm-hisiv200-linux-objdump -d fcpu.o

00000000
<test_F32bit_addition>:
  
0:  
e52db004       
push   
{fp}           
; (str fp, [sp, #-4]!)
  
4:  
e28db000       
add    
fp, sp, #0
  
8:  
e24dd00c       
sub    
sp, sp, #12
  
c:  
e3a03000       
mov    
r3, #0
  10:  
e50b300c       
str    
r3, [fp, #-12]
  14:  
e3a03000       
mov    
r3, #0
  18:  
e50b3008       
str    
r3, [fp, #-8]
  1c:  
e3a03000       
mov    
r3, #0
  20:  
e50b3008       
str    
r3, [fp, #-8]
  24:  
ea000017       
b      
88 <test_F32bit_addition+0x88>
  28:  
e3a03000       
mov    
r3, #0
  2c:  
e50b300c       
str    
r3, [fp, #-12]
  30:  
ea00000d       
b      
6c <test_F32bit_addition+0x6c>
  34:  
e51b200c       
ldr    
r2, [fp, #-12]
  38:  
e59f3064       
ldr    
r3, [pc, #100]  ; a4
<test_F32bit_addition+0xa4>
  3c:  
e0831102       
add    
r1, r3, r2, lsl #2
  40:  
ed917a00       
vldr   
s14, [r1]
  44:  
e51b200c       
ldr    
r2, [fp, #-12]
  48:  
e59f3058       
ldr    
r3, [pc, #88]   ; a8
<test_F32bit_addition+0xa8>
  4c:  
e0831102       
add    
r1, r3, r2, lsl #2
  50:  
edd17a00       
vldr   
s15, [r1]
  54:  
ee777a27       
vadd.f32       
s15, s14, s15
  58:  
e59f304c       
ldr    
r3, [pc, #76]   ; ac
<test_F32bit_addition+0xac>
  5c:  
edc37a00       
vstr   
s15, [r3]
  60:  
e51b300c       
ldr    
r3, [fp, #-12]
  64:  
e2833001       
add    
r3, r3, #1
  68:  
e50b300c       
str    
r3, [fp, #-12]
  6c:  
e51b200c       
ldr    
r2, [fp, #-12]
  70:  
e59f3038       
ldr    
r3, [pc, #56]   ; b0
<test_F32bit_addition+0xb0>
  74:  
e1520003       
cmp    
r2, r3
  78:  
daffffed       
ble    
34 <test_F32bit_addition+0x34>
  7c:  
e51b3008       
ldr    
r3, [fp, #-8]
  80:  
e2833001       
add    
r3, r3, #1
  84:  
e50b3008       
str    
r3, [fp, #-8]
  88:  
e51b2008       
ldr    
r2, [fp, #-8]
  8c:  
e59f301c       
ldr    
r3, [pc, #28]   ; b0
<test_F32bit_addition+0xb0>
  90:  
e1520003       
cmp    
r2, r3
  94:  
daffffe3       
ble    
28 <test_F32bit_addition+0x28>
  98:  
e28bd000       
add    
sp, fp, #0
  9c:  
e49db004       
pop    
{fp}           
; (ldr fp, [sp], #4)
  a0:  
e12fff1e       
bx     
lr

这里明显包含vfp指令。 所以是使用vfp指令的:

arm-hisiv200-linux-gcc
-c   -Wall -mfpu=vfp
-mfloat-abi=softfp  fcpu.c -o fcpu.o

注意:VFP 指令指令在附录1中。

如果使用:

arm-hisiv200-linux-gcc
-c   -Wall fcpu.c -o
fcpu.o

#arm-hisiv200-linux-objdump -d fcpu.o

00000000
<test_F32bit_addition>:
  
0:  
e92d4800       
push    {fp,
lr}
  
4:  
e28db004       
add    
fp, sp, #4
  
8:  
e24dd008       
sub    
sp, sp, #8
  
c:  
e3a03000       
mov    
r3, #0
  10:  
e50b300c       
str    
r3, [fp, #-12]
  14:  
e3a03000       
mov    
r3, #0
  18:  
e50b3008       
str    
r3, [fp, #-8]
  1c:  
e3a03000       
mov    
r3, #0
  20:  
e50b3008       
str    
r3, [fp, #-8]
  24:  
ea000019       
b      
90 <test_F32bit_addition+0x90>
  28:  
e3a03000       
mov    
r3, #0
  2c:  
e50b300c       
str    
r3, [fp, #-12]
  30:  
ea00000f       
b      
74 <test_F32bit_addition+0x74>
  34:  
e51b200c       
ldr    
r2, [fp, #-12]
  38:  
e59f3068       
ldr    
r3, [pc, #104]  ; a8
<test_F32bit_addition+0xa8>
  3c:  
e7932102       
ldr    
r2, [r3, r2, lsl #2]
  40:  
e51b100c       
ldr    
r1, [fp, #-12]
  44:  
e59f3060       
ldr    
r3, [pc, #96]   ; ac
<test_F32bit_addition+0xac>
  48:  
e7933101       
ldr    
r3, [r3, r1, lsl #2]
  4c:  
e1a00002       
mov    
r0, r2
  50:  
e1a01003       
mov    
r1, r3
  54:  
ebfffffe       
bl     
0 <__aeabi_fadd>

  58:  
e1a03000       
mov    
r3, r0
  5c:  
e1a02003       
mov    
r2, r3
  60:  
e59f3048       
ldr    
r3, [pc, #72]   ; b0
<test_F32bit_addition+0xb0>
  64:  
e5832000       
str    
r2, [r3]
  68:  
e51b300c       
ldr    
r3, [fp, #-12]
  6c:  
e2833001       
add    
r3, r3, #1
  70:  
e50b300c       
str    
r3, [fp, #-12]
  74:  
e51b200c       
ldr    
r2, [fp, #-12]
  78:  
e59f3034       
ldr    
r3, [pc, #52]   ; b4
<test_F32bit_addition+0xb4>
  7c:  
e1520003       
cmp    
r2, r3
  80:  
daffffeb       
ble    
34 <test_F32bit_addition+0x34>
  84:  
e51b3008       
ldr    
r3, [fp, #-8]
  88:  
e2833001       
add    
r3, r3, #1
  8c:  
e50b3008       
str    
r3, [fp, #-8]
  90:  
e51b2008       
ldr    
r2, [fp, #-8]
  94:  
e59f3018       
ldr    
r3, [pc, #24]   ; b4
<test_F32bit_addition+0xb4>
  98:  
e1520003       
cmp    
r2, r3
  9c:  
daffffe1       
ble    
28 <test_F32bit_addition+0x28>
  a0:  
e24bd004       
sub    
sp, fp, #4
  a4:  
e8bd8800       
pop    
{fp, pc}

则不包含VFP指令。

且去调用 __aeabi_fadd

六:新一代ARM
浮点引擎---Neon:

Neon是ARM核心附带的浮点SIMD引擎,可以把它当一个DSP用。

如果不使用Neon,就只能有CPU自带的VFP进行浮点运算。标准A8的VFP没有管线化,速度是比较低的。A9的VFP管线化后,效能有明显提升,但还是不如Neon。

Neon支持与VFP类似,都需要编译器和Kernel双方支持才可以。

Kernel配置中:

Floating point emulation 
--->

[*] VFP-format floating point maths
[ ]  
Advanced SIMD (NEON) Extension
support

需要选中。

编译器支持分析如下:

ARM的GCC 编译选项:

http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/ARM-Options.html#ARM-Options

七:
ARM浮点相关编译选项:

1。
-mfloat-abi=name:

Specifies which floating-point ABI to
use.指定浮点应用程序二进制接口

可选值:soft,softfp,hard

soft: 编译器将浮点操作编译成调用输出库....(没吃透,也许是调用编译器中的软浮点实现??)

softfp:
编译器生成硬件浮点指令(汇编语句见附录1)。但继续使用软浮点调用规则。

hard:编译器生成硬件浮点指令(汇编语句见附录1)。使用FPU指定的调用规则。

2.

-mhard-float
Equivalent to
-mfloat-abi=hard.
-msoft-float
Equivalent to
-mfloat-abi=soft.

3.

-mfpu=name

指定在此平台上,何种硬件浮点设备或者硬件浮点模拟器可用。

可用参数:fpa,fpe2,fpe3,maverick,vfp,vfpv3,vfpv3-fp16,vfpv3-d16,vfpv3-d16-fp16,vfpv3xd,vfpv3xd-fp16,neon,neon-fp16,vfpv4,vfpv4-d16,fpv4-sp-d16,neon-vfpv4

vfp:
之前已经详细谈过。

neon:前面也谈过。但neon并不完全支持 IEEE
754。

4.

-mfpe=number
-mfp=number

-mfpe=X -mfp=X 等同于-mfpu=fpeX 其中X为fpe后面的数字。为了与老版本GCC统一。

附录1 :VFP 指令

附录2:

-mfpu=name
      
-mfpe=number
      
-mfp=number

          
This specifies what floating point hardware (or hardware emulation)
is available on the target.  Permissible names
are: fpa, fpe2, fpe3, maverick, vfp.  -mfp and
-mfpe are synonyms for -mfpu=fpenumber, for compatibility with
older versions of GCC.

-mfloat-abi=name
          
Specifies which ABI to use for floating point
values.  Permissible values are: soft, softfp and
hard.

soft and hard are equivalent to -msoft-float and -mhard-float
respectively.  softfp allows the generation of
floating point instructions, but still uses the soft-float calling
conventions.

Sam不明白为什么 hard不能使用。只好使用softfp

附录3:

RVCT 简介:

ARM公司提供的一套编译器。RVCT(RealView Compilation
Tools)业内公认的能够支持所有ARM处理器,并提供最好的执行性能的编译器。

RVDS 4.0中使用的编译器即为RVCT. 优化程度让人惊讶。

附录4:

其它与浮点有关的编译选项:

-ffast-math:

-fno-signed-zeros:高版本GCC才有的优化选项。与浮点里面的 正负0
有关。

附录5:GNU GCC, LD 官方文档:

www.gnu.org

点选 Documentation :
http://www.gnu.org/doc/doc.html

点选 GNU manuals: http://www.gnu.org/manual/manual.html

从list中选中GCC. : http://www.gnu.org/software/gcc/

从中选中Documentation->Manual

此处就是GNU GCC 所有document.

http://gcc.gnu.org/onlinedocs/

Sam需要看得是: GCC 4.6.0 Manual

http://gcc.gnu.org/onlinedocs/gcc-4.6.0/gcc/

LD:

LD则在list中选择:Binutils
(as
bfd binutils
gprof
ld)

http://sourceware.org/binutils/docs/ld/

Hi3716C:

Sam在Hi3716C 平台通常使用如下选项:

-mcpu=cortex-a9

-mfpu=vfp

-mfloat-abi=softfp

-march=armv7

-fsigned-char

-mcpu:
指出目标代码运行于何种ARM processor(ARM处理器)
可用的name  有:arm2, arm250, arm3, arm6, arm60,
arm600, arm610,arm620, arm7, arm7m, arm7d, arm7dm, arm7di, arm7dmi,
arm70, arm700, arm700i, arm710, arm710c, arm7100, arm720,arm7500,
arm7500fe, arm7tdmi, arm7tdmi-s, arm710t, arm720t, arm740t,
strongarm, strongarm110, strongarm1100,strongarm1110, arm8, arm810,
arm9, arm9e, arm920, arm920t, arm922t, arm946e-s, arm966e-s,
arm968e-s, arm926ej-s,arm940t, arm9tdmi, arm10tdmi, arm1020t,
arm1026ej-s, arm10e, arm1020e, arm1022e, arm1136j-s, arm1136jf-s,
mpcore, mpcorenovfp, arm1156t2-s, arm1156t2f-s,
arm1176jz-s, arm1176jzf-s, cortex-a5, cortex-a8, cortex-a9,
cortex-a15,cortex-r4, cortex-r4f, cortex-m4, cortex-m3, cortex-m1,
cortex-m0, xscale, iwmmxt, iwmmxt2, ep9312

-march=armv7
-march 指出目标ARM architecture(ARM指令集)。
可以使用的为:armv2, armv2a, armv3, armv3m, armv4, armv4t, armv5, armv5t,
armv5e, armv5te, armv6, armv6j,armv6t2, armv6z, armv6zk, armv6-m,
armv7, armv7-a, armv7-r, armv7-m, iwmmxt, iwmmxt2, ep9312

ARM 浮点运算的更多相关文章

  1. arm浮点运算

    首先总结一下计算机中的浮点数的存储. 浮点数的标准是IEEE-754,规定了浮点数的存储都是通过科学计算法来存储的,n2-e的表示. 浮点数首先分为,定浮点(fixed-point)和浮点(float ...

  2. iOS程序破解——ARM汇编基础

    原文在此:http://www.cnblogs.com/mddblog/p/4951650.html 一.Thumb指令与ARM指令 Thumb指令为16位,因此存储代码的密度高,节省存储空间.但是功 ...

  3. ARM、Intel、MIPS处理器啥区别?看完全懂了

    安卓支持三类处理器(CPU):ARM.Intel和MIPS.ARM无疑被使用得最为广泛.Intel因为普及于台式机和服务器而被人们所熟知,然而对移动行业影响力相对较小.MIPS在32位和64位嵌入式领 ...

  4. ARM、Intel、MIPS处理器啥区别?看完全懂了【转】

    转自:http://news.mydrivers.com/1/472/472317.htm 安卓支持三类处理器(CPU):ARM.Intel和MIPS.ARM无疑被使用得最为广泛.Intel因为普及于 ...

  5. ARM与x86之3--蝶变ARM

    http://blog.sina.com.cn/s/blog_6472c4cc0100lqr8.html 蝶变ARM 1929年开始的经济大萧条,改变了世界格局.前苏联的风景独好,使得相当多的人选择了 ...

  6. ARM NEON编程系列1-导论

    ARM NEON 编程系列1 - 导论 前言 本系列博文用于介绍ARM CPU下NEON指令优化. 博文github地址:github 相关代码github地址:github NEON历史 ARM处理 ...

  7. arm交叉编译器gnueabi、none-eabi、arm-eabi、gnueabihf、gnueabi区别

    命名规则 交叉编译工具链的命名规则为:arch [-vendor] [-os] [-(gnu)eabi] arch – 体系架构,如ARM,MIPSvendor – 工具链提供商os – 目标操作系统 ...

  8. MPlayer在ARM上的移植(S5PV210开发板)

    MPlayer 1.0已经把大部分解码库都自带了,如ffmpeg,但是自带的音频库在S5PV210下效果非常不好.换成使用libmad效果不错.因此MPlayer 在ARM-Linux的最简单的移植只 ...

  9. ARM指令协处理器处理指令

    ARM支持16个协处理器,在程序执行过程中,每个协处理器忽略属于ARM处理器和其他协处理器指令,当一个协处理器硬件不能执行属于她的协处理器指令时,就会产生一个未定义的异常中断,在异常中断处理程序中,可 ...

随机推荐

  1. UVA - 11134 Fabled Rooks问题分解,贪心

    题目:点击打开题目链接 思路:为了满足所有的车不能相互攻击,就要保证所有的车不同行不同列,于是可以发现,行与列是无关的,因此题目可以拆解为两个一维问题,即在区间[1-n]之间选择n个不同的整数,使得第 ...

  2. emacs写cnblog博客

    emacs的版本 org-mode版本   参考链接: 用Emacs管理博客园博客   用emacs org-mode写cnblogs博客 用emacs org-mode写博客 & 发布到博客 ...

  3. day07 类的进阶,socket编程初识

    类的静态方法: 正常: 添加静态方法: 就会变成一个函数,不会自动传self 参数,不会调用类的变量和实例的变量  不在需要self 名义上归类管,但是它就是一个单独的函数,不在需要传入self,想怎 ...

  4. webdriver高级应用- 启动FireFox的同时打开Firebug

    1. 首先本机Firefox浏览器需要安装一下firebug插件,具体怎么安装这里不赘述,网上教程很多. 2. 具体自动化实现的代码如下: #encoding=utf-8 from selenium ...

  5. TensorFlow——热身运动:简单的线性回归

    过程: 先用numpy建立100个数据点,再用梯度下滑工具来拟合,得到完美的回归线. # _*_coding:utf-8_*_ import tensorflow as tf import numpy ...

  6. [转]linux多命令的顺序执行

    当我们需要一次执行多个命令的时候,命令之间需要用连接符连接,不同的连接符有不同的效果. (1) ; 分号,没有任何逻辑关系的连接符.当多个命令用分号连接时,各命令之间的执行成功与否彼此没有任何影响,都 ...

  7. 项目记事【多线程】:关于 SimpledDateFormat 的多线程问题

    背景: 最近项目引入了 SonarLink,解决代码规范的问题,在检查历史代码的时候,发现了一个问题. 先看代码: public class DateUtil { private static fin ...

  8. 谈谈Python中对象拷贝

    你想复制一个对象?因为在Python中,无论你把对象做为参数传递,做为函数返回值,都是引用传递的. 何谓引用传递,我们来看一个C++交换两个数的函数: void swap(int &a, in ...

  9. ECMA-262 Extractions

    For the purpose of this article, ECMA-262 refers to ECMAScript® 2017 Language Specification. ECMAScr ...

  10. 网络流(自行理解的Dinic)

    自行理解的Dinic 注释即讲解 #include<bits/stdc++.h> ; using namespace std; int read() { ,w=; ;ch=getchar( ...