在之前曾对移植LWIIP协议进行网络掉线检测功能的添加,当时测试通过并且检测正常,参考添加网络掉线功能的方法见http://www.stmcu.org/module/forum/thread-586493-1-1.html中的6#评论。
最近进行总体功能测试时却发现网络掉线检测模块运行异常,系统滴答时钟还在运行,检测功能工作异常的情况,且放在主控制程序之前则掉线可以检测到,插上之后则检测不到,通过仿真发现语句卡死在延时函数中,通过JLINK仿真发现延时语句中有延时的时间值,但检测时间值却一直不更新,且该更新的标志位一直为0,正常情况下,进入该函数,首先延时标志位会置位,然后滴答时钟中断函数中通过检测该标志位对延时时间进行更新,通过比较更新值与延时时间值从而完成基于滴答时钟的精确延时。 ·
通过查找延时时间定位在网络读取延时语句中,网络延时语句实在主控程序中运行,当进入延时时,周期指令中的循环中断中也调用延时语句,但是延时语句中包含全局变量,时不可重入的,当中断进入后调用延时语句延时完成后将标志位清零,出中断后,原延时指令便因延时标志位被清零则不能正常工作。造成网络掉线检测等控制程序不工作的现象。这也是为什么检测放在控制之前,可以掉线检测,插上却也会造成功能错误的原因,因为在控制指令之前循环中断指令还未运行。