使用Boost.Context模块进行callcc的回声测试程序

175 篇文章 ¥59.90 ¥99.00
本文介绍了一个使用Boost.Context的callcc函数进行回声测试的C++程序。通过示例展示了如何创建continuation对象,启动和恢复协程执行,实现控制流在函数之间的切换。程序会循环读取用户输入并打印,直到用户终止。

使用Boost.Context模块进行callcc的回声测试程序

Boost.Context是一个基于C++的库,它提供了一种实现轻量级协程的机制。其中的callcc函数是Boost.Context模块的一个重要特性,它允许在协程之间进行控制流的切换。本文将介绍一个使用Boost.Context模块的callcc函数进行回声测试的示例程序。

在开始编写代码之前,首先需要确保已经安装了Boost库,并且已经设置好编译环境。接下来,我们将给出一个简单的示例程序,展示如何使用Boost.Context的callcc函数实现回声测试。

#include <iostream>
#include <boost/context/all.hpp>

boost::context
现在又Kbuild文件如下TOP := $(srctree)/.. CAMERA_ROOT=$(TOP)/vendor/oplus/kernel/camera ifeq ($(DEVICE_MODULES_PATH),) DEVICE_MODULES_PATH = $(srctree) else LINUXINCLUDE := $(DEVCIE_MODULES_INCLUDE) $(LINUXINCLUDE) endif LINUX_INC += -Iinclude/linux \ -Iinclude/linux/drm \ -Iinclude/linux/gunyah \ -Iinclude/linux/gunyah \ -Iinclude CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ -DANI_LITTLE_BIT_ENDIAN \ -DDOT11F_LITTLE_ENDIAN_HOST \ -DANI_COMPILER_TYPE_GCC \ -DANI_OS_TYPE_ANDROID=6 \ -DPTT_SOCK_SVC_ENABLE \ -Wall\ -Werror\ -D__linux__ KBUILD_CPPFLAGS += $(CDEFINES) ifneq ($(wildcard $(CAMERA_ROOT)/config/camera.conf),) include $(CAMERA_ROOT)/config/camera.conf LINUX_INC += -include $(CAMERA_ROOT)/config/camera.h endif ccflags-y += $(LINUX_INC) ifeq ($(call cc-option-yn, -Wmaybe-uninitialized),y) EXTRA_CFLAGS += -Wmaybe-uninitialized endif ifeq ($(call cc-option-yn, -Wheader-guard),y) EXTRA_CFLAGS += -Wheader-guard endif obj-m += regulator/ obj-m += lens/ obj-m += flashlight/v4l2/ obj-m += thermal/ 还有如下Makefile # SPDX-License-Identifier: GPL-2.0-only # Copyright (C) 2018-2022 Oplus. All rights reserved. ifneq ($(wildcard $(KERNEL_SRC)/android/abi_gki_aarch64.stg),) BOOT_MIXED_BUILD=true endif KBUILD_OPTIONS+= DFT_ROOT=$(KERNEL_SRC)/$(M) KBUILD_OPTIONS += MODNAME?=dft_dlkm ifneq ($(wildcard $(KERNEL_SRC)/$(DEVICE_MODULES_REL_DIR)/Makefile.include),) include $(KERNEL_SRC)/$(DEVICE_MODULES_REL_DIR)/Makefile.include endif all: EXTRA_SYMBOLS += $(extra_symbols) all: $(MAKE) -C $(KERNEL_SRC) M=$(M) modules $(KBUILD_OPTIONS) KBUILD_EXTRA_SYMBOLS="$(EXTRA_SYMBOLS)" modules_install: $(MAKE) INSTALL_MOD_STRIP=1 -C $(KERNEL_SRC) M=$(M) modules_install %: $(MAKE) -C $(KERNEL_SRC) M=$(M) $@ $(KBUILD_OPTIONS) clean: rm -f *.o *.ko *.mod.c *.mod.o *~ .*.cmd Module.symvers rm -rf .tmp_versions 向我逐行解释这两个文件
06-18
<think>我们有两个文件:一个是Kbuild(或Kbuild片段),另一个是Makefile。它们都是用于构建Linux内核模块的。我们将逐行解释这两个文件的内容。###文件1:Kbuild(或构建脚本片段)```makefileTOP:=$(srctree)/..```-`TOP:=$(srctree)/..`:设置变量`TOP`为内核源码树(`srctree`)的上一级目录。通常`srctree`是内核源码的根目录,所以`TOP`就是内核源码根目录的父目录。---```makefileCAMERA_ROOT=$(TOP)/vendor/oplus/kernel/camera```-`CAMERA_ROOT`被设置为`TOP`下的特定路径,指向摄像头相关的内核代码目录。---```makefileifeq($(DEVICE_MODULES_PATH),)DEVICE_MODULES_PATH=$(srctree)elseLINUXINCLUDE:=$(DEVCIE_MODULES_INCLUDE)$(LINUXINCLUDE)endif```-检查`DEVICE_MODULES_PATH`是否为空。-如果为空,则将其设置为内核源码树根目录(`$(srctree)`)。-如果不为空,则将`LINUXINCLUDE`(内核头文件搜索路径)更新为`$(DEVICE_MODULES_INCLUDE)`加上原来的`LINUXINCLUDE`。注意:这里有一个拼写错误`DEVCIE`应该是`DEVICE`。---```makefileLINUX_INC+=-Iinclude/linux\-Iinclude/linux/drm\-Iinclude/linux/gunyah\-Iinclude/linux/gunyah\-Iinclude```-向`LINUX_INC`变量追加多个`-I`标志,用于指定头文件的搜索路径。这些路径是相对于内核源码目录的。注意:`-Iinclude/linux/gunyah`被重复了两次(可能是冗余的)。---```makefileCDEFINES+=-DANI_LITTLE_BYTE_ENDIAN\-DANI_LITTLE_BIT_ENDIAN\-DDOT11F_LITTLE_ENDIAN_HOST\-DANI_COMPILER_TYPE_GCC\-DANI_OS_TYPE_ANDROID=6\-DPTT_SOCK_SVC_ENABLE\-Wall\-Werror\-D__linux__```-向`CDEFINES`变量追加多个预处理器宏定义(`-D`)和编译选项(`-Wall`、`-Werror`):-定义字节序为小端(`ANI_LITTLE_BYTE_ENDIAN`)。-定义比特序为小端(`ANI_LITTLE_BIT_ENDIAN`)。-定义主机为小端(`DOT11F_LITTLE_ENDIAN_HOST`)。-定义编译器类型为GCC(`ANI_COMPILER_TYPE_GCC`)。-定义操作系统类型为Android,版本6(`ANI_OS_TYPE_ANDROID=6`)。-启用PTT套接字服务(`PTT_SOCK_SVC_ENABLE`)。-启用所有警告(`-Wall`)。-将所有警告视为错误(`-Werror`)。-定义Linux平台宏(`-D__linux__`)。---```makefileKBUILD_CPPFLAGS+=$(CDEFINES)```-将`CDEFINES`中定义的选项追加到`KBUILD_CPPFLAGS`,这是内核构建系统使用的变量,用于C预处理器标志。---```makefileifneq($(wildcard$(CAMERA_ROOT)/config/camera.conf),)include$(CAMERA_ROOT)/config/camera.confLINUX_INC+=-include$(CAMERA_ROOT)/config/camera.hendif```-检查`camera.conf`文件是否存在(使用`wildcard`函数)。-如果存在,则包含该配置文件(`include`指令)。-同时,将`camera.h`头文件作为强制包含(`-include`)添加到`LINUX_INC`中。---```makefileccflags-y+=$(LINUX_INC)```-将`LINUX_INC`中的头文件路径追加到`ccflags-y`变量。`ccflags-y`是内核构建系统中用于向所有模块传递编译标志的变量(如`-I`路径)。---```makefileifeq($(callcc-option-yn,-Wmaybe-uninitialized),y)EXTRA_CFLAGS+=-Wmaybe-uninitializedendif```-使用`cc-option-yn`函数检查编译器是否支持`-Wmaybe-uninitialized`选项(用于警告可能未初始化的变量)。-如果支持(返回`y`),则将`-Wmaybe-uninitialized`添加到`EXTRA_CFLAGS`。---```makefileifeq($(callcc-option-yn,-Wheader-guard),y)EXTRA_CFLAGS+=-Wheader-guardendif```-同样,检查编译器是否支持`-Wheader-guard`(用于检查头文件保护宏)。-如果支持,则添加到`EXTRA_CFLAGS`。---```makefileobj-m+=regulator/obj-m+=lens/obj-m+=flashlight/v4l2/obj-m+=thermal/```-将多个子目录添加到`obj-m`变量中,表示这些目录下的代码将被编译为可加载内核模块.ko文件)。每个子目录下应该有自己的Kbuild/Makefile来定义具体的模块。---###文件2:Makefile```makefile#SPDX-License-Identifier:GPL-2.0-only#Copyright(C)2018-2022Oplus.Allrightsreserved.```-注释:声明许可证(GPL-2.0-only)和版权信息。---```makefileifneq($(wildcard$(KERNEL_SRC)/android/abi_gki_aarch64.stg),)BOOT_MIXED_BUILD=trueendif```-检查内核源码目录下是否存在文件`android/abi_gki_aarch64.stg`(该文件可能与GKI(GenericKernelImage)相关)。-如果存在,则设置变量`BOOT_MIXED_BUILD=true`(可能表示启用混合构建模式)。---```makefileKBUILD_OPTIONS+=DFT_ROOT=$(KERNEL_SRC)/$(M)```-向`KBUILD_OPTIONS`变量追加一个选项:`DFT_ROOT=$(KERNEL_SRC)/$(M)`。这可能是设置一个自定义的根路径(`DFT_ROOT`)为内核源码路径下的当前模块路径(`M`是当前Makefile所在的目录)。---```makefileKBUILD_OPTIONS+=MODNAME?=dft_dlkm```-向`KBUILD_OPTIONS`追加`MODNAME?=dft_dlkm`。`MODNAME`用于指定模块名称,这里默认设置为`dft_dlkm`(如果未定义则使用此值)。---```makefileifneq($(wildcard$(KERNEL_SRC)/$(DEVICE_MODULES_REL_DIR)/Makefile.include),)include$(KERNEL_SRC)/$(DEVICE_MODULES_REL_DIR)/Makefile.includeendif```-检查设备模块的相对路径下是否存在`Makefile.include`文件。-如果存在,则包含该文件(可能包含设备特定的构建规则或变量)。---```makefileall:EXTRA_SYMBOLS+=$(extra_symbols)```-扩展`all`目标的依赖:在构建`all`时,将变量`extra_symbols`的值追加到`EXTRA_SYMBOLS`变量中。`EXTRA_SYMBOLS`用于指定模块依赖的外部符号表文件(用于解决模块间的符号依赖)。---```makefileall:$(MAKE)-C$(KERNEL_SRC)M=$(M)modules$(KBUILD_OPTIONS)KBUILD_EXTRA_SYMBOLS="$(EXTRA_SYMBOLS)"```-`all`目标的命令:调用内核构建系统来编译模块。-`-C$(KERNEL_SRC)`:切换到内核源码目录。-`M=$(M)`:告诉内核构建系统,模块的源码位于当前目录(`M`是调用make时传递的变量,通常是当前路径)。-`modules`:指定目标为编译模块。-`$(KBUILD_OPTIONS)`:传递额外的构建选项。-`KBUILD_EXTRA_SYMBOLS="$(EXTRA_SYMBOLS)"`:传递额外的符号表文件路径(用于模块符号解析)。---```makefilemodules_install:$(MAKE)INSTALL_MOD_STRIP=1-C$(KERNEL_SRC)M=$(M)modules_install```-`modules_install`目标:安装编译好的模块。-`INSTALL_MOD_STRIP=1`:在安装时剥离调试符号(减小模块大小)。-`modules_install`:安装模块到系统默认模块目录(通常是`/lib/modules/$(KERNELRELEASE)/`)。---```makefile%:$(MAKE)-C$(KERNEL_SRC)M=$(M)$@$(KBUILD_OPTIONS)```-通配符目标(`%`):匹配任何未明确指定的目标,然后将该目标传递给内核构建系统。例如,执行`makeclean`会匹配到此规则并执行`clean`目标。---```makefileclean:rm-f*.o*.ko*.mod.c*.mod.o*~.*.cmdModule.symversrm-rf.tmp_versions```-`clean`目标:删除当前目录下编译生成的文件和临时目录。-删除所有目标文件(`.o`)、内核模块(`.ko`)、中间文件(`.mod.c`,`.mod.o`)、备份文件(`*~`)、命令文件(`.*.cmd`)和符号文件(`Module.symvers`)。-删除临时目录`.tmp_versions`(用于存储模块版本信息)。---###总结-**Kbuild文件**:主要用于配置模块的编译环境(头文件路径、宏定义等),并指定要编译的子目录。-**Makefile**:定义如何调用内核构建系统来编译、安装和清理模块。它利用内核的构建规则(`kbuild`)来简化模块的构建过程。这两个文件共同工作,确保模块能够正确地与内核一起编译,并处理了设备特定的配置和符号依赖。---§§相关问题§§:1.内核模块构建中`obj-m`和`obj-y`的区别是什么?2.在Kbuild系统中,`ccflags-y`和`EXTRA_CFLAGS`有何不同?3.如何在内核模块中处理多个源文件生成一个模块?4.内核模块安装时`INSTALL_MOD_STRIP=1`的作用是什么?</think>### 逐行解析 Kbuild 文件 ```makefile TOP := $(srctree)/.. ``` - 定义 `TOP` 变量为内核源码树 (`srctree`) 的上一级目录 - `srctree` 是内核构建系统定义的变量,指向内核源码根目录 ```makefile CAMERA_ROOT=$(TOP)/vendor/oplus/kernel/camera ``` - 设置摄像头相关代码的根路径 ```makefile ifeq ($(DEVICE_MODULES_PATH),) DEVICE_MODULES_PATH = $(srctree) else LINUXINCLUDE := $(DEVCIE_MODULES_INCLUDE) $(LINUXINCLUDE) endif ``` - 检查 `DEVICE_MODULES_PATH` 是否已定义 - 如果未定义,将其设置为内核源码根目录 - 如果已定义,将设备模块包含路径添加到 `LINUXINCLUDE` (注意:`DEVCIE` 疑似拼写错误) ```makefile LINUX_INC += -Iinclude/linux \ -Iinclude/linux/drm \ -Iinclude/linux/gunyah \ -Iinclude/linux/gunyah \ # 重复项,可能是冗余 -Iinclude ``` - 添加内核头文件包含路径到 `LINUX_INC` 变量 - `-I` 标志指定编译器搜索头文件的路径 ```makefile CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \ -DANI_LITTLE_BIT_ENDIAN \ -DDOT11F_LITTLE_ENDIAN_HOST \ -DANI_COMPILER_TYPE_GCC \ -DANI_OS_TYPE_ANDROID=6 \ -DPTT_SOCK_SVC_ENABLE \ -Wall \ -Werror \ -D__linux__ ``` - 添加预处理器宏定义和编译选项: - 字节序定义 (小端) - 编译器类型 (GCC) - 操作系统类型 (Android 6) - 启用特定功能 - 警告选项 (`-Wall` 显示所有警告,`-Werror` 将警告视为错误) - 平台宏定义 (`__linux__`) ```makefile KBUILD_CPPFLAGS += $(CDEFINES) ``` - 将自定义宏定义添加到内核构建系统的 C 预处理器标志 ```makefile ifneq ($(wildcard $(CAMERA_ROOT)/config/camera.conf),) include $(CAMERA_ROOT)/config/camera.conf LINUX_INC += -include $(CAMERA_ROOT)/config/camera.h endif ``` - 检查摄像头配置文件是否存在 - 如果存在则包含该配置文件 - 强制包含摄像头头文件 (`-include`) ```makefile ccflags-y += $(LINUX_INC) ``` - 将头文件包含路径添加到模块编译标志 - `ccflags-y` 是内核构建系统中用于模块编译的标志 ```makefile ifeq ($(call cc-option-yn, -Wmaybe-uninitialized),y) EXTRA_CFLAGS += -Wmaybe-uninitialized endif ``` - 检查编译器是否支持 `-Wmaybe-uninitialized` 选项 - 如果支持则添加该警告标志 ```makefile ifeq ($(call cc-option-yn, -Wheader-guard),y) EXTRA_CFLAGS += -Wheader-guard endif ``` - 检查编译器是否支持 `-Wheader-guard` 选项 - 如果支持则添加该头文件保护检查标志 ```makefile obj-m += regulator/ obj-m += lens/ obj-m += flashlight/v4l2/ obj-m += thermal/ ``` - 声明要构建的内核模块目录 - `obj-m` 告诉构建系统这些目录包含要编译为可加载模块的代码 --- ### 逐行解析 Makefile ```makefile # SPDX-License-Identifier: GPL-2.0-only # Copyright (C) 2018-2022 Oplus. All rights reserved. ``` - 许可证声明 (GPL-2.0-only) - 版权信息 ```makefile ifneq ($(wildcard $(KERNEL_SRC)/android/abi_gki_aarch64.stg),) BOOT_MIXED_BUILD=true endif ``` - 检查是否存在 Android GKI (Generic Kernel Image) 相关文件 - 如果存在则设置混合构建标志 ```makefile KBUILD_OPTIONS+= DFT_ROOT=$(KERNEL_SRC)/$(M) ``` - 添加构建选项,定义模块根目录路径 - `DFT_ROOT` 可能是项目特定的变量名 ```makefile KBUILD_OPTIONS += MODNAME?=dft_dlkm ``` - 设置默认模块名称 (dft_dlkm) - `?=` 表示仅在未定义时赋值 ```makefile ifneq ($(wildcard $(KERNEL_SRC)/$(DEVICE_MODULES_REL_DIR)/Makefile.include),) include $(KERNEL_SRC)/$(DEVICE_MODULES_REL_DIR)/Makefile.include endif ``` - 检查设备特定的 Makefile 是否存在 - 如果存在则包含它 ```makefile all: EXTRA_SYMBOLS += $(extra_symbols) ``` - 扩展 `all` 目标,添加额外的符号表文件 - 用于解决模块间的符号依赖 ```makefile all: $(MAKE) -C $(KERNEL_SRC) M=$(M) modules $(KBUILD_OPTIONS) KBUILD_EXTRA_SYMBOLS="$(EXTRA_SYMBOLS)" ``` - 主要构建目标: - `-C $(KERNEL_SRC)` 切换到内核源码目录 - `M=$(M)` 指定外部模块路径 - `modules` 构建目标 - 传递自定义选项和额外符号表 ```makefile modules_install: $(MAKE) INSTALL_MOD_STRIP=1 -C $(KERNEL_SRC) M=$(M) modules_install ``` - 模块安装目标: - `INSTALL_MOD_STRIP=1` 去除调试信息以减小模块大小 - 安装到标准模块目录 ```makefile %: $(MAKE) -C $(KERNEL_SRC) M=$(M) $@ $(KBUILD_OPTIONS) ``` - 通配符目标:将任何未定义的目标传递给内核构建系统 - 例如 `make clean` 会调用内核的 clean 目标 ```makefile clean: rm -f *.o *.ko *.mod.c *.mod.o *~ .*.cmd Module.symvers rm -rf .tmp_versions ``` - 自定义清理目标: - 删除所有编译生成的文件 - 删除临时目录 - 比内核默认清理更彻底 ### 关键机制总结 1. **分层构建**: - 顶层 Makefile 调用内核构建系统 - Kbuild 文件配置模块级编译选项 - 子目录包含各自的构建定义 2. **自定义处理**: - 设备特定配置 (`DEVICE_MODULES_PATH`) - 摄像头特殊处理 (`CAMERA_ROOT`) - 编译器能力检测 (`cc-option-yn`) 3. **符号处理**: - `KBUILD_EXTRA_SYMBOLS` 解决模块间依赖 - `Module.symvers` 文件记录模块符号 4. **Android 集成**: - GKI 检测 (`abi_gki_aarch64.stg`) - Android 特定宏定义 (`ANI_OS_TYPE_ANDROID=6`) 5. **优化选项**: - 安装时去除调试信息 (`INSTALL_MOD_STRIP=1`) - 严格编译检查 (`-Werror -Wall`) ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值