香草冰淇淋和代码调试

来源:互联网 发布:linux zip 安装包下载 编辑:程序博客网 时间:2024/04/27 17:42

//=====================================================================
//TITLE:
//    香草冰淇淋和代码调试
//AUTHOR:
//    norains
//DATE:
//    Friday  01-July-2011
//Environment:
//    Keil MDK 4.2
//    STM32F207
//=====================================================================

    不知道大家有没有听过通用的汽车不能吃香草冰淇淋的故事?

 

    有一天,美国通用汽车公司的庞帝雅克部门收到一位客户的抱怨信:"这是我为了同一件事第二次写信给你,这的确是一个事实。"

 

    原来,这位用户家里有一个习惯:每天饭后由全家投票决定吃哪一种口味的冰淇淋。自从新近买了一部庞帝雅克轿车后,只要他每次买的冰淇淋是香草口味,他从店里出来时车子就发不动。但如果买的是其他口味,车子发动就很顺利。

 

    太奇怪了!这可能吗?公司总经理对这封信心存怀疑,但还是派了一位工程师去查看究竟。工程师发现这位车主不像是乱开玩笑的人。当他同车主用完晚餐去买冰淇淋回到车上后,车子果然发不动。试了几次,每次都是这样。而买别的口味的冰淇淋就没有问题。

 

    工程师当然不相信这辆"奇怪"的车子对香草气味过敏。他又开始记录车主的其他资料,发现这位车主买香草冰淇淋所花的时间比买其他口味的要少些。

 

    他又发现,因为香草冰淇淋最畅销,店家为了让顾客每次都能很快拿到,将香草口味特别单独陈列在店面最前端的冰柜里,而将其他口味的冰淇淋放置在离收银台较远的地方。

 

    随着工程师把问题缩小到"为什么这部车从熄火到发动的时间较短就会出问题"时,一个答案浮出水面:是因为"蒸气锁",一定是它!当这位车主买其他口味冰淇淋时,由于时间较长,引擎有足够的时间散热,重新发动时就没有太大的问题。但是买香草冰淇淋时,由于花的时间较短,引擎太热,以至于还无法让"蒸气锁"有足够的散热时间。
  
  而今天在调试STM32F207代码的时候,也发生了类似的事情。其过程如下,将代码编译好,通过MDK的Ctrl+F5进行Debug调试,并且在程序跑起来之后通过命令行的PING就能检测到STM32F207的核心版;如果是将程序下载到核心版的存储器中,重新上电,PING就无法检测到设备。
  
  是不是有点匪夷所思?是不是说这程序只能用Debug的方式启动,而不能直接让CPU执行?其实这问题和通用汽车无法吃香草冰淇淋是一致的。当我们采用Debug方式启动时,为了能够进行代码调试,其实调试器会做一些工作,简单点来说,就是CPU不会以自己最快的速度执行代码;一旦不使用Debug方式,那么CPU就如脱缰野马一般,快速狂奔。所以对于这个问题,我们应该可以想到,很可能是因为CPU快速运转,而导致硬件可能还没有正常初始化就跑到下一步去了。
  
  而事实正是如此,出问题的是这个函数:
  


  代码中的Delay(50)是后来加的,如果在这里不增加延迟的话,就会出现之前所说的问题。其实这道理很简单,当我们执行ADC_Configuration()函数之后,虽然代码已经设置了相应的寄存器,但寄存器表现到相应的引脚还需要一定的时间。假如是以Debug方式,那么到Ethernet_Configuration()函数之前会有一段比较大的延迟时间,而这延迟时间留待硬件初始化是足够了;但如果是不以Debug方式,那么CPU会全速运行,很可能在执行Ethernet_Configuration()函数时硬件还没有真正初始化,从而导致一系列的问题。
  
  通用汽车不能吃香草冰淇淋是一个很有趣的故事,而其中蕴含的道理却又是我们日常开发所经常碰到的。有时候一个问题,并不是因为表面上的原因,而是有更深层次的缘由。
  
  参考文献:《香草冰淇淋的故事》http://www.gmw.cn/content/2004-08/19/content_80057.htm

原创粉丝点击