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) ???
我试了好久也不行,主要是宏定义的扩展体中没法扩展出 # 字符。宏体中写入 # 有他自己另外的用法。
大佬们有办法没?
导入KCONFIG X-Macro?
C 语言有什么奇技淫巧? - 吴承霖的回答 - 知乎
https://www.zhihu.com/question/27417946/answer/36617347 试了一下,用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]