arm-linux-gcc的优化选项例如(-O2),可以加速我们的程序,使程序执行效率更高。但是,倘若我们就是需要程序慢一点运行,但是优化却把我们的延时函数优化的没有了的时候,这种优化却不是我们想要的。有时候,我们需要事物差的一面。下边的代码是我的main.c程序。

#define    GPBCON       (*(volatile unsigned long *)0x56000010)
#define    GPBDAT        (*(volatile unsigned long *)0x56000014)
#define    GPB5_out      (1<<(5*2))
#define    GPB6_out      (1<<(6*2))
#define    GPB7_out      (1<<(7*2))
#define    GPB8_out      (1<<(8*2))
void  wait(unsigned long dly)
{
       for(; dly > ; dly--);
}
int main(void)
{
       unsigned long i = ;      
       GPBCON = GPB5_out|GPB6_out|GPB7_out|GPB8_out;  // 将LED1-4对应的GPB5/6/7/8四个引脚设为输出
       while(){
              wait();
              GPBDAT = (~(i<<));        // 根据i的值,点亮LED1-4
              if(++i == ){
                     i = ;
              }
       }
       return ;
}

  这部分程序使用优化选项(-O2)编译的,编译后的汇编程序如下所示。

0000001c <wait>:
  1c:      e12fff1e        bx    lr
 <main>:
  :      e92d4010       stmdb      sp!, {r4, lr}
  :      e3a03b55       mov r3, #      ; 0x15400
  :      e3a04456       mov r4, #    ; 0x56000000
  2c:      e59f0060       ldr   r0, [pc, #]   ; 94 <.text+0x94>
  :      e5843010       str    r3, [r4, #]
  :      ebfffff8 bl    1c <wait>
  :      e3e03000       mvn r3, #      ; 0x0
  3c:      e59f0050       ldr   r0, [pc, #]   ; 94 <.text+0x94>
  :      e5843014       str    r3, [r4, #]
  :      ebfffff4 bl    1c <wait>
  :      e3e03020       mvn r3, #    ; 0x20
  4c:      e5843014       str    r3, [r4, #]
  :      e59f003c       ldr   r0, [pc, #]   ; 94 <.text+0x94>
  :      ebfffff0 bl    1c <wait>
  :      e3e03040       mvn r3, #    ; 0x40
  5c:      e3a01003       mov r1, #      ; 0x3
  :      e5843014       str    r3, [r4, #]
  :      e1a04001       mov r4, r1
  :      e59f0024       ldr   r0, [pc, #]   ; 94 <.text+0x94>
  6c:      ebffffea bl    1c <wait>
  :      e2841001       add  r1, r4, # ; 0x1
  :      e1a03284       mov r3, r4, lsl #
  :      e1e03003       mvn r3, r3
  7c:      e3a02456       mov r2, #    ; 0x56000000
  :      e3510010       cmp r1, #    ; 0x10
  :      e5823014       str    r3, [r2, #]
  :      e3a04000       mov r4, #      ; 0x0
  8c:      1afffff4 bne   <main+0x44>
  :      eafffff4 b      <main+0x48>
  :            andeq      r7, r0, r0, lsr r5

  可以看到,我们的延时函数完全被优化的没有了,那么我们的延时函数还有什么用。实验现象是这个流水灯已经完全看不出来流动,而是全亮,由于流动的太快人眼无法识别以至于看不出来流动了。

  现在,我把优化选项(-O2)去掉,再来看一下反汇编代码。

0000001c <wait>:
  1c:      e24dd008       sub  sp, sp, #8 ; 0x8
  20:      e58d0004       str    r0, [sp, #4]
  24:      ea000002       b     34 <wait+0x18>
  28:      e59d3004       ldr   r3, [sp, #4]
  2c:      e2433001       sub  r3, r3, #1 ; 0x1
  30:      e58d3004       str    r3, [sp, #4]
  34:      e59d3004       ldr   r3, [sp, #4]
  38:      e3530000       cmp r3, #0      ; 0x0
  3c:      1afffff9 bne  28 <wait+0xc>
  40:      e28dd008       add  sp, sp, #8 ; 0x8
  44:      e12fff1e        bx    lr
 <main>:
  :      e52de004       str    lr, [sp, #-]!
  4c:      e24dd00c       sub  sp, sp, #      ; 0xc
  :      e3a03000       mov r3, #      ; 0x0
  :      e58d3004       str    r3, [sp, #]
  :      e59f2048       ldr   r2, [pc, #]   ; a8 <.text+0xa8>
  5c:      e3a03b55       mov r3, #      ; 0x15400
  :      e5823000       str    r3, [r2]
  :      eaffffff   b      <main+0x20>
  :      e59f003c       ldr   r0, [pc, #]   ; ac <.text+0xac>
  6c:      ebffffea bl    1c <wait>
  :      e59f2038       ldr   r2, [pc, #]   ; b0 <.text+0xb0>
  :      e59d3004       ldr   r3, [sp, #]
  :      e1a03283       mov r3, r3, lsl #
  7c:      e1e03003       mvn r3, r3
  :      e5823000       str    r3, [r2]
  :      e59d3004       ldr   r3, [sp, #]
  :      e2833001       add  r3, r3, # ; 0x1
  8c:      e58d3004       str    r3, [sp, #]
  :      e59d3004       ldr   r3, [sp, #]
  :      e3530010       cmp r3, #    ; 0x10
  :      1afffff2 bne   <main+0x20>
  9c:      e3a03000       mov r3, #      ; 0x0
  a0:      e58d3004       str    r3, [sp, #]
  a4:      eaffffef   b      <main+0x20>
  a8:            undefined
  ac:             andeq      r7, r0, r0, lsr r5
  b0:            undefined

这时,我们可以看到延时函数被完整的保存下来了。当然实验现象中,我们也可以看出来流水灯的流动。

  说明一点,当程序出现意想不到的情况时,可以通过反汇编来查看问题的原因。

警惕arm-linux-gcc编译器优化选项的更多相关文章

  1. Ubuntu12.4 64位 安装 arm linux gcc 4.3.2

    一.下载arm linux gcc 4.3.2 http://pan.baidu.com/share/link?shareid=1575352696&uk=2754759285&fid ...

  2. gcc编译器优化给我们带来的麻烦???

    gcc编译器优化给我们带来的麻烦??? 今天看到一个很有趣的程序,如下: ? 1 2 3 4 5 6 7 8 9 int main() {     const int a = 1;     int * ...

  3. gcc编译器常用选项的含义

    -w: 关闭编译时的警告, 也就是编译后不显示任何warning,因此有时编译中会出现一些诸如数据转换之类的可忽略警告, -Wall: 显示编译后所有警告 -W: 显示警告,但是只是显示编译器认为的会 ...

  4. <转载>linux gcc编译器中使用gdb单步调试程序,程序不是顺序执行的。

    原文地址http://blog.csdn.net/abc78400123/article/details/6779108 在用gdb调试,使用s 或n单步执行程序时,发现程序不是按顺序运行的,有时莫名 ...

  5. Linux gcc编译器

    GNU CC(通常称为GCC)是GNU项目的编译器,他能够编译C.C++语言编写的程序. 使用gcc,程序员可以对编译过程有更多控制,编译过程分为3个阶段. --预处理 --汇编 --链接 程序员可以 ...

  6. gcc O2优化选项对内嵌汇编以及函数递归调用的影响

    学习和使用c这些年来,很多方面都未深入研究过,就如脱离了IDE后,我可能连编译一个c文件的命令都写不出来. 最近需要在c中内嵌汇编解决问题,参考网上相关的资料写了一段汇编代码,在测试的时候时好时坏,找 ...

  7. 测试gcc的优化选项

    一.测试准备及原理 测试代码: static void wait(volatile unsigned long dly) { ; dly--); } int main(void) { unsigned ...

  8. 【转】C 编译器优化过程中的 Bug

    C 编译器优化过程中的 Bug 一个朋友向我指出一个最近他们发现的 GCC 编译器优化过程(加上 -O3 选项)里的 bug,导致他们的产品出现非常诡异的行为.这使我想起以前见过的一个 GCC bug ...

  9. gcc 优化选项 -O1 -O2 -O3 -Os 优先级

    http://hi.baidu.com/xiaole10368/item/7cea9b1369cc240db88a1a5c 少优化->多优化: O0 -->> O1 -->&g ...

随机推荐

  1. java.sql.SQLException: Lock wait timeout exceeded --转

    org.springframework.dao.CannotAcquireLockException 的解决> 直接上 bug 的详细信息: 2012-03-12 15:20:31 XmlBea ...

  2. C#读取Exeal文件

    今天写一个读取Exeal的时候遇到一个问题就是引用了Mircosotf.Office.Interop.Exeal类库的时候没有办法读取到 纠结了好久百度了一下发现别人是这样写的using Exeal= ...

  3. c++静态成员与静态函数

    1 静态成员的定义 1 静态变量 c++在类里面进行的仅是引用性声明,不会为之分配内存,要求必须单独对静态数据成员进行定义性的声明.形式为: 类型 类名::静态数据成员名: 此时的定义需要再加关键字s ...

  4. [RAC] oracle rac 后台进程

    一.RAC后台进程 LMON:LOCK Monitor Processes 也被称为Global enqueue service monitor 监控整个集群状况,维护GCS的内存结构 监控非正常终止 ...

  5. Java SSL/TLS Socket实现

    通信端无需向对方证明自己的身份,则称该端处于"客户模式",否则称其处于"服务器模式",无论是客户端还是服务器端,都可处于"客户模式"或者&q ...

  6. Redis与Memcached对比

    Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富,有字符串.链表.集合和有序集合.支持在服务器端计算集合的并,交和补集等.还支持多 ...

  7. 用USB安装Linux系统(centos7)

    网上关于CentOS 7 的安装教程挺多的,但在前期的引导配置上很多都没有写清楚,让人很郁闷,以致于昨天安装的时候总是到不了安装界面.经过一番胡乱倒腾,终于找到了妥妥的解决方案(鸟哥的书功不可没啊^_ ...

  8. 完全用LINUX工作

    http://blog.csdn.net/e6894853/article/details/7881091 下面列出我常用的一些 Linux 程序.一个列表里可能有很多,那是为了方便你来选择,我列出了 ...

  9. 前后端分离 接口管理神器——Rap本地搭建

    我这里要用做mockserver的就是rap了,rap结合了团队管理,项目管理,文档编写.Mock.js.可视化.接口过渡.文档历史版本(赞).mock插件(线上线下切换就只需要注释一句代码就OK), ...

  10. java 用eclipse j2ee写的servlet 程序,WEB-INF下的配置文件web.xml在哪啊?谢谢!

    我用的版本是tomcat7.0,在webcontent\web-inf里只有一个空文件夹lib,写完servlet 类程序,就可以运行了,我想知道自动生成的配置文件在哪里?或者说从哪里能够看出来配置内 ...