硬汉嵌入式论坛

 找回密码
 立即注册
查看: 318|回复: 3
收起左侧

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

[复制链接]

58

主题

267

回帖

446

积分

高级会员

积分
446
发表于 2024-3-28 16:03:32 | 显示全部楼层 |阅读模式


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)    ???


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

大佬们有办法没?
回复

使用道具 举报

0

主题

28

回帖

28

积分

新手上路

积分
28
发表于 2024-3-31 21:59:25 | 显示全部楼层
导入KCONFIG
回复

使用道具 举报

0

主题

20

回帖

20

积分

新手上路

积分
20
发表于 2024-4-2 00:18:46 | 显示全部楼层
X-Macro?

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

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 5 天前 | 显示全部楼层
试了一下,用C宏的文本替换生成新的宏定义,这个实现不了。可以考虑用python或者C实现文本替换功能:

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

[C] 纯文本查看 复制代码
#name Pos Msk
CSD_CR_TRIG 0   0x01
CSD_CR_XXX  3   0x1F


python转换脚本

[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

[C] 纯文本查看 复制代码
#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)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-28 18:38 , Processed in 0.170661 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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