iorixwj 发表于 2013-9-5 15:56:23

C语言中有规律的代码的生成方法

本帖最后由 iorixwj 于 2013-9-5 16:00 编辑

前些天,我发现一个小子努力的在敲PIC16LF1907的LCD驱动代码,其中一段如下:
union {
    uchar data;
    struct {
      unsigned   SEG0COM0         : 1;
      unsigned   SEG0COM1         : 1;
      unsigned   SEG0COM2         : 1;
      unsigned   SEG0COM3         : 1;
    } bits;
} LCDDATA0 @ 0x140;

union {
    uchar data;
    struct {
      unsigned   SEG1COM0         : 1;
      unsigned   SEG1COM1         : 1;
      unsigned   SEG1COM2         : 1;
      unsigned   SEG1COM3         : 1;
    } bits;
} LCDDATA0 @ 0x141;
…………(此处省略N行)

union {
    uchar data;
    struct {
      unsigned   SEG23COM0         : 1;
      unsigned   SEG23COM1         : 1;
      unsigned   SEG23COM2         : 1;
      unsigned   SEG23COM3         : 1;
    } bits;
} LCDDATA23 @ 0x157;

看见了这代码,我跟他说,这样有规律的代码可以要用代码去生成,能节省时间也避免一些错误。
这是怎么一回事?我让他先把python环境安装了。
python环境搭建:
这步简单,网上也有好多教材,只要在python官网http://www.python.org/getit/ 找到相应平台下的python安装就可以了

完了设一下环境变量就可以,如图1

然后随便写段代码,运行成功…… 如图2


用phthon生成C语言文件:
直接上代码:
tmpl = '''volatile union {
    uchar data;
    struct {
      unsigned   SEG%(idx)dCOM0         : 1;
      unsigned   SEG%(idx)dCOM1         : 1;
      unsigned   SEG%(idx)dCOM2         : 1;
      unsigned   SEG%(idx)dCOM3         : 1;
    } bits;
} LCDDATA%(idx)d @ 0x%(addr)x;

'''


with open("lcd_def.h", "w") as outfile:
    for i in range(24):
      idx = i
      addr = 0x140+i
      outfile.write( tmpl %{ 'idx': idx, 'addr': addr } )
保存后运行一下,文章最前面的代码就自动生成了!
如图3

leifeng 发表于 2013-9-5 15:59:48

ctrl+C ,ctrl+V

iorixwj 发表于 2013-9-5 16:02:36

leifeng 发表于 2013-9-5 15:59 static/image/common/back.gif
ctrl+C ,ctrl+V

不是重复代码啦{:2_39:}

zhugean 发表于 2013-9-5 16:09:41

宏定义
凑字数

iorixwj 发表于 2013-9-5 16:31:01

zhugean 发表于 2013-9-5 16:09 static/image/common/back.gif
宏定义
凑字数

怎么弄?欢迎拍砖

zhugean 发表于 2013-9-5 16:39:17

本帖最后由 zhugean 于 2013-9-5 16:40 编辑

#define TEST(a,b,c) \
union { \
    uchar data; \
    struct { \
      unsigned   SEG##c##COM0         : 1;\
      unsigned   SEG##c##COM1         : 1;\
      unsigned   SEG##c##COM2         : 1;\
      unsigned   SEG##c##COM3         : 1;\
    } bits;\
} LCDDATA##a @ 0x##b ;

Jason022 发表于 2013-9-5 16:39:23

复制粘贴 列编辑

zhugean 发表于 2013-9-5 16:42:00

会用##进行宏定义就可以了

redroof 发表于 2013-9-5 19:07:43

最简单的代码生成器实际上是excel
拖出一列数字,然后写字符串加法,往下拖,就行了。。。

learner123 发表于 2013-9-5 19:14:02

顶宏定义

这种东西用python,太牛刀杀鸡了,不确切的说应该是大炮打蚊子了。

xuxi2009 发表于 2013-9-5 19:17:13

傻孩子的教程里面有这个方法

给你个例子

//here is a magic method combine two strings at the preprocess period
//a recursion in fact

#define TPASTE2( a, b)                            a##b

#define MREPEAT(count, macro, data)         TPASTE2(MREPEAT, count)(macro, data)

#define MREPEAT0(macro, data)
#define MREPEAT1(macro, data)       MREPEAT0(macro, data)   macro(0, data)
#define MREPEAT2(macro, data)       MREPEAT1(macro, data)   macro(1, data)
#define MREPEAT3(macro, data)       MREPEAT2(macro, data)   macro(2, data)
#define MREPEAT4(macro, data)       MREPEAT3(macro, data)   macro(3, data)
#define MREPEAT5(macro, data)       MREPEAT4(macro, data)   macro(4, data)
#define MREPEAT6(macro, data)       MREPEAT5(macro, data)   macro(5, data)
#define MREPEAT7(macro, data)       MREPEAT6(macro, data)   macro(6, data)
#define MREPEAT8(macro, data)       MREPEAT7(macro, data)   macro(7, data)
#define MREPEAT9(macro, data)       MREPEAT8(macro, data)   macro(8, data)
#define MREPEAT10( macro, data)       MREPEAT9(macro, data)   macro(9, data)
#define MREPEAT11( macro, data)       MREPEAT10( macro, data)   macro( 10, data)

#define BUFFER_RX_DEFINATION(CH_NUM, unused)RingBufInit(&g_sRxBuf[##CH_NUM##], g_pucRX##CH_NUM##Buffer, BUFFER_SIZE_CH##CH_NUM##);
        MREPEAT(MAX_S2E_PORTS, BUFFER_RX_DEFINATION, ~)
#undef BUFFER_RX_DEFINATION

上面三句话得到的结果是
RingBufinit(&g_sRxBuf,g_pucRX0Buffer,BFFER_SIZE_CH0);
RingBufinit(&g_sRxBuf,g_pucRX1Buffer,BFFER_SIZE_CH1);
RingBufinit(&g_sRxBuf,g_pucRX2Buffer,BFFER_SIZE_CH2);
RingBufinit(&g_sRxBuf,g_pucRX3Buffer,BFFER_SIZE_CH3);
.......

lihq97 发表于 2013-9-5 19:50:14

我一般也是用##

millwood0 发表于 2013-9-5 21:02:28

get a copy of IAR-AVR and see how they did it.

zndz410 发表于 2013-9-16 15:14:56

八仙过海,各显神通.哈哈.

caoxuedong 发表于 2013-9-16 15:24:47

没用过,一般都是ctrl+c,ctrl+v,没想这么复杂。

marx 发表于 2013-9-16 15:24:57

mark ##,见过别人用过自己没用过

kxb 发表于 2013-9-16 15:25:30

学习了,谢谢

kebaojun305 发表于 2013-9-16 15:32:08

八仙过海 各显神通 {:lol:}{:lol:}{:lol:}

RainKing 发表于 2013-9-17 09:27:28

不错,需要好好学习……

opa 发表于 2013-9-17 11:35:48

想用C++来做呀,不过不知怎么下手...。
页: [1]
查看完整版本: C语言中有规律的代码的生成方法