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

定时器中断服务函数中全局变量的值没法修改

sjsjling 2019-08-14 浏览量:1694
stm32f103系列开发板,中断服务函数中的全局变量的值在主函数的while循环中改变了,但是传不回中断服务函数中,求大神帮忙解答一下

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
所有亮答 数量:5
  • 你再中断里面,主函数怎么会执行呢?主函数优先级最低,在中断的时候没法改变,除非中断嵌套

  • 1、看一下你的变量是怎么定义与声明的吧。最好是贴一下代码。

    2、全局变量要在使用的地方进行声明,或是在头文件中声明成全局变量extern的方式。

    3、是不是优化等太高了,而这个变量没有实际的用处,被优化了呢,降低优化等级试试           

    4、还有就是看看哪些地方使用了这个变量,是不是值又被修改了

  • __IO
    举个例子
    uint32_t需要改为如下
    __IO uint32_t

    “两个下划线IO”在Cortex_M中是定义为volatile类型的。

    一般来说,计时中断里的关键变量都需要加“两个下划线IO”符号,

    即定义为volatie,

    以防止程序因为优化提高访问速度而从cache中读取不是最新的数据。

    你的情况,应该就是变量的值虽然已经被修改,

    但程序依然读取cache中的老的值。

    建议把你操作的那个全局变量定义为volatie类型,

    保证程序每次都从该变量的地址读取最新的数据,这一点很重要

  • 这个要看中断和主循环改变值这两个动作哪个先触发,因为中断可以打断主循环得执行

  • 你吧优化等级调到0先试一下。或者加关键字 volatile 再试试。因为修改变量不是原子操作,有个读-修改-写的过程

相关问题

问题达人换一批

定时器中断服务函数中全局变量的值没法修改