#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。
待续
阅读(1137) | 评论(0) | 转发(0) |