原创 I2C程序出现的异常——STM32

2013-5-11 08:26 1406 7 5 分类: 消费电子

 

在I2C程序中,很多时候使用while来判断状态是否发生改变。正常情况下,这个是很合适的。使用while,即做到了检测也起到了延时的作用,比单纯的计数延时要好的多。
但是如果不正常的时候,在while处的程序执行是否还在我们预期范围内,就很难说了。程序卡死在while处的情况会有吗?
首先,如果I2C链路连接有问题,肯定会出现问题的,这个时候由于while检测不到相应的状态改变,在这里卡死很正常。或许这也能帮助我们更快的定位到出错的地方。
但是,如果是链路通信正常,I2C还会检测不到状态的改变而导致while挑不出去的情况吗?
之前在一个论坛(见注1)上看到过一个关于I2C在高负载中断下接收出现异常的情况。但是通篇帖子并没有提到,当异常时程序是仅仅丢失数据,还是不在执行。按照帖子来猜测,感觉是仅仅丢失数据,如果程序卡住了,作者应该会提出来这个问题。但是没有,仅仅说了程序接收的数据不正常。
因为不知道他的I2C程序,是否仅仅使用while作为判断状态改变的依据,还是已经做了相关的超时处理什么的。既然程序中,有超出判断内的情况出现,最好还是将其消除。
对于仅仅使用while的语句,加上必要的超时处理。让程序的执行在判断的情况内。
 
按照正常理解,这里对于while出现卡住的问题,应该很难出现。如果在中断负载很重的情况下,这很难说。帖子中,作者最后说是硬件电路的问题,总线可能缺少一个并联电容。如果存在这样的问题,那么软件作相应的规避可能也是应该的。
 
同时这里提出这样一个问题,当软件运行时,最好的情况下是,一个函数不论输入是什么,都能保证输出时正确的,在可控范围内。这样一程序的整体性能,会是可控的。如果一个函数的输出正确与否,取决于输入,这样很可能造成一些可控范围之外的现象发生。如何做好出错处理,对于一个函数的输出也就十分重要。
 
尤其对于所做的嵌入式设备,因为它们更注重长期运行,不允许有程序卡死的现象出现,对于错误的容限要高一些。这里边对于数据的考虑与处理就要相应更全面。想到这里,发现似乎产品的应用环境越处于底层,对其要求就越高,因为有很多其它高层程序依赖于底层的输出,如果底层出现异常将导致整个系统的崩溃。系统级编码的代码质量要求标准高于应用级编码。即使同在应用级,处于底层的代码质量要求高于上层。
 
注:
1、http://electronics.stackexchange.com/questions/58653/i2c-read-write-failure-under-heavy-interrupt-load
I2C read/write failure under heavy interrupt load

文章评论3条评论)

登录后参与讨论

907496192_534789161 2013-5-16 09:19

I2C

1989tie_959541171 2013-5-15 19:22

呵呵,谢谢Ana!遇到了,就想了下。

anahu_719040978 2013-5-15 15:48

博主您真能写~~感谢分享!推荐了~
相关推荐阅读
catch2000 2015-07-19 11:44
信号线小电阻的作用
在一块新的PCB上,测试系统能否正常运行的时候,发现系统上电后没有正常启动。  系统框图如下:   在上电的时刻,CPU A(GPIO电平2.6V)会向串口发送启动日志数据,CPU A启动后,...
catch2000 2015-07-05 17:04
协议设计中ACK机制的影响
在TCP/IP中,延时ACK和Nagle算法。  TCP为了同时处理成块数据(通常为512字节的用户数据)和交互数据(通常用户数据比较少,例如不大于10个字节),采用了延时ACK和Nagle算法...
catch2000 2015-05-23 15:48
话说物联网操作系统
最近好多家都宣布推出自己的物联网操作系统。   1. Google将要在Google I/O大会发布的Brillo; 2. 三星推出的Artik芯片搭载Mentor Graphics的...
catch2000 2015-03-31 23:52
不要采用异或来交换两个变量
在进行两个变量的时候,经常会看到有些书误人子弟的推荐使用异或的方式: 方式一 {   x = x ^ y;   y = x ^ y;   x = x ^ y; } 而不是...
catch2000 2014-10-09 07:28
为什么要测试先行
在产品的研发过程中,测试一项至关重要。不论是软件还是硬件。   软件的测试先行,在研发过程中,就做到质量的保证,因为在出现Bug的时候,容易定位Bug,而且即使是在客户端出现Bug,也能够...
catch2000 2014-10-09 07:26
C语言的面向对象编程(一)
一、前言 对于编程而言,重要的是解决问题的方式,而不是语言本身。面向对象与面向过程是解决问题和思考问题的方式。C语言常说是面向过程开发的语言,因为其缺少很多对于面向对象特性的支持。但,这并不影...
广告
我要评论
3
7
1
2
3
4
5
6
7
8
9
0
广告
关闭 热点推荐上一条 /5 下一条