免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 932 | 回复: 0
打印 上一主题 下一主题

struct & union [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-04 17:05 |只看该作者 |倒序浏览

                                一、结构体定义举例

(1).先声明结构体类型再定义结构体变量
struct timer_list key_timer[KEY_NUM];
(2).直接定义结构体变量

typedef struct
{
unsigned int keyStatus[KEY_NUM]; //4个按键的按键状态
KEY_RET buf[MAX_KEY_BUF]; //按键缓冲区
unsigned int head,tail;  //按键缓冲区头和尾
wait_queue_head_t wq;  //等待队列
struct cdev cdev;   //cdev结构体
}KEY_DEV;  //结构体变量

(3).定义结构体类型同时定义了类型变量

static struct key_info
{
int irq_no;  //中断号
unsigned int gpio_port;  //GPIO端口
int key_no;  //键值
}key_info_tab[4]={
{
IRQ_EINT0,GPIO_F0,1
}
,
{
IRQ_EINT2,GPIO_F2,2
}
,
{
IRQ_EINT11,GPIO_G3,3
}
,
{
IRQ_EINT19,GPIO_G11,4
}
,
};

二、union 举例
    在使用瑞萨单片机过程中,遇到用结构体、联合体定义I/O 口,举例如下
/********************************************************
*  declare SFR bit                                      *
********************************************************/
struct bit_def {
char b0:1;
char b1:1;
char b2:1;
char b3:1;
char b4:1;
char b5:1;
char b6:1;
char b7:1;
};
union byte_def{
struct bit_def bit;
char byte;
};
/********************************************************
*  declare SFR addresses                                *
********************************************************/
#pragma ADDRESS  p0_addr   00E0H /* Port P0 register */
#pragma ADDRESS  p1_addr   00E1H /* Port P1 register */
…… ……

/*------------------------------------------------------
  Port P0 register
------------------------------------------------------*/
union byte_def p0_addr;
#define  p0    p0_addr.byte
#define  p0_0  p0_addr.bit.b0   /* Port P00 bit */
#define  p0_1  p0_addr.bit.b1   /* Port P01 bit */
#define  p0_2  p0_addr.bit.b2   /* Port P02 bit */
#define  p0_3  p0_addr.bit.b3   /* Port P03 bit */
#define  p0_4  p0_addr.bit.b4   /* Port P04 bit */
#define  p0_5  p0_addr.bit.b5   /* Port P05 bit */
#define  p0_6  p0_addr.bit.b6   /* Port P06 bit */
#define  p0_7  p0_addr.bit.b7   /* Port P07 bit */

/*------------------------------------------------------
  Port P1 register
------------------------------------------------------*/
union byte_def p1_addr;
#define  p1   p1_addr.byte
#define  p1_0  p1_addr.bit.b0   /* Port P10 bit */
#define  p1_1  p1_addr.bit.b1   /* Port P11 bit */
#define  p1_2  p1_addr.bit.b2   /* Port P12 bit */
#define  p1_3  p1_addr.bit.b3   /* Port P13 bit */
#define  p1_4  p1_addr.bit.b4   /* Port P14 bit */
#define  p1_5  p1_addr.bit.b5   /* Port P15 bit */
#define  p1_6  p1_addr.bit.b6   /* Port P16 bit */
#define  p1_7  p1_addr.bit.b7   /* Port P17 bit */
…………
说明:
1.结构体所占内存长度是各成员所占内存长度之和,每个成员分别占有自己的内存单元;共用体(联合体)变量所占的内存长度等于最长的成员长度(共用一段内存)。
2.在结构体 bit_def 中,用到了结构体的高级特性,那就是在基本成员变量的后面添加:
: 数据位数
组成新的结构体:
struct xxx
{
成员1 类型成员1 : 成员1 位数;
成员2 类型成员2 : 成员2 位数;
成员3 类型成员3 : 成员3 位数;
};
基本的成员变量就会被拆分,bit_def 的8个成员共占一个char 的空间。
3.#pragma ADDRESS directive 的说明
  • On setting the address value of an object containing a structure, array or union using the #pragma ADDRESS directive

  • Product Concerned
    M3T-CC32R V.4.30 Release 00
  • Description
    Consider that a #pragma ADDRESS directive is used for defining the address
    of an object that is an array or structure; or a union that has members
    of type array or structure.
    If a member or element placed at any address except the beginning address
    of the object is accessed (read or written) or referenced by an address
    operator (&), incorrect code is generated using the address of the member
    or element placed at the beginning of the object.
    2.1 Conditions
      This problem occurs if the following conditions are satisfied:
       
          
            (1)
            Any of the following three objects is declared outside of a function:
            (a) A structure
            (b) An array
            (c) A union having members of type array or structure
          
          
            (2)
            A #pragma ADDRESS directive is used for defining the object in (1).
          
          
            (3)
            For a member or element placed at any address except the beginning
            address of the object, either of the following is performed:
            (a) Accessing (reading or writing)
            (b) Referencing by an address operator (&)
          
       
      2.2 Examples
      
    Source file: sample1.c
    ----------------------------------------------------------------------
    #pragma ADDRESS data1 0x10000        /* Condition (2) */
    struct stg1 {
         int a;
         int b;
    } data1;                             /* Condition (1)-(a) */
    void func1(void)
    {
         data1.b = 3;                     /* Condition (3)-(a) */
    }
    ----------------------------------------------------------------------
    Source file: sample2.c
    ----------------------------------------------------------------------
    #pragma ADDRESS data2 0x20000        /* Condition (2) */
    short data2[10];                     /* Condition (1)-(b) */
    short *d2;
    void func2(void)
    {
         d2 = &data2[3];                  /* Condition (3)-(b) */
    }
    ----------------------------------------------------------------------
    Source file: sample3.c
    ----------------------------------------------------------------------
    union utg3 {
         double a[10];
         struct {
             int b;
             double c[5];
         } d;
    } data3;                             /* Condition (1)-(c) */
    #pragma ADDRESS data3 0x30000        /* Condition (2) */
    void func3(int i)
    {
         data3.d.c =                   /* Condition (3)-(a) */
             data3.a[4];                  /* Condition (3)-(a) */
    }
    ----------------------------------------------------------------------
                   
                   
                   
                   

    本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/74310/showart_1679697.html
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP