• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

如何避免多中断修改变量

瞩目人kri 2018-08-08 浏览量:794

求助一下各位大佬,有的时候我们在使用同一变量进行操作的时候,又可能会因为被其他操作相关变量的中断打断而导致数值计算不准确

例如:我在中断 串口中断中读取某一感器的数据并赋给数组A[];
然后又在定时器中断中利用这一个数组进行计算,那么,当很巧合的时候,或者数据量很大的时候,就又可能出现tim中断中正读取到A[1];就被串口中断打断从而改变了数组A[]的数据,

跳回到tim中断再进行计算就不准确了,
这种情况无论优先级如何都有数据被改动的情况吧?
我想问的是如何去避免这种情况,有什么方法防止我在计算的时候数据不被改变???

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 是有可能,所以,你必须划分优先级。 如果必须保证数据不断流(不能丢失),那就必须串口优先级最高,保证串口的正常接收。 如果不需要每次数据都读取,那就可以将串口优先级降低,让其他程序处理完,再去接收下一批数据。.
    • 发布于 2018-08-09
    • 举报
    • 评论 0
    • 1
    • 0

其他答案 数量:12
  • 算是共享数据访问问题,一个写数据,一个读数据,可以把整个数据读写作为原子操作。写时候别读,读时候别写,就不会出错。
    • 发布于2018-08-08
    • 举报
    • 评论 0
    • 1
    • 0

  • 这个是有点复杂的问题了.所以别人说汽车程序有1W多个全局变量想想就觉得头大.

    有一点要记得的是虽然变量谁都可以改但是程序其实一个时间点还是只有一个在运行的.是单线的.

    所以在修改变量的时候关中断.

    • 发布于2018-08-09
    • 举报
    • 评论 0
    • 0
    • 0

  • 在RTOS中,不论哪种UCOS、FreeRTOS、RTT、RTX等等,这些系统中,都有个互斥变量信号。

    其原理是:当一个任务拿到这个变量,其他的任务就不能在使用,除非我这个任务释放了这个变量。


    在非OS的编程中,你可以借鉴这个思路。定义一个全局变量,当我任意一次操作这个数据的时候,把这个全局变量置位;操作完了,在把全局变量复位。

    其他的中断或者函数需要用这个变量,首先去检测全局变量。

    还有一种方法:

    在操作这个数据前,先把总中断关闭;操作完了,立即打开总中断,因为C语言是顺序执行语言。

    • 发布于2018-08-09
    • 举报
    • 评论 0
    • 0
    • 0

  • 这你要设计好你的逻辑,不可以靠程序去自己识别,你的逻辑要正确
    • 发布于2018-08-09
    • 举报
    • 评论 0
    • 0
    • 0

  • linux 多核心,可以多个进程同时跑,又是多进程,相当于 一千一万个进程,随机分配到 4 个核心上执行,早把这种情况考虑过了,可以借鉴人家的做法,读读操作系统,原子操作,信号量,锁,都是干什么用的。

    直接告诉你怎么做,你没有印象,不知道为啥,看看操作系统,碰到问题是怎么考虑的,用什么方法实现的,策略和实现

    • 发布于2018-08-09
    • 举报
    • 评论 0
    • 0
    • 0

  • 做个标识位,当变量修改的时候将标识位置1,这样就当别的中断要修改时发现这个为1就不修改了
    • 发布于2018-08-10
    • 举报
    • 评论 0
    • 0
    • 0

  • 这个要加一个原子锁,在你的中断里面要进行上锁,出中断的时候关掉锁
    • 发布于2018-08-11
    • 举报
    • 评论 0
    • 0
    • 0

  • 在中断里面做一个互斥量,进行变量资源的保护,防止被其他资源修改
    • 发布于2018-08-17
    • 举报
    • 评论 0
    • 0
    • 0

  • 要在中断里面进行资源的保护,加一个资源锁,保护资源不被随意修改
    • 发布于2018-08-27
    • 举报
    • 评论 0
    • 0
    • 0

  • 你进入计算代码的时候  先把中断给关了  等计算完了再进去中断  可以保证你的过程完成
    • 发布于2018-09-09
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

如何避免多中断修改变量