13665|10

463

帖子

0

TA的资源

纯净的硅(中级)

楼主
 

谈谈uCOS中全局变量的使用 [复制链接]

 

在C语言编程中经常会遇到全局变量。全局变量的定义一般采用下面的方式

.C文件中定义

unsigned int gVariable;

.h文件中声明

extern unsigned int gVariable;

这样做的目的是防止变量重复声明,提高编译效率。但是如果这样的定于如果安排不好就会出现各种各样的问题。在编译时重复的声明,甚至出现错误。

阅读邵贝贝翻译的《uC/OS-II》一书,发现里面用了一种非常巧妙的全局变量定义的方法,下面就自己的理解做一下记录,算是自己的笔记。也写出来和大家共同学习。

uC/OS-II中定义了一全局使用的头文件includes.h。这个文件在任意一个.C 文件中引用。

在每一个.H文件中定义了这样一个宏。\

#ifdef         XXX_GLOBALS

#define      XXX_EXT

#else

#define      XXX_EXT   extern

#endif

.H 文件中每个全局变量都加上了xxx_EXT的前缀。xxx代表模块的名字。该模块的.C文件中有以下定义:

#define      XXX_GLOBALS

#include    "includes.h"

当编译器处理.C文件时,它强制xxx_EXT(在相应.H文件中可以找到)为空,(因为xxx_GLOBALS已经定义)。所以编译器给每个全局变量分配内存空间,而当编译器处理其他.C文件时,xxx_GLOBAL没有定义,xxx_EXT被定义为extern,这样用户就可以调用外部全局变量。为了说明这个概念,可以参见uC/OS_II.H,其中包括以下定义:

#ifdef         OS_GLOBALS

#define      OS_EXT

#else

#define      OS_EXT   extern

#endif

 

OS_EXT    INT32U   OSIdleCtr;

OS_EXT    INT32U   OSIdleRun;

OS_EXT    INT32U   OSIdleMax;

同时,uCOS_II.H有中以下定义:

#define    OS_GLOBALS

#include   "includes.h"

当编译器处理uCOS_II.C时,它使得头文件变成如下所示,因为OS_EXT被设置为空。

INT32U   OSIdleCtr;

INT32U   OSIdleRun;

INT32U   OSIdleMax;

这样编译器就会将这些全局变量分配在内存中。当编译器处理其他.C文件时,头文件变成了如下的样子,因为OS_GLOBAL没有定义,所以OS_EXT被定义为extern。

extern     INT32U   OSIdleCtr;

extern     INT32U   OSIdleRun;

extern     INT32U   OSIdleMax;

在这种情况下,不产生内存分配,而任何 .C文件都可以使用这些变量。这样的就只需在 .H 文件中定义一次就可以了。

[ 本帖最后由 wstrom 于 2011-2-23 21:55 编辑 ]

最新回复

marrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrk  详情 回复 发表于 2011-6-24 11:39
点赞 关注
 

回复
举报

463

帖子

0

TA的资源

纯净的硅(中级)

沙发
 
有兴趣的朋友可以把自己在ucOS中使用全局变量的问题拿出来,咱们共同讨论使用的优缺点!
 
 
 

回复

229

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

这个帅

Z昨天还在为全局变量的时候犯愁呢  现在好了~~
 
 
 

回复

849

帖子

0

TA的资源

纯净的硅(高级)

4
 


LZ讲得可以。。顶一下子了。。。。。。
 
个人签名只有想不到,没有做不到。
 
 

回复

95

帖子

120

TA的资源

一粒金砂(中级)

5
 
zhichi
 
 
 

回复

27

帖子

0

TA的资源

一粒金砂(初级)

6
 
受教了,3Q
 
个人签名ARM仿真器:Trace 32 Q群:31761308  刘先生
phone:18818994048 Email:aliens180@163.com
 
 

回复

79

帖子

0

TA的资源

一粒金砂(高级)

7
 
很好啊
 
 
 

回复

463

帖子

0

TA的资源

纯净的硅(中级)

8
 
虽然UCOS中可以使用全局变量,但是如果我们能不使用还是尽量不要用。毕竟全局变量容易增加任务间的耦合干扰啊!
 
 
 

回复

108

帖子

0

TA的资源

一粒金砂(高级)

9
 
同意楼主观点,尤其是在任务之间使用全局变量进行通信时,稍不留神就会出现问题,全局变量还是慎用为好(最好还是使用信号量或者邮箱
消息什么的)!
 
 
 

回复

255

帖子

0

TA的资源

五彩晶圆(初级)

10
 
大家可以列举一下  在操作系统中  定义、使用全局变量的 优缺点。
  
如何能将“裸奔”中的开全局变量的思维  过渡为 使用系统的 邮箱 消息机制?
 
个人签名每天进步一点点
 
 

回复

3

帖子

0

TA的资源

一粒金砂(中级)

11
 
marrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrk
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表