Chinaunix首页 | 论坛 | 博客
  • 博客访问: 857465
  • 博文数量: 213
  • 博客积分: 5048
  • 博客等级: 大校
  • 技术积分: 1883
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-14 10:14
文章分类

全部博文(213)

文章存档

2011年(4)

2010年(55)

2009年(47)

2008年(107)

我的朋友

分类: 嵌入式

2009-11-05 23:32:04

#define _SETBIT(a,b)        (a##OUT |= (b))            
#define SETBIT(a,b)        _SETBIT(a,b)            //设置输出IO口为高
#define _CLRBIT(a,b)        (a##OUT &= ~(b))
#define CLRBIT(a,b)        _CLRBIT(a,b)            //设置输出IO口为低
#define _NEGBIT(a,b)        (a##OUT ^= (b))
#define NEGBIT(a,b)        _NEGBIT(a,b)            //设置输出IO口取反

上面这三个是设置io口,##是连接符的作用,由于我的a可能也是宏,而##是不会吧他两端的字符串做宏展开的,所以我用如_NEGBIT(a,b)做一次宏展开。

#define RSHIFT(a, b)  ((a)>>b)
#define LSHIFT(a, b)  ((a)<上面这样做的好处就是可以避免有时由于自己少写括号,导致计算顺序混乱错误
比如:x = b + a>>2;这个计算会先算加号再是右移,可能一次偷懒那就悲剧了。。

#define App_Reset   (*(volatile unsigned short *)0x03FE)
#define App_Startup (*(void (*)(void))App_Reset)
这样我调用App_Startup()函数,就是跳转到0x3FE内存中值的地址运行代码,这个主要是我从bootload跳转到我的应用程序。

#define DEVICEID        (*(volatile unsigned char *)0x1000)
这个DEVICEID存在地址0x1000的内存中,最好加上volatile。

#pragma pack(1)
struct wsnHead {
    uchar dest;
    uchar local;
    uchar cmd;
};
#pragma pack()
#define PWSNHEAD(a)            ((struct wsnHead*)a)
这是我在wsn中经常用的一个宏定义,a一般是void类型指针,由于无线芯片每次发送接收都是32个字节数据,但是在整个wsn中,这32个字符可能是按照char处理,可能按照某种struct处理,这时把a指向32个字节起始地址,然后在具体应用中,根据里面具体是什么数据,用对应的strut格式处理,这样会方便很多,要提醒的是struct的pack一定要是1。

待续

阅读(1160) | 评论(0) | 转发(0) |
0

上一篇:msp430的定时方法

下一篇:vivi杂谈

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