Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1229125
  • 博文数量: 479
  • 博客积分: 12240
  • 博客等级: 上将
  • 技术积分: 4999
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-24 17:12
文章分类

全部博文(479)

文章存档

2014年(1)

2013年(1)

2012年(1)

2011年(95)

2010年(177)

2009年(167)

2008年(16)

2007年(21)

分类: LINUX

2009-10-14 21:43:00

GCC##n## skill

##在C语言中是预算符
例如:#define X(n)   x##n
则 X(1)就是x1,X(2)就是x2,说白了,##就是将x和n粘起来。



参考arch/arm/mach-lpc313x/irq.c文件。
如果要定义一系列有序函数,可用##n##实现。如下是LPC313x的中断处理中用到的技巧。

首先定义一个宏定义ROUTER_HDLR(n):
116 #define ROUTER_HDLR(n) \
117     static void router##n##_handler (unsigned int irq, struct irq_desc *desc) { \
118         u32 status, bank, bit_pos; \
119         if (IRQ_EVTR##n##_START == IRQ_EVTR##n##_END) { \
120             /* translate IRQ number */ \
121             irq = IRQ_EVTR##n##_START; \
122             generic_handle_irq(irq); \
123         } else { \
124             for (irq = IRQ_EVTR##n##_START; irq <= IRQ_EVTR##n##_END; irq++) {  \
125                 /* compute bank & bit position for the event_pin */ \
126                 bank = EVT_GET_BANK(irq_2_event[irq - IRQ_BOARD_START].event_pin); \
127                 bit_pos = irq_2_event[irq - IRQ_BOARD_START].event_pin & 0x1F; \
128                 status = EVRT_OUT_PEND(n, bank); \
129                 if (status & _BIT(bit_pos)) \
130                     generic_handle_irq(irq); \
131             } \
132         } \
133     }

宏定义ROUTER_HDLR(n)中的n,要在函数名中使用,是通过##n##实现的,这样就可以定义一系列有序号的函数了。
137 ROUTER_HDLR(0)  // static void router0_handler()
141 ROUTER_HDLR(1)  // static void router1_handler()
145 ROUTER_HDLR(2)  // static void router2_handler()
149 ROUTER_HDLR(3)  // static void router3_handler()

这几句声明其实就是声明和实现了roter0_handler() ~ router3_handler() 3个函数。

最后使用按照正常的函数使用即可:
266     /* install chain handler for IRQ_EVT_ROUTER0 */
267     set_irq_chained_handler (IRQ_EVT_ROUTER0, router0_handler);

271     /* install chain handler for IRQ_EVT_ROUTER1 */
272     set_irq_chained_handler (IRQ_EVT_ROUTER1, router1_handler);

276     /* install chain handler for IRQ_EVT_ROUTER2 */
277     set_irq_chained_handler (IRQ_EVT_ROUTER2, router2_handler);

281     /* install chain handler for IRQ_EVT_ROUTER3 */
282     set_irq_chained_handler (IRQ_EVT_ROUTER3, router3_handler);

直接在代码中寻找roter0_handler ~ router3_handler的标号是找不到的。

阅读(1161) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~