【问题现象】
本地在使用S32K146 的过程中串口高频的输入数据,会发现存在卡死的状况,本地debug 时发现程序卡死在如下代码处理中。
查看卡死的时间点的调用栈,调用该函数的上一层接口传入的参数为false 对应设置UART CTRL 的TE使能位配置为false.
此时看看寄存器的实际配置为true,从而造成配置的期待配置为false 实际的值却为 true 的不一致情况,从而卡死在此处代码死等状态为0.
【问题调查】
因为串口接收中断中也会访问该寄存器,结合上述现象,本能的第一反应就是该寄存器相当于临界资源代码,中断和应用程序同时在访问未进行保护,触发的临界资源访问冲突的问题。
对应的ISR抢占APP过程如上,理论上APP是后背执行的理论上中断设置的值回被覆盖才对,参看芯片手册对应的bit 描述如下,该bit 被清零后TXDpin 上数据发送完成才会为0有数据时读取仍然为1,所以就会出现上述配置0失败的场景。
【问题修改】
问题原因已经趋于明确,对于应用程序和中断同时访问资源的保护最简单的方法就是访问临界资源时短暂的关闭中断更新寄存器,这样就能解决和中断并发访问资源的问题了。
使用CMSIS 的接口在上述访问临界寄存器的时候添加临界区保护,修改如下
CMSIS 开启关闭中断接口说明如下
修改后验证问题已经解决。