成都控制器开发_容易出错!C语言中的外部变量关键词extern可不能随便使用

[复制链接]
429|8
手机看帖
扫描二维码
随时随地手机跟帖
yonko|  楼主 | 2023-3-24 19:19 | 显示全部楼层 |阅读模式
本帖最后由 yonko 于 2023-3-25 11:29 编辑

本文介绍c语言中关键词extern用法的一个注意事项。
在做项目开发时,在一个单片机C语言程序(用keil开发)中,如果有两个C文件,在其中一个C文件(设为a文件)定义了一个全局变量v,并在此文件里的程序段里修改此变量,在另外一个C文件(设为b文件)里用外部变量(extern)的方法引用此变量,并读取变量v,但是,在b中读取时结果变量v出错,出现乱值。
什么原因?
v在b文件里作为外部变量,被认为分配的地址在其他地方,在b文件里只是读取没有写入,实际就没有分配内存地址,从而出错。
                              
1.png
怎么修改?
方法1,在b文件中定义此变量v,在a文件中用外部变量的方式引用变量v,在a文件里修改变量v,在b文件中回读变量v,结果正常。
这样,在b文件里定义了变量v,分配了内存地址,在a文件中引用外部变量v并进行了写入操作,也分配了内存地址,所以不出错。
2.png
方法2,最优方法,在一个c文件(如a.c)里定义全局变量v,在其h文件(a.h)里再引用为外部变量,在用到变量v的其他c文件里include a.h,这样的话不管是否读写都无问题。当然,a.c里也要include a.h。
3.png
注意:全局变量才能被外部引用,静态变量和局部变量不行的。

使用特权

评论回复
评论
cooldog123pp 2023-3-25 17:37 回复TA
你在胡说什么 
mcu5i51| | 2023-3-25 10:55 | 显示全部楼层
最大的问题时文件b中已经声明该变量了,为什么会出错;答案只能是两种,就是调试时对不上和变量长度大于处理器可以处理的长度,中途改变,
前者数据在寄存器中,工作时可以正常,后者没有办法,但是两种现象都是在打断正常处理时才有,也就是中断,可以采用数据锁的方式保证结果正确;

使用特权

评论回复
yonko|  楼主 | 2023-3-25 11:32 | 显示全部楼层
mcu5i51 发表于 2023-3-25 10:55
最大的问题时文件b中已经声明该变量了,为什么会出错;答案只能是两种,就是调试时对不上和变量长度大于处理器 ...

数据类型已使用long,无问题。中断修改这个情况无。出现的错值是很大,而且每次出现一样,可以判断是没分配内存的问题。

使用特权

评论回复
mcu5i51| | 2023-3-25 15:33 | 显示全部楼层
简单工程测试正常,看看内存映像吧

使用特权

评论回复
R2D2| | 2023-3-25 16:44 | 显示全部楼层
根本就不可能发生的事情,楼主完全是胡说。

使用特权

评论回复
R2D2| | 2023-3-25 16:46 | 显示全部楼层
mcu5i51 发表于 2023-3-25 10:55
最大的问题时文件b中已经声明该变量了,为什么会出错;答案只能是两种,就是调试时对不上和变量长度大于处理器 ...

中断操作数据发生错误那就是原子操作的问题。但是原子操作跟extern无关,不管怎么写都会出错。

使用特权

评论回复
dw772| | 2023-3-26 19:40 | 显示全部楼层
那一定是你的程序有问题,不是你说的这种引用有问题。首先全局变量你没有指定地址就是编译器分配的,你要是不是程序修改了变量或者操作错误难道这个变量自己会变化?

使用特权

评论回复
yonko|  楼主 | 2023-3-27 14:11 | 显示全部楼层
补充说明,经查阅与思考,这个问题可能是由编译器优化引起的(可加volatile解决或降低优化),也许不是文中原因造成。方法一经验证可以解决问题,方法二来自网络未及验证。感谢关注。

使用特权

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

本版积分规则

114

主题

227

帖子

0

粉丝