GCC
GCC概述GCC(GNU Compiler Collection)是由 GNU 开发的编程语言编译器。 GCC最初代表GNU C Compiler,当时只支持C语言。 后来又扩展能够支持更多编程语言,包括 C++、Fortran 和 Java 等。 因此,GCC也被重新定义为GNU Compiler Collection,成为历史上最优秀的编译器, 其执行效率与一般的编译器相比平均效率要高 20%~30%。 GCC编译工具链GCC编译工具链(toolchain),是指以GCC编译器为核心的一整套工具。它主要包含以下三部分内容: gcc-core:即GCC编译器,用于完成预处理和编译过程,把C代码转换成汇编代码。 Binutils :除GCC编译器外的一系列小工具包括了链接器ld,汇编器as、目标文件格式查看器readelf等。 glibc:包含了主要的C语言标准函数库,C语言中常常使用的打印函数printf、malloc函数就在glibc 库中。 在很多场合下会直接用GCC编译器来指代整套GCC编译工具链。 Binutils工具集Binutils(bin...
构建系统
构建系统概述一个 ESP-IDF 项目可以看作是多个不同组件的集合,例如一个显示当前湿度的网页服务器会包含以下组件: ESP-IDF 基础库,包括 libc、ROM bindings 等 Wi-Fi 驱动 TCP/IP 协议栈 FreeRTOS 操作系统 网页服务器 湿度传感器的驱动 负责将上述组件整合到一起的主程序 ESP-IDF 可以显式地指定和配置每个组件。在构建项目的时候,构建系统会前往 ESP-IDF 目录、项目目录和用户自定义组件目录(可选)中查找所有组件,允许用户通过文本菜单系统配置 ESP-IDF 项目中用到的每个组件。在所有组件配置结束后,构建系统开始编译整个项目。 构建系统使用idf.pyidf.py 命令行工具提供了一个前端,可以帮助你轻松管理项目的构建过程,它管理了以下工具: CMake,配置待构建的项目 Ninja,用于构建项目 esptool.py,烧录目标硬件设备 可通过 idf.py 配置构建系统,具体可参考相关文档。 直接使用 CMake为了方便,idf.py 已经封装了 CMake 命令,但是你愿意,也可以直接调用...
CMake
CMake概述CMake 是一个开源的跨平台构建工具,用于自动化管理软件编译过程。它通过简单的配置文件(CMakeLists.txt)生成标准的构建文件(如 Makefile、Visual Studio 项目等),从而简化跨平台项目的构建流程。以下是 CMake 的核心特性和使用场景: 核心功能: 跨平台支持:可在 Windows、Linux、macOS 等系统上生成对应平台的构建文件(如 Makefile、Ninja、Xcode 项目等)。 模块化配置:通过 CMakeLists.txt 定义项目结构、依赖关系和编译规则。 依赖管理:支持查找系统或第三方库(如 OpenSSL、Boost),并自动集成到项目中。 灵活扩展:提供脚本语言(CMake Language)支持条件判断、循环、函数等高级逻辑。 测试与打包:集成 CTest 进行单元测试,CPack 生成安装包(如...
Makefile
Makefile概述Makefile是用于管理项目构建过程的工具,它定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至进行更复杂的功能操作。 目标Target:需要生成的文件,例如可执行文件或中间目标文件(如.o文件)。 依赖Dependencies:生成目标所依赖的文件或其他目标。这些依赖项在执行目标命令之前必须存在。 命令Commands:构建目标时需要执行的命令,这些命令必须以Tab键开头。 Makefile通过规则和指令来描述整个项目的构建过程,这些规则和指令告诉make工具如何编译和链接源文件以生成最终的可执行文件。 语法规则格式Makefile里面是由一系列的规则组成的,这些规则格式如下: 1234目标...: 依赖文件集合... 命令 1 命令 2 ..... 比如: 12main.exe: main.o input.o calcu.o gcc -o main.exe main.o input.o...
Shell脚本
Shell脚本概述Shell脚本类似windows的批处理文件,shell脚本就是将连续执行的命令写成一个文件。 shell脚本是一个纯文本文件,命令从上而下开始执行。shell脚本拓展名为.sh。 基本用法 创建脚本文件:使用文本编辑器创建一个新的文本文件,并编写Shell脚本代码。 shell脚本的第一行一定要为: 1#!/bin/bash 它告诉系统这个脚本应该使用哪个解释器来执行,表示使用bash解释器执行。 赋予执行权限:为了使脚本文件能够被执行,需要为其赋予执行权限。可以使用chmod命令来修改文件权限, 1user@DESKTOP-KFNQORU:~$ chmod +x script.sh。 运行脚本:通过Shell解释器来运行脚本文件。 1user@DESKTOP-KFNQORU:~$ ./script.sh 基本语法例子123456#!/bin/bashecho "hello world"user@DESKTOP-KFNQORU:~$ ./test.sh hello...
链接脚本
链接脚本概述链接脚本(Linker Script)是用于指导链接器(Linker)如何将程序的不同部分(如代码、数据、库等)组织到最终可执行文件或库文件中的文件。链接器在编译过程的最后阶段运行,负责将各个目标文件(.o 文件)和库文件链接在一起,生成最终的可执行文件。链接脚本提供了对最终生成文件布局的精细控制。 基本结构链接脚本通常包含以下几个部分: OUTPUT_FORMAT指定输出文件的格式,如 ELF、COFF 等。 ENTRY指定程序的入口点,通常是程序的起始函数,如 main 或 _start。 SECTIONS定义输出文件的内存布局,包括各个段的名称、属性和内容。SECTIONS 部分是链接脚本的核心,它定义了程序的内存布局。以下是一些基本的语法和要素: 段名在链接脚本(Linker Script)的 SECTIONS 部分中,段名(section...
进程调度
...
进程通信
进程通信概述进程间通信(IPC)是指两个进程之间产生数据交互。 为什么进程需要操作系统支持进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立。 为了保证安全,一个进程不能直接访问另一个进程的地址空间。 共享存储为了避免出错。各个进程对共享空间的访问应该是互斥的。各个进程可使用的操作系统内核提供的同步互斥工具。(如P,V操作) 共享存储分为基于数据结构的共享: 基于数据结构的共享:比如共享空间里只能放一个长度为10的数组。这种共享方式速度慢、限制多,是一种低级通信方式。 基于存储区的共享:操作系统在内存中划出一块共享存储区,数据的形式,存放的位置都由通信进程控制,而不是操作系统。这种共享方式的速度很快,是一种高级通信方式。 消息传递进程间的数据交换以格式化的信息为单位。进程通过操作系统提供的发送消息/接收消息两个原语进行数据交换。 直接通信方式 进程P向进程Q直接发送消息: 进程P先将向进程Q发送的数据封装为一个Message 进程P执行发送原语:Send(Q,...
进程控制
...
Crow网络库
Crow网络库概述Crow是一个用于创建HTTP或Websocket web服务的c++框架。它使用类似于Python的Flask的路由,这使得它易于使用。它的速度也非常快,击败了多个现有的c++框架和非c++框架。 网络通信原理CrowCpp的底层网络通信原理以异步事件驱动模型为核心,结合现代C++特性和高性能网络库设计,其核心机制可拆解如下: 基于Boost.Asio的异步I/O模型CrowCpp的通信层深度依赖Boost.Asio库,采用非阻塞异步I/O多路复用技术实现高并发处理。其工作流程包括: 事件循环(Event Loop):主线程通过Asio的io_context管理事件队列,监听套接字的读写事件,避免传统同步模型中的线程阻塞。 回调机制:当I/O事件(如连接请求、数据到达)触发时,Asio自动调用注册的回调函数处理请求,例如解析HTTP报文或生成响应。 零拷贝优化:在数据收发过程中,通过缓冲区复用减少内存拷贝,提升吞吐量(实测单线程可达12,000...