打印
[STM32F1]

中断函数与主函数共享变量的问题

[复制链接]
5516|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一切会如旧|  楼主 | 2015-3-3 17:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 一切会如旧 于 2015-3-3 18:43 编辑

文件rtc.c
各种#include....
u8 volatile ConverFlag;                                   //变量定义的位置</font>
其他变量、函数定义或声明....
void RTC_IRQHandler(void)                             //时钟中断函数</font>
{
  if (RTC_GetITStatus(RTC_IT_SEC) != RESET)//秒中断</font>
  {
    其他不涉及ConverFlag的语句....
    ConverFlag=~ConverFlag;                          //这里改变了ConverFlag这个变量的值</font>
    其他不涉及ConverFlag的语句....
}
清中断语句...
}
文件main.c:
各种#include....
extern u8 volatile ConverFlag;                              //变量声明的位置
其他变量及函数的定义或声明....
int main()
{   while(RTC_Init());              //时钟初始化
   ConverFlag=ON;               //变量初始化
   while(1)
  {
      if(ConverFlag==ON)
         显示语句....                             // 1
      if(ConverFlag==OFF)
        显示语句....                               // 2
   }
}
变量 ConverFlag是用来作为一个标志,使1、2程序定时交替执行(实际是显示语句,交替显示不同的内容)。
我把程序简化为上述的情况了,其他地方没有涉及到 ConverFlag变量的读或者写。中断在初始化函数RTC_Init()里已经使能。


程序执行的效果是:
只看到 1 语句的效果,因为此变量初始化为ON,如果初始化改为OFF,就只能看到 2 语句的效果。也就是说中断里对此变量的操作无效了一样。

可以肯定的是,中断是执行了的,因为中断中进行的其他操作,在运行时能观察到对应的现象。
不知道是什么原因?

不好意思,不知道这里编辑的时候什么原因,贴出的main函数代码在保存后老是少一部分,所以重新编辑了一下。



沙发
戈卫东| | 2015-3-3 18:03 | 只看该作者
你的代码读起来真费劲。。。。。。。。。

使用特权

评论回复
板凳
戈卫东| | 2015-3-3 18:04 | 只看该作者
从你贴的伪码看不出问题

使用特权

评论回复
地板
一切会如旧|  楼主 | 2015-3-3 18:35 | 只看该作者
戈卫东 发表于 2015-3-3 18:03
你的代码读起来真费劲。。。。。。。。。

不好意思,第一次编辑时本想将贴出来的程序更清晰易读的,所以将代码部分变成红色,但是发帖后发现没有变红,而是在代码的前后有一堆<xxxx>之类的东西,导致代码更难读。所以又重新编辑了,编辑完前又去吃了个饭....所以没及时保存。
谢谢!

使用特权

评论回复
5
aozima| | 2015-3-3 18:40 | 只看该作者
检查一下ConverFlag的赋值操作是否有存储到RAM中,还是仅操作寄存器。(看反汇编),main中读取值也检查。
看到的效果是在watch里面吗?建议直接观察内存。

使用特权

评论回复
6
一切会如旧|  楼主 | 2015-3-3 18:49 | 只看该作者
aozima 发表于 2015-3-3 18:40
检查一下ConverFlag的赋值操作是否有存储到RAM中,还是仅操作寄存器。(看反汇编),main中读取值也检查。
...

谢谢!
ConverFlag是我定义的一个标志用的变量,对它的赋值也仅是取反操作,没有操作寄存器。因为整个程序主要是显示时间之类的,所以看到的是点阵屏幕上显示的效果。我按照你的建议去看看反汇编和观察一下内存。

使用特权

评论回复
7
chenyu988| | 2015-3-3 20:08 | 只看该作者
仿真或者加个串口打印吧,是不是点阵刷新的太快了,肉眼看不出来。

使用特权

评论回复
8
hnkf118| | 2015-3-3 20:37 | 只看该作者
为了通用性,稳健性一般需要进行临界段保护,. 如果一方是生产方, 一方是消费方,而且是MCU能支持的默认宽度的数据,那不需要特别的保护,如C51 是8BIT处理的,一条指令处理的。

使用特权

评论回复
9
一切会如旧|  楼主 | 2015-3-3 21:14 | 只看该作者
chenyu988 发表于 2015-3-3 20:08
仿真或者加个串口打印吧,是不是点阵刷新的太快了,肉眼看不出来。

中断是秒中断,一秒一次,刷新一次屏幕需10ms以上。应该不是刷新太快问题

使用特权

评论回复
10
一切会如旧|  楼主 | 2015-3-3 21:15 | 只看该作者
hnkf118 发表于 2015-3-3 20:37
为了通用性,稳健性一般需要进行临界段保护,. 如果一方是生产方, 一方是消费方,而且是MCU能支持的默认宽 ...

不太了解临界段保护,不过ConverFlag是8位的,我用的MCU是STM32,32位,应该不存在这个问题?

使用特权

评论回复
11
chenyu988| | 2015-3-3 21:20 | 只看该作者
不能仿真?
if(ConverFlag==OFF)
{
显示语句....  
while(1);
}
验证是否真的取反了。
如果真取反了,那就是刷新问题了。

使用特权

评论回复
12
westmas| | 2015-3-3 23:20 | 只看该作者
请问你的ON,OFF是怎么定义的?

使用特权

评论回复
13
戈卫东| | 2015-3-4 01:49 | 只看该作者
对,如楼上所说。ON OFF的定义,贴来看看?
如果OFF定义成0,那么ConverFlag=~ConverFlag得到的是0xffffffff, 也许和你定义的ON并不相等;
如果ON定义成1,那么ConverFlag=~ConverFlag得到的是0xffffffffe, 可能和你定义的OFF不相等。。。。。

使用特权

评论回复
14
科技猎人| | 2015-3-4 09:01 | 只看该作者
1.ConverFlag没有初始化
2.ON OFF的定义未知,不同的定义会有不同的效果
3.ConverFlag=~ConverFlag;是位取反,应该用ConverFlag=!ConverFlag;逻辑取反
4.已有volatile修饰了,就不会出现寄存器优化的问题了

使用特权

评论回复
15
一切会如旧|  楼主 | 2015-3-4 09:31 | 只看该作者
westmas 发表于 2015-3-3 23:20
请问你的ON,OFF是怎么定义的?

#define ON  0xFF
#define OFF 0x00

使用特权

评论回复
16
一切会如旧|  楼主 | 2015-3-4 09:31 | 只看该作者
戈卫东 发表于 2015-3-4 01:49
对,如楼上所说。ON OFF的定义,贴来看看?
如果OFF定义成0,那么ConverFlag=~ConverFlag得到的是0xfffffff ...

如下:
#define ON  0xFF
#define OFF 0x00

使用特权

评论回复
17
myqq12| | 2015-3-4 10:39 | 只看该作者
一切会如旧 发表于 2015-3-4 09:31
如下:
#define ON  0xFF
#define OFF 0x00

估计是定义有问题,你可以仿真看看,

使用特权

评论回复
18
mylsf| | 2015-3-4 10:56 | 只看该作者
显示语句....                             // 1

这里面是不是有死循环

使用特权

评论回复
19
Ketose| | 2015-3-4 11:36 | 只看该作者
你在中断是打断点,看是不是进入到中断里了。
while(RTC_Init());              //时钟初始化
   ConverFlag=ON;               //变量初始
这两句顺序换下,一般变量要最先初始化。

使用特权

评论回复
20
wowow| | 2015-3-4 11:54 | 只看该作者
u8 FlagRead;   
while(1)
  {
      disableRTCInt();
      FlagRead = ConverFlag;
      enableRTCInt();
      if(FlagRead==ON)
         显示语句....                             // 1
      if(FlagRead==OFF)
        显示语句....                               // 2
   }

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

158

帖子

0

粉丝