搜索
bottom↓
回复: 6

请教一个C语言宏定义的问题

[复制链接]

出0入0汤圆

发表于 2014-8-5 10:45:34 | 显示全部楼层 |阅读模式
为了方便移植MSP430 I2C的程序(主要是I/O口选的不一样),在网上发现了这个帖子,原帖的内容是:
相信不少人都有在不同CPU间移植程序的经历,在移植过程中,对IO引脚的移植又占据了移植工作的大部分。那么,是否能在编码过程中采用一种较好的方法来减少将来移植中的工作量呢?
假设MSP430单片机的P40,P41,P42分别接在I2C的WP,SCK,SDL引脚上。通常,你可能会最先想到下面这种办法:
.H
#define I2C_WP 1
#define I2C_SCK 2
#define I2C_SDA 4
#define I2C_PDIR P4DIR
#define I2C_POUT P4OUT
#define I2C_PIN P4IN
.C
I2C_PDIR |= (I2C_WP | I2C_SCK | I2C_SDA);
I2C_POUT |= I2C_WP;
….

若WP是由P30经反相器接到WP脚上的,那么移植的工作量仍然是比较多,
#define IO_I2C_WP(m) m(3, 0, Y)
#define IO_I2C_SCK(m) m(4, 1, N)
#define IO_I2C_SDA (m) m(4, 2, N)

#define IO_SET(name) IO_##name(SET_)
#define IO_SET_(port, bit, inv) IO_SET_##inv(port, bit)
#define IO_SET_Y(port, bit) P##port##OUT &= ~(1<<bit)
#define IO_SET_N(port, bit) P##port##OUT |= (1<<bit)

#define IO_CLR(name) IO_##name(CLR_)
#define IO_CLR_(port, bit, inv) IO_CLR_##inv(port, bit)
#define IO_CLR_Y(port, bit) P##port##OUT |= (1<<bit)
#define IO_CLR_N(port, bit) P##port##OUT &= ~(1<<bit)

#define IO_DIR_O(name) IO_##name(DIR_O_)
#define IO_DIR_I(name) IO_##name(DIR_I_)
#define IO_DIR_O_(port, bit, inv) P##port##DIR |= (1<<bit)
#define IO_DIR_I_(port, bit, inv) P##port##DIR &=~ (1<<bit)

#define IO_TEST(name) IO_#name(TEST_)
#define IO_TEST_(port, bit, inv) IO_TEST_##inv(port, bit)
#define IO_TEST_Y(port, bit) ((P##port##IN & (1<<bit)) == 0)
#define IO_TEST_N(port, bit) ((P##port##IN & (1<<bit)) != 0)

#define IO_PORT(name) IO_##name(PORT_)
#define IO_PORT_(port, bit, inv) port

#define IO_BIT(name) IO_##name(BIT_)
#define IO_BIT_(port, bit, inv) (1<<bit)

#define IO_P4_MASK(m)
(
  m(I2C_SCK)
  | m(I2C_SDA)
  )
…..
  如上所示,你可以按照上面的方式增加自己的功能。站长提示:其实不光MSP430单片机可以用这种方法,其它微处理器也可以这种方法。象8051单片机就可以这种方法来很好的实现。

注: 此资料由一位网友所提供,作者未明.


仔细研究了好久也不明白其中的IO_SET(name) IO_##name(SET_) 这一句,还请C语言高手答疑解惑

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2014-8-5 11:43:58 | 显示全部楼层
"##"能把两个字符串连接起来
举例:
AA##BB预处理后得到AABB

IO_SET(name) IO_##name(SET_):
IO_SET(GPIOA)——>IO_##GPIOA(SET_)——>IO_GPIOA(SET_)

出0入0汤圆

 楼主| 发表于 2014-8-5 12:10:24 | 显示全部楼层
mhw 发表于 2014-8-5 11:43
"##"能把两个字符串连接起来
举例:
AA##BB预处理后得到AABB

IO_GPIOA(SET_) 这个在msp430xxxx.h头文件有定义吗?

出0入0汤圆

发表于 2014-8-5 12:20:52 | 显示全部楼层
举个例子而已……………………

出0入0汤圆

 楼主| 发表于 2014-8-5 13:00:02 | 显示全部楼层
mhw 发表于 2014-8-5 12:20
举个例子而已……………………

已经明白了,把IO_SET(name) IO_##name(SET_) 改为IO_SET(name) IO_##name(IO_SET_)。那么
IO_SET(I2C_WP)->IO_I2C_WP(IO_SET_)->IO_SET_(3,0,Y)->IO_SET_Y(3,0)->P3OUT &= ~(1<<0)

Y表示有反相器 ,N表示没有

出0入0汤圆

发表于 2014-8-5 15:35:20 | 显示全部楼层
犀利~~~~~~~~~~~~~~~~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 02:12

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表