Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1968160
  • 博文数量: 356
  • 博客积分: 8284
  • 博客等级: 中将
  • 技术积分: 4580
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-15 20:25
个人简介

天行健,君子以自强不息

文章分类

全部博文(356)

文章存档

2018年(1)

2016年(4)

2015年(13)

2014年(14)

2013年(2)

2012年(25)

2011年(43)

2010年(65)

2009年(189)

分类: C/C++

2011-04-01 19:28:41

例1.
#define outportword(base,addr,tempdata) (*((unsigned short *)(base+addr))=tempdata)

#define inportword(base,addr) (*((unsigned short *)(base+addr)))

以上两个宏函数实现的效果是?

第一个:
首先把地址base+addr强制转换成unsigned short类型
然后把地址base+addr里面的值写成tempdata
也就是把tempdata写入到*((unsigned short *)(base+addr))中。(就是一个写的作用)
第二个:
比如:
c=(*((unsigned short *)(base+addr))) ;
他的作用就是把该地址的数据读出来。(即一个读取的作用)
 



例2.
struct frt_link_t
{
int ip;
unsigned short offset;
unsigned short data_len;
struct frt_link_t *next;
}
struct frt_link_t *frt_recv_link[32];
struct frt_link_t *frt_send_link[32];
frt_recv_link[0]=(struct frt_link_t *)malloc(sizeof(struct frt_link_t));
frt_recv_link[0]->ip=0;
能否讲解一下这段代码!(尤其最后两句。)

struct frt_link_t 

int ip; 
unsigned short offset; 
unsigned short data_len; 
struct frt_link_t *next; 

================================
这里定义一个结构体的变量
struct frt_link_t *frt_recv_link[32]; 
struct frt_link_t *frt_send_link[32]; 
==========================================
这两行是定义了两个数组,每个数组均有32个元素,每个元素都为一个指向struct frt_link_t 的指针,也就是说这个数组里面存放的是地址!
frt_recv_link[0]=(struct frt_link_t *)malloc(sizeof(struct frt_link_t)); 
=======================================================================
这是一个申请动态RAM将其首地址赋给frt_recv_link[0]的语句!
详细分析:malloc(sizeof(struct frt_link_t))这一小段是申请sizeof(struct frt_link_t)大小的RAM空间,将其返回的一个地址强制转换成指向struct frt_link_t的指针,并将转换成的指针赋给存放指针变量的frt_recv_link[0]!
frt_recv_link[0]->ip=0; 
===============================
在之前那个一个语句,我们已经知frt_recv_link[0]是批向一块刚申请成功的RAM,此块RAM放着的是一个结构体 frt_link_t的变量,这个语句就是将此指针(frt_recv_link[0])所指向的结构体变量当中IP这个元素清零! 


例3。
typedef struct 
{
unsigned int sec;
int          nsec;
}gef_if_time_t;
int gef_if_timer_stamp(gef_if_time_t *p)
{
p->nsec=12;
return 0;
}
然后把a定义成gef_if_time_t型的结构体。
最后操作如下:
gef_if_timer0_stamp(&a);
-------------------------------------
我想请教的是最后一句话收到了一种什么样的效果,有什么作用? 

 讲解:
typedef struct  

unsigned int sec; 
int          nsec; 
}gef_if_time_t; 
定义了一个结构体。

int gef_if_timer_stamp(gef_if_time_t *p) 

p->nsec=12; 
return 0; 

定义了一个函数。这个函数的形参是 gef_if_time_t型指针变量p,然后函数对这个变量进行操作,具体说就是幅值操作。

然后把a定义成gef_if_time_t型的结构体。 
最后操作如下: 
gef_if_timer0_stamp(&a); 

定义的a是gef_if_time_t型变量,但是不是指针型的,所以要取其地址,才能传递给int gef_if_timer_stamp(gef_if_time_t *p)这个函数。

达到的结果:
让 gef_if_time_t 型变量a的nesc元素=12.



例4.
#define DPRAM_BASE_ADDR 0X0C01111
unsigned char *dpram_addr;
for(i=0;i<4096;i++)
{
*((unsigned short *)(DPRAM_BASE_ADDR)+i)=0;
}
dpram_addr=(unsigned char *)DPRAM_BASE_ADDR;
//unsigned char 是一个字节,unsigned short是两个字节。
这段代码的原理和效果是?能否讲详细一点么?

是把8K的空间置零
DPRAM_BASE_ADDR只是表示一个地址,告诉程序从哪取数据,而指针类型告诉它取多少,比如数据是0101010110101010……,你定义成unsigned char*的指针就取01010101,而定义成unsigned short*时就取0101010110101010,但是数据是不会因为你的指针类型而改变的,还是0101010110101010……

*((unsigned short *)(0X0C01111+0)=0;  //地址 0X0C01111  和  0X0C01112   等于0                            
  *((unsigned short *)(0X0C01111+1)=0;  //地址 0X0C01112  和  0X0C01113   等于0
……
……
……
 *((unsigned short *)(0X0C01111+4095))=0;    //   注意:  0X0C01111+4096 也等于0

第一部分是实现DPRAMA_BASE_ADDR开始之后的8k空间清零
第二部分那条语句只是一条指针赋值语句,即让dpram_addr指向DPRAM_BASE_ADDR这个地址,而"数据是不随指针的变化而变化"的理解是:数据假设0x11223344,已经存储在此地址前4个字节(小端格式),那么指针如果是unsigned char,则读首地址数据是0x44,如果是unsigned short,则读首地址数据是0x3344,同理写数据是也是一样的…
只是操作的数据长度不一样


例5.
typedef struct _AT91S_PIO
{
AT91REG PIO_PER;
AT91REG PIO_PDR;

AT91REG PIO_PSR;

AT91REG PIO_PDSR;
..........

}AT91S_PIO,*AT91PS_PIO;
#define AT91C_BASE_PIO ((AT91PS_PIO) 0XFFFF0000)
AT91C_BASE_PIO->PIODDSR=1<<0;
大侠能否讲解一下这段代码,尤其是最后两句。

typedef struct _AT91S_PIO 

AT91REG PIO_PER; 
AT91REG PIO_PDR; 

AT91REG PIO_PSR; 

AT91REG PIO_PDSR; 
.......... 

}AT91S_PIO,*AT91PS_PIO;
AT91S_PIO是一个_AT91S_PIO 结构体
AT91PS_PIO是指向一个_AT91S_PIO结构体的指针

#define AT91C_BASE_PIO ((AT91PS_PIO) 0XFFFF0000)
宏定义 AT91C_BASE_PIO是一个指向地址0XFFFF0000的_AT91S_PIO 结构体指针

AT91C_BASE_PIO->PIODDSR=1<<0;
AT91C_BASE_PIO指向的_AT91S_PIO 结构体内的PIODDSR被赋值为1
 
((AT91PS_PIO) 0XFFFF0000) 
(AT91PS_PIO) 强制类型转换
类似(char*)0xFFFF0000


例6.
define ODTAB_NUM 110
struct gef_if_od_t 
{
unsigned short objid;
unsigned short appid;
void *offset_addr;
void * addr;
struct gef_if_od_t *next;
}
struct gef_if_od_t *odtab[ODTAB_NUM];
int get_od_init(void)
{
odtab[0]=(struct gef_if_od_t *)malloc(sizeof(struct gef_if_od_t));
odtab[0]->objid=0x0;
......
for(i=1;i{
odtab[i]=odtab[0];
}
return 0;
}
麻烦各位大侠讲讲这段代码(主要是指针方面),然后odtab[0]=(struct gef_if_od_t *)malloc(sizeof(struct gef_if_od_t))这句话能否着重讲一下!


malloc()是C的库函数之一,要熟悉基本库函数的用法:
malloc向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。

(struct gef_if_od_t *)表示把函数指针类型转换为gef_if_od_t类型。
sizeof(struct gef_if_od_t)表示一块gef_if_od_t结构体的大小

gef_if_od_t这个结构里有2个ID号,2个指针,还有个next指针指向下一个结构(一般用于链表)。

odtab是个数组,里面的每个元素都是(gef_if_od_t *)类型的,所以它的每个元素都需要malloc或者new一下,将得到的指针赋给它。

odtab[0]=(struct gef_if_od_t *)malloc(sizeof(struct gef_if_od_t)),就是申请一个gef_if_od_t大小的空间,然后转换成gef_if_od_t的指针,为何需要转换,是因为malloc得到的指针是(void *)类型的。

for循环里的odtab[i]=odtab[0],是将所有的odtab的元素都初始化为和odtab[0]一样,也就是说数组的所有元素都是一样的,都指向你前面malloc的空间。

struct gef_if_od_t *odtab[ODTAB_NUM];
odtab数组里放点是结构体指针,所以odtab[0]里放的是指向申请到的空间的指针


例7.
#define HWREG(X)   (*((volatile unsigned long *)(x)))
这个宏函数实现的是什么功能啊,能否讲详细一点?

这个宏的功能是获取地址X上的数据,数据的类型是unsigned long
这种宏主要是用在对MCU寄存器的操作上

(volatile unsigned long *)(x) 这一步是类型转换

然后就相当于*address了,就是取地址上的数据

(volatile unsigned long *)(x)是将x强制转换成volatile unsigned long型的指针,与(u8 *) x很相似吧
在这个指针前面再加一个*就是将这个指针的内容取出来了
阅读(3081) | 评论(0) | 转发(0) |
0

上一篇:GPS卫星授时

下一篇:工业干洗机控制系统

给主人留下些什么吧!~~