ihavedone 发表于 2024-3-28 16:03:32

C语言能否用宏生成宏定义



STM32的头文件中有很多类似这样的定义,

#define CSD_CR_TRIG_Pos         (0)
#define CSD_CR_TRIG_Msk         (0x01 << CSD_CR_TRIG_Pos)



宏格式有点类似,都是 “寄存器_位域_Pos”,下面的 Msk 宏又用了上面的 Pos 宏。
那么有没有办法用一个宏定义,来自动生成那两个宏定义?红参数提供寄存器名,位域名,偏移位置,和掩码。
#define SFR_BIT_GEN(srf, name, pos, msk)    ???


我试了好久也不行,主要是宏定义的扩展体中没法扩展出 # 字符。宏体中写入 # 有他自己另外的用法。

大佬们有办法没?

大个给力 发表于 2024-3-31 21:59:25

导入KCONFIG

x.or@qq.com 发表于 2024-4-2 00:18:46

X-Macro?

C 语言有什么奇技淫巧? - 吴承霖的回答 - 知乎
https://www.zhihu.com/question/27417946/answer/36617347

tlzjh 发表于 2024-4-23 11:52:35

试了一下,用C宏的文本替换生成新的宏定义,这个实现不了。可以考虑用python或者C实现文本替换功能:

定义一个寄存器描述文件regs.txt


#name Pos Msk
CSD_CR_TRIG 0   0x01
CSD_CR_XXX3   0x1F


python转换脚本



import os

def autogen(infile, outfile):
    inf = open(infile)
    outf = open(outfile, 'w')

    if inf is None: return
    if outf is None: return

    lines = inf.readlines()
    lines = [ line.strip() for line in lines ]
    lines = [ line for line in lines if not line.startswith('#') ]
    for line in lines:
      s = line.split()
      if len(s) != 3: continue
      name, pos, mask = s
      print(f'#define {name}_Pos ({pos})', file=outf)
      print(f'#define {name}_Msk ({mask} << {name}_Pos)', file=outf)

infile = 'regs.txt'
outfile = 'regs.h'

autogen(infile, outfile)



转换结果regs.h


#define CSD_CR_TRIG_Pos (0)
#define CSD_CR_TRIG_Msk (0x01 << CSD_CR_TRIG_Pos)
#define CSD_CR_XXX_Pos (3)
#define CSD_CR_XXX_Msk (0x1F << CSD_CR_XXX_Pos)
页: [1]
查看完整版本: C语言能否用宏生成宏定义