求助一下各位大佬,有的时候我们在使用同一变量进行操作的时候,又可能会因为被其他操作相关变量的中断打断而导致数值计算不准确
例如:我在中断 串口中断中读取某一感器的数据并赋给数组A[];然后又在定时器中断中利用这一个数组进行计算,那么,当很巧合的时候,或者数据量很大的时候,就又可能出现tim中断中正读取到A[1];就被串口中断打断从而改变了数组A[]的数据,
跳回到tim中断再进行计算就不准确了,这种情况无论优先级如何都有数据被改动的情况吧?我想问的是如何去避免这种情况,有什么方法防止我在计算的时候数据不被改变???
这个是有点复杂的问题了.所以别人说汽车程序有1W多个全局变量想想就觉得头大.
有一点要记得的是虽然变量谁都可以改但是程序其实一个时间点还是只有一个在运行的.是单线的.
所以在修改变量的时候关中断.
在RTOS中,不论哪种UCOS、FreeRTOS、RTT、RTX等等,这些系统中,都有个互斥变量信号。
其原理是:当一个任务拿到这个变量,其他的任务就不能在使用,除非我这个任务释放了这个变量。
在非OS的编程中,你可以借鉴这个思路。定义一个全局变量,当我任意一次操作这个数据的时候,把这个全局变量置位;操作完了,在把全局变量复位。
其他的中断或者函数需要用这个变量,首先去检测全局变量。
还有一种方法:
在操作这个数据前,先把总中断关闭;操作完了,立即打开总中断,因为C语言是顺序执行语言。
linux 多核心,可以多个进程同时跑,又是多进程,相当于 一千一万个进程,随机分配到 4 个核心上执行,早把这种情况考虑过了,可以借鉴人家的做法,读读操作系统,原子操作,信号量,锁,都是干什么用的。
直接告诉你怎么做,你没有印象,不知道为啥,看看操作系统,碰到问题是怎么考虑的,用什么方法实现的,策略和实现