编译内核时为某个文件夹/文件设定编译选项/DEBUG

本文详细介绍了在编译内核时如何为特定文件夹和文件设置编译选项,包括如何使用EXTRA_变量和CFLAGS_$@、AFLAGS_$@来定制编译过程,并解释了如何在不同情况下启用或禁用DEBUG宏定义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编译内核时为某个文件夹设定编译选项:

所有的 EXTRA_ 变量(EXTRA_CFLAGS, EXTRA_AFLAGS, EXTRA_LDFLAGS, EXTRA_ARFLAGS)只在所定义的Kbuild Makefile中起作用。EXTRA_ 变量可以在Kbuild Makefile中所有命令中使用。

$(EXTRA_CFLAGS) 是用 $(CC) 编译C源文件时的选项。

例子:

  # drivers/sound/emu10kl/Makefile

  EXTRA_CFLAGS += -I$(obj)

  ifdef DEBUG

      EXTRA_CFLAGS += -DEMU10KL_DEBUG

  endif

 

该变量是必须的,因为顶层Makefile拥有变量 $(CFLAGS) 并用来作为整个源代码树的编译选项。

$(EXTRA_AFLAGS) 也是一个针对每个目录的选项,只不过它是用来编译汇编源代码的。

例子:

#arch/x86_64/kernel/Makefile

EXTRA_AFLAGS := -traditional

 

$(EXTRA_LDFLAGS) 和 $(EXTRA_ARFLAGS)分别与 $(LD)和 $(AR)类似,只不过,他们是针对每个目录的。

例子:

#arch/m68k/fpsp040/Makefile

EXTRA_LDFLAGS := -x

 

编译内核时为某个文件设定编译选项:

CFLAGS_$@, AFLSGA_$@

CFLAGS_$@ 和 AFLAGS_$@ 只能在当前Kbuild Makefile中的命令中使用。

$(CFLAGS_$@) 是 $(CC) 针对每个文件的选项。$@ 表明了具体操作的文件。

例子:

# drivers/scsi/Makefile

CFLAGS_aha152x.o =  -DAHA152X_STAT -DAUTOCONF

CFLAGS_gdth.o    =  # -DDEBUG_GDTH=2 -D__SERIAL__ -D__COM2__ \

              -DGDTH_STATISTICS

CFLAGS_seagate.o =  -DARBITRATE -DPARITY -DSEAGATE_USE_ASM

以上三行分别设置了aha152x.o,gdth.o 和 seagate.o的编辑选项。

$(AFLAGS_$@) 也类似,只不是是针对汇编语言的。

例子:

# arch/arm/kernel/Makefile

AFLAGS_head-armv.o := -DTEXTADDR=$(TEXTADDR) -traditional

AFLAGS_head-armo.o := -DTEXTADDR=$(TEXTADDR) -traditional

 

 

设定DEBUG编译选项

内核很多地方对是否定义了DEBUG有不同的打印信息,例如:

在include\linux\device.h中Line542开始

#ifdef DEBUG

#define dev_dbg(dev, format, arg...)            \

       dev_printk(KERN_DEBUG , dev , format , ## arg)

#else

#define dev_dbg(dev, format, arg...)            \

       ({ if (0) dev_printk(KERN_DEBUG, dev, format, ##arg); 0; })

#endif

又例如:

在include\linux\kernel.h中Line306开始

#ifdef DEBUG

/* If you are writing a driver, please use dev_dbg instead */

#define pr_debug(fmt, arg...) \

       printk(KERN_DEBUG fmt, ##arg)

#else

#define pr_debug(fmt, arg...) \

       ({ if (0) printk(KERN_DEBUG fmt, ##arg); 0; })

#endif

 

可按上述方式添加DEBUG宏定义。

如果不是编译内核,可直接在命令行添加-DDEBUG编译选项。:

添加DEBUG定义:

gcc   -DDEBUG   -o   ttt   a.c   b.c

取消DEBUG宏定义:

gcc   -UDEBUG   -o   ttt   a.c   b.c

 

### 访问或操作 GPIO 接口 #### 检查 GPIO 文件夹是否存在 为了确认系统支持通过 `/sys/class/gpio` 来管理 GPIO,需先验证该路径下的文件夹存在与否。如果不存在,则需要在编译内核添加 `Device Drivers -> GPIO Support -> /sys/class/gpio/… (sysfs interface)` 的选项[^1]。 #### 导出特定的 GPIO 号码 要开始使用某个具体的 GPIO 编号(例如 33),可以通过向 export 文件发送相应的数值来完成导出动作: ```bash sudo echo 33 > /sys/class/gpio/export ``` 这一步骤会创建一个新的子目录 `/sys/class/gpio/gpio33`,其中包含了用于控制此 GPIO 的各种属性文件[^2]。 #### 设置 GPIO 方向 一旦成功导出了目标 GPIO 后,可以设定其工作模式——输入(input) 或 输出(output),方法是修改 direction 属性的内容: ```bash echo "out" > /sys/class/gpio/gpio33/direction ``` 上述命令将 GPIO 33 配置成输出模式;若改为 `"in"` 则代表将其设为输入模式。 #### 获取 GPIO 状态信息 对于想要了解当前所有已分配给系统的 GPIO 使用状况的情况,可利用如下命令获取概览性的数据: ```bash sudo cat /sys/kernel/debug/gpio | grep 'gpio' ``` 这条语句能够过滤并显示有关于各个 GPIO 的基本信息,比如它们的状态、功能等细节。 #### 查询具体 GPIO 芯片详情 当涉及到多组不同的 GPIO 控制器,可能还需要知道每一块芯片的具体参数。以 gpiochip32 为例,进入对应的目录后即可查阅更多关于这一部分的信息: ```bash cd /sys/class/gpio/gpiochip32/ cat base # 显示起始编号 cat label # 查看所属分组名称 ``` 以上就是基于 Linux 下标准做法的操作流程概述,在实际项目里可以根据需求灵活调整所使用的 GPIO 编号以及其他相关设置[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值