OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7891|回复: 4

关于中断服务函数中的定义变量问题 跪求大神解答

[复制链接]

11

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2016-4-3
在线时间
17 小时
发表于 2016-4-22 10:38:17 | 显示全部楼层 |阅读模式
1金钱
void TIM5_IRQHandler(void)
{                     
        u8  TIM5CH1_CAPTURE_STA=0;                                           
        u32        TIM5CH1_CAPTURE_VAL;
........
}
把变量定义在中断函数的内部 编译会出错 (main.c(36): error:  #20: identifier "TIM5CH1_CAPTURE_VAL" is undefined 主函数中出现TIM5CH1_CAPTURE_VAL没有被定义)

u8  TIM5CH1_CAPTURE_STA=0;                                           
u32        TIM5CH1_CAPTURE_VAL;
void TIM5_IRQHandler(void)
{
......                    
........
}
把变量定义在中断函数的外部 这样编译才不会出错 我觉得把变量定义在中断函数的外部和把变量定义在内部都是一样的 我就不明白为什么会出错呢?求大神解答 谢谢

最佳答案

查看完整内容[请看2#楼]

定义在函数内部属于局部变量,作用域仅限定在函数内部,函数以外或其他文件都是不能通过函数名来访问的。一般情况下这样的临时变量会优先使用CPU的通用寄存器Rx来存函数里的局部变量(如果函数中再发生函数调用或中断,寄存器中的局部变量会压到栈中保存),运行完成这个函数以后,这些通用寄存器Rx就作其他作用了,所以在main.c里没有办法使用这个局部变量(当运行到main.c操作这个变量时,根本不知道通用寄存器中的值是否还表示 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2016-4-22 10:38:18 | 显示全部楼层
定义在函数内部属于局部变量,作用域仅限定在函数内部,函数以外或其他文件都是不能通过函数名来访问的。一般情况下这样的临时变量会优先使用CPU的通用寄存器Rx来存函数里的局部变量(如果函数中再发生函数调用或中断,寄存器中的局部变量会压到栈中保存),运行完成这个函数以后,这些通用寄存器Rx就作其他作用了,所以在main.c里没有办法使用这个局部变量(当运行到main.c操作这个变量时,根本不知道通用寄存器中的值是否还表示那个局部变量,所以无法编译这样的源码到汇编中)

定义在函数外部数据全局变量,作用域可以是所有函数和其他文件(需要extern声明一下)。全局变量保存在RAM的全局/静态区,数据在该区域中有完整的生命周期,有固定的地址,所有通过变量名就可以直接访问到该变量,编译到汇编的时候就可以有确定的操作行为(到内存0xXXXX地址中读取/写入)。

此外:尽量不要使用全局变量:1、全局可见,通过变量名就可以访问,不安全;2、完整生命周期,浪费内存;3不易维护。。。。。。
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

6

主题

201

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1149
金钱
1149
注册时间
2015-11-13
在线时间
267 小时
发表于 2016-4-22 11:04:45 | 显示全部楼层
中断函数的本质依旧是一个函数,你把变量定义在中断函数内部那这个变量就变成局部变量了,你的main函数当然会报错。

某个变量你既想在主函数中使用又想在中断函数中使用那就必须要定义成全局变量。
回复

使用道具 举报

11

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2016-4-3
在线时间
17 小时
 楼主| 发表于 2016-4-22 17:27:35 | 显示全部楼层
ianhom 发表于 2016-4-22 11:46
定义在函数内部属于局部变量,作用域仅限定在函数内部,函数以外或其他文件都是不能通过函数名来访问的。一 ...

谢谢 我把这个忘了
回复

使用道具 举报

11

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2016-4-3
在线时间
17 小时
 楼主| 发表于 2016-4-22 17:27:52 | 显示全部楼层
特朗姆斯 发表于 2016-4-22 11:04
中断函数的本质依旧是一个函数,你把变量定义在中断函数内部那这个变量就变成局部变量了,你的main函数当然 ...

谢谢 我把这个东西忘了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 23:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表