一、问题:
有一个输入源、有一段对输入源做判断的代码,有一个输出。输入源为io的高低电平,基于该高低电平,当变化则进入中断,随后唤醒rtos的任务去执行,控制输出。代码执行,输出概率出现什么输出都没有。
二、溯源:
输入源不稳定,在快速的时间多次发生io的变化,rtos的任务还没执行完毕就被打断,随后恢复的代码运行却根据新改变的输入去执行。导致概率性出现问题。
三、解决:
中断判定后写入变量,并给这个变量加锁。
四、思考:
看似无懈可击的代码,在不确定的输入时有完全难以预测的结果,通常这种问题发生在当前正在执行中或随后被唤醒的代码段与中断有耦合时,代码的运行就变得无法掌握。而不与之发生耦合的接下来唤醒或正在执行的代码段则不会有这种问题。这种耦合对代码破坏很大,比如在串口数据发送时中断打断、需要根据中断结果来响应输出时中断的快速连续进入。这种情况可以通过对资源进行加锁来改善,但是这只对第二个例子:“需要根据中断结果来响应输出时”有用,串口执行被中断打断是无法恢复的。