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

2019-07-19 20:29发布

请教,在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:STM8DB6_STM8S105C4_2016-6-29gpio.h 20


1.png


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
kuheye
1楼-- · 2019-07-19 23:31
最后自己解决,采用如下方法:
创建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中包含上述头文件,就可以调用了
通过仿真

给自己点赞
xuande
2楼-- · 2019-07-20 03:51
 精彩回答 2  元偷偷看……
kuheye
3楼-- · 2019-07-20 08:17
再查资料,再折腾,
在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语言:总感觉带着避孕套干那事,总隔那么一层,让你不痛快
shark_32
4楼-- · 2019-07-20 09:08
贴一下整个gpio.h的内容吧。
个人怀疑是这个文件被重复包含了。
pbxywyq
5楼-- · 2019-07-20 10:19
 精彩回答 2  元偷偷看……
kuheye
6楼-- · 2019-07-20 15:20
pbxywyq 发表于 2016-7-2 09:09
这是变量名称重复造成的吧,你把 UINT8_VAL名字改一下。

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

一周热门 更多>