OpenEdv-开源电子网

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

请教:IAR中如何定义位变量

[复制链接]

25

主题

78

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
234
金钱
234
注册时间
2015-12-16
在线时间
32 小时
发表于 2016-7-1 16:48:52 | 显示全部楼层 |阅读模式
1金钱
请教,在IAR中如何定义位变量

例如:我想定义一个字节:FlagA,它的8个bit分别为不同的标志位
在网上找到如下资料,如法炮制,编译时出差,求助
参考:http://www.07net01.com/2015/10/940607.html

1.在*.h中,写入如下代码:
typedef union
{
  struct
  {
         unsigned char b0:1;
         unsigned char b1:1;
         unsigned char b2:1;
         unsigned char b3:1;
         unsigned char b4:1;
         unsigned char b5:1;
         unsigned char b6:1;
         unsigned char b7:1;
  } bits;
} UINT8_VAL;


2.在*.c中定义变量

UINT8_VAL  BitFlag1 = {0x00};        //每一个bit初始化为0,如果对某一位置1可用BITx


3.在*.h中,再添加:
extern UINT8_VAL  BitFlag1;
#define t1msFlag                        BitFlag1.bits.b0        // 任务1


编译后出错信息:
Error[Pe256]: invalid redeclaration of type name "UINT8_VAL" (declared at line 20) G:\STM8\DB6_STM8S105C4_2016-6-29\gpio.h 20


1.png


最佳答案

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

最后自己解决,采用如下方法: 创建gpio.h文件 typedef struct { unsigned char b0:1; unsigned char b1:1; unsigned char b2:1; unsigned char b3:1; unsigned char b4:1; unsigned char b5:1; unsigned char b6:1; unsigned char b7:1; } __BITS_Flag ; __IO_REG8_BIT (FlagA, 0x0020, __READ_WRITE, __BITS_Flag); #define FlagWG FlagA_bit.b0 //1=温感 #define FlagQJ ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

25

主题

78

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
234
金钱
234
注册时间
2015-12-16
在线时间
32 小时
 楼主| 发表于 2016-7-1 16:48:53 | 显示全部楼层
最后自己解决,采用如下方法:
创建gpio.h文件

typedef struct
{
    unsigned char b0:1;
    unsigned char b1:1;
    unsigned char b2:1;
    unsigned char b3:1;
    unsigned char b4:1;
    unsigned char b5:1;
    unsigned char b6:1;
    unsigned char b7:1;
} __BITS_Flag ;

__IO_REG8_BIT (FlagA, 0x0020, __READ_WRITE, __BITS_Flag);


#define        FlagWG                FlagA_bit.b0        //1=温感
#define        FlagQJ                FlagA_bit.b1        //1=全降


在main.c中包含上述头文件,就可以调用了
通过仿真

给自己点赞
回复

使用道具 举报

58

主题

6291

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11406
金钱
11406
注册时间
2014-4-1
在线时间
1282 小时
发表于 2016-7-1 17:09:45 | 显示全部楼层

还真没听说过。


回复

使用道具 举报

25

主题

78

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
234
金钱
234
注册时间
2015-12-16
在线时间
32 小时
 楼主| 发表于 2016-7-1 18:26:10 | 显示全部楼层
再查资料,再折腾,
在goio_init.c中编写如下代码:
//----------------------------------
//位变量标志位
//----------------------------------
typedef struct
{
    unsigned char no0:1;
    unsigned char no1:1;
    unsigned char no2:1;
    unsigned char no3:1;
    unsigned char no4:1;
    unsigned char no5:1;
    unsigned char no6:1;
    unsigned char no7:1;
} __ByteBit8 ;

volatile union { unsigned char FlagA; __ByteBit8 FlagA_bit; } ;

#define        FlagWG                FlagA_bit.no0

以上编译通过,但只能在gpio_init.c中调用FlagWG
如果在其它文件如main.c中调用FlagWG,就会报错,说没有定义FlagWG
Error[Pe020]: identifier "FlagWG" is undefined

如果在gpio_init.h中加入如下一行,也报错
extern unsigned char FlagA;

折腾死了,不知如何做了

其实我的需求挺简单
【需求】
1.定义一个字节FlagA,包含8个位
2.可以同时置位或复位,如:
FlagA=0x00;
FlagA=0xff
3.通过#define语句,可以对某一个位进行置位或复位
4.在多个.c文件的结构中,能够被其它文件调用
如在gpio.init.c/h中定义,能够被main.c调用,当然会有#include "gpio_init.c"

请教诸位,到底应该如何做
本人一直使用汇编,对C不熟悉,初次用C语言,感觉方便的同时,也深感真TMD啰嗦,
汇编:直接了当;
C语言:总感觉带着避孕套干那事,总隔那么一层,让你不痛快
回复

使用道具 举报

9

主题

58

帖子

0

精华

高级会员

Rank: 4

积分
542
金钱
542
注册时间
2016-2-24
在线时间
61 小时
发表于 2016-7-2 08:53:16 | 显示全部楼层
贴一下整个gpio.h的内容吧。
个人怀疑是这个文件被重复包含了。
回复

使用道具 举报

3

主题

144

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7342
金钱
7342
注册时间
2016-2-6
在线时间
1863 小时
发表于 2016-7-2 09:09:27 | 显示全部楼层
这是变量名称重复造成的吧,你把 UINT8_VAL名字改一下。
回复

使用道具 举报

25

主题

78

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
234
金钱
234
注册时间
2015-12-16
在线时间
32 小时
 楼主| 发表于 2016-7-2 10:02:33 | 显示全部楼层
pbxywyq 发表于 2016-7-2 09:09
这是变量名称重复造成的吧,你把 UINT8_VAL名字改一下。

名字改过好多个,还是一样
参照第3楼,可以通过,但是在main.c中却不能引用
回复

使用道具 举报

25

主题

78

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
234
金钱
234
注册时间
2015-12-16
在线时间
32 小时
 楼主| 发表于 2016-7-2 10:11:13 | 显示全部楼层
shark_32 发表于 2016-7-2 08:53
贴一下整个gpio.h的内容吧。
个人怀疑是这个文件被重复包含了。

我把整个项目打包上传,麻烦您帮忙看看

在gpio_init.c调用这些变量,变量字节或位变量均正常
但在main.c中调用,就出错,说为定义变量

DB6_STM8S105C4_2016-6-29.rar

24.47 KB, 下载次数: 384

回复

使用道具 举报

3

主题

144

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7342
金钱
7342
注册时间
2016-2-6
在线时间
1863 小时
发表于 2016-7-2 10:31:16 | 显示全部楼层
你的定义就是错了,union中要包含两个变量才有意义
typedef union
{
unsigned char Character;
  struct
  {
         unsigned char b0:1;
         unsigned char b1:1;
         unsigned char b2:1;
         unsigned char b3:1;
         unsigned char b4:1;
         unsigned char b5:1;
         unsigned char b6:1;
         unsigned char b7:1;
  } bits;
} UINT8_VAL;
这样就可以了。
回复

使用道具 举报

3

主题

144

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7342
金钱
7342
注册时间
2016-2-6
在线时间
1863 小时
发表于 2016-7-2 10:32:09 | 显示全部楼层
pbxywyq 发表于 2016-7-2 10:31
你的定义就是错了,union中要包含两个变量才有意义
typedef union
{

Character作为整体赋值,bits作为位寻址。
回复

使用道具 举报

9

主题

58

帖子

0

精华

高级会员

Rank: 4

积分
542
金钱
542
注册时间
2016-2-24
在线时间
61 小时
发表于 2016-7-2 11:16:05 | 显示全部楼层
kuheye 发表于 2016-7-2 10:11
我把整个项目打包上传,麻烦您帮忙看看

在gpio_init.c调用这些变量,变量字节或位变量均正常

把你的gpio.h改成这样试试:

#ifndef FILE_GPIO
#define FILE_GPIO

#include        <iostm8s105c4.h>

//extern unsigned char FlagA;
#define        FlagWG                FlagA_bit.no0//1=温感触发
#define        FlagYG                FlagA_bit.no1//1=烟感触发
#define        FlagQJ                FlagA_bit.no2//1=全降触发
#define        FlagBJ                FlagA_bit.no3//1=半降触发
#define        FlagSXW                FlagA_bit.no4//1=上限位
#define        FlagXXW                FlagA_bit.no5//1=下限位
#define        FlagModelS        FlagA_bit.no6//1=疏散型;0=分隔型
#define        FlagFireP        FlagA_bit.no7//1=点动型;0=长闭型


//----------------------------------------
//函数声明:端口初始化
//----------------------------------------
void goio_init(void);//端口初始化,函数声明

#endif


回复

使用道具 举报

25

主题

78

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
234
金钱
234
注册时间
2015-12-16
在线时间
32 小时
 楼主| 发表于 2016-7-2 12:47:00 | 显示全部楼层
多谢楼上
更改后,故障依旧,main.c文件中,不能调用FlagWG等标志位
回复

使用道具 举报

9

主题

58

帖子

0

精华

高级会员

Rank: 4

积分
542
金钱
542
注册时间
2016-2-24
在线时间
61 小时
发表于 2016-7-2 13:33:20 | 显示全部楼层
本帖最后由 shark_32 于 2016-7-2 13:41 编辑

FlagA_bit我也看不到你在哪里声明过。没声明自然是没法调用的
回复

使用道具 举报

3

主题

144

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7342
金钱
7342
注册时间
2016-2-6
在线时间
1863 小时
发表于 2016-7-2 13:44:14 | 显示全部楼层
本帖最后由 pbxywyq 于 2016-7-2 14:07 编辑
kuheye 发表于 2016-7-2 12:47
多谢楼上
更改后,故障依旧,main.c文件中,不能调用FlagWG等标志位

你连最起码的位域和union结构都没搞懂,怎么可能那样做呢。union除了初始化,只能对成员进行初始化,不能整体赋值的。
volatile union { unsigned char FlagA; __ByteBit8 FlagA_bit; };

1、你只定义了结构没有定义变量名,应该是:
volatile union { unsigned char FlagA; __ByteBit8 FlagA_bit; } ABC;
2、直接调用union结构成员

FlagA=0;

正确的应该是:
ABC.FlagA=0;
其它的位应该是:
ABC.FlagA_bit.b0等等;




回复

使用道具 举报

25

主题

78

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
234
金钱
234
注册时间
2015-12-16
在线时间
32 小时
 楼主| 发表于 2016-7-2 17:05:05 | 显示全部楼层
pbxywyq 发表于 2016-7-2 10:31
你的定义就是错了,union中要包含两个变量才有意义
typedef union
{

首先感谢
按照您的方法,还是出错
这里我们理清一下,代码分为三部分:
--------------------①定义类型,如下:------------------------------------
typedef union
{
unsigned char Character;
  struct
  {
         unsigned char b0:1;
         unsigned char b1:1;
         unsigned char b2:1;
         unsigned char b3:1;
         unsigned char b4:1;
         unsigned char b5:1;
         unsigned char b6:1;
         unsigned char b7:1;
  } bits;
} UINT8_VAL;

------------------②定义变量部分------------------------
UINT8_VAL  BitFlag1 = {0x00};

-----------------③声明extern--------------------------
extern UINT8_VAL  BitFlag1;


其一:
①②放在gpio.c中,③放在gpio.h中,编译报错,在③上有一个红色叉叉,提示:
Error[Pe020]: identifier "UINT8_VAL" is undefined
这个报错似乎说UNT8_VAL没有定义,

其二:
好吧,将①转移到gpio.h文件中,在编译,还是出错,在①最后一行出现红色叉叉,提示:
Error[Pe256]: invalid redeclaration of type name "UINT8_VAL"

不知道问题在哪里
回复

使用道具 举报

9

主题

34

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
229
金钱
229
注册时间
2016-6-6
在线时间
47 小时
发表于 2018-6-4 13:21:27 | 显示全部楼层
主程序没有包含子程序头文件
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 19:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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