打印

进入中断,又发生更高优先级中断会导致如下的问题么?

[复制链接]
3800|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xlsbz|  楼主 | 2009-11-20 08:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
串口中断函数
void usart _zhongduan interrupt 1
{
      unsigned char   temp;

       for (temp = 0 temp < 100; temp++) {
                //在这里刚运行到temp=30时,发生了更高级别的中断 Timer中断
       }
}


定时器中断函数
void timer _zhongduan interrupt 0
{
          、、、、、、
         ...........
}


//请问:从定时器中断返回到串口中断函数后temp的值是多少?是不是由于temp不是static性质的,所以temp就变成0了?

请答复!并且说出理由!(答复前不要做实验哦)

相关帖子

沙发
desert_hawk| | 2009-11-20 09:07 | 只看该作者
基础啊,楼主,呵呵。
temp是串口中断函数的局部变量,timer的中断函数是不能访问到它的,前提是程序编的没问题。

使用特权

评论回复
板凳
lxyppc| | 2009-11-20 09:14 | 只看该作者
void usart_zhongduan interrupt 1
{
      unsigned char   temp;

       for (temp = 0 temp < 100; temp++) {
                //在这里刚运行到temp=30时,发生了更高级别的中断 Timer中断
                //可以等价为:
                if(temp == 30){   //所以,temp不会被改变
                        timer_zhongduan();
                }
       }
}


定时器中断函数
void timer_zhongduan interrupt 0
{
          、、、、、、
         ...........
}

使用特权

评论回复
地板
lxyppc| | 2009-11-20 09:22 | 只看该作者
我的理解:
temp在栈上分配,像STM32,avr这种有栈结构的芯片,中断来时栈会自动生长,高级别的中断不会影响栈前面的数据。只要不刻意去破坏,就不会有问题
而PIC 8位机这种没有数据栈的,编译器在分配局部变量时会先分析call graph,在不同的call graph中不会使用静态覆盖技术,优先级不同的中断call graph不同,因此temp也不会被覆盖掉

使用特权

评论回复
5
xlsbz|  楼主 | 2009-11-20 10:05 | 只看该作者
竟然一个比一个详细啊!!!!

基础啊!!似乎都是小牛!:handshake

使用特权

评论回复
6
xwj| | 2009-11-20 10:47 | 只看该作者
唉,基础啊!!

1、正常的C编译器都会做覆盖分析,对中断影响的资源现场进行保存,并在中断退出时恢复现场,要相信编译器;
2、C语言的规则确保了:函数内的局部变量别的函数是看不到也操作不到的,不管调用了多少个子函数,自己的局部变量都不会改变的。
任何正规的C编译器都会确保以上两点的,否则就是有BUG的编译器了。

当然,你要是人为修改堆栈指针、或者用指针访问别人的空间,那是编译器没法分析道的。

使用特权

评论回复
7
huangqi412| | 2009-11-20 10:53 | 只看该作者
LS的口头禅就:哎,~~~~~~~~~最后一个叹号

使用特权

评论回复
8
huangqi412| | 2009-11-20 10:54 | 只看该作者
以哎为关键词搜索21BBS...

使用特权

评论回复
9
xlsbz|  楼主 | 2009-11-20 11:25 | 只看该作者
结果: 找到 “哎” 相关主题 49 个

使用特权

评论回复
10
xlsbz|  楼主 | 2009-11-20 11:26 | 只看该作者
唉,基础啊!!

1、正常的C编译器都会做覆盖分析,对中断影响的资源现场进行保存,并在中断退出时恢复现场,要相信编译器;
2、C语言的规则确保了:函数内的局部变量别的函数是看不到也操作不到的,不管调用了多少 ...
xwj 发表于 2009-11-20 10:47

看样子 中断函数是个特殊的普通函数啊!

使用特权

评论回复
11
desert_hawk| | 2009-11-20 11:31 | 只看该作者
楼主用的是keil c51吧。keil C51的中断函数的局部变量都分配在不可覆盖区域。

使用特权

评论回复
12
mbutterfly| | 2009-11-20 12:03 | 只看该作者
这次是两个叹号!

使用特权

评论回复
13
arm_fan168| | 2009-11-20 15:17 | 只看该作者
本帖最后由 arm_fan168 于 2009-11-20 15:19 编辑
我的理解:
temp在栈上分配,像STM32,avr这种有栈结构的芯片,中断来时栈会自动生长,高级别的中断不会影响栈前面的数据。只要不刻意去破坏,就不会有问题
而PIC 8位机这种没有数据栈的,编译器在分配局部变量时会先 ...
lxyppc 发表于 2009-11-20 09:22

局部变量是否分配在堆栈,可不是由芯片决定的,而是由编译器决定的,虽然编译器在决定局部变量是否分配在堆栈的时候会考虑MCU的架构和指令。
keilC编译器之所以采用静态分配局部变量的原因,是因为51的指令缺少像ARM指令中的“STR R0, [R13,#-20]”这种指令,使得在栈中定位某个局部变量时需要费一番周折,编译器为了提高代码效率,所以采用了静态分配局部变量。但这也造成了代码的不可重入,有得就有失啊。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
xlsbz + 1
14
xlsbz|  楼主 | 2009-11-20 17:03 | 只看该作者
:lol

使用特权

评论回复
15
fdsfdsa| | 2009-11-20 18:57 | 只看该作者
又长见识了。。。

使用特权

评论回复
16
jiabin1024| | 2009-11-21 09:23 | 只看该作者
新手,学习了

使用特权

评论回复
17
chfirst| | 2009-11-21 09:48 | 只看该作者
这要是会覆盖的话,编译器也太次了。

使用特权

评论回复
18
fzu_csc| | 2009-11-21 10:02 | 只看该作者
对51
temp保存在R?寄存器
函数属性有个 using ??
如果两个中断函数用的是同一组寄存器组,有可能被覆盖
你没指定,编译器智能设定不同组寄存器,不会覆盖

使用特权

评论回复
19
lwb_2888| | 2009-11-26 17:24 | 只看该作者
受教了,原来我的见识太浅薄了,来这里受教,呵呵呵

使用特权

评论回复
20
gkb986| | 2009-11-26 21:01 | 只看该作者
粗浅理解
一般情况下,局部变量是由编译器维护的,函数被调用时编译器创建堆空间,函数中又调用其他函数时,保护现场,又创建新的堆空间,函数执行完毕,释放堆空间,即局部变量所在空间被收回,访问不到了。
中断嵌套的道理差不多的。

使用特权

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

本版积分规则

190

主题

1614

帖子

4

粉丝