当前位置: 首页 > news >正文

嵌入式 C 编程必备(7):const 关键字 —— 打造稳定的常量空间

目录

一、const关键字的基本含义与用法

1.1. 修饰基本数据类型

1.2. 修饰指针

1.3. 修饰数组

1.4. 修饰结构体

二、const关键字在嵌入式编程中的优势

2.1. 提升代码可读性

2.2. 增强代码安全性

2.3. 优化内存使用

2.4. 促进模块化设计

2.5. 支持静态分析和测试

三、const关键字在嵌入式编程中的实际应用

3.1 配置参数

3.2. 固定数组

3.3. 状态机

3.4. 其他应用

3.5. 注意事项

四、使用const关键字时的注意事项

4.1. 编译器差异

4.2. 与其他关键字的组合使用

4.3. 避免过度使用

4.4. 编译和链接时的注意事项

五、结论


在嵌入式 C 编程领域,代码的稳定性、可靠性和资源的有效利用至关重要。而const关键字就像是一位忠诚的守护者,为常量数据提供了安全稳定的栖息之所,帮助程序员避免许多潜在的错误,同时优化代码的性能和可读性。

一、const关键字的基本含义与用法

const是C语言中的一个重要修饰符,其主要功能是将一个变量声明为常量。这意味着被const修饰的变量在初始化后,其值将不可被更改。这一特性在嵌入式C编程中尤为重要,因为它有助于开发者清晰地界定哪些数据是固定不变的,从而有效避免潜在的错误和误操作。

在嵌入式C编程实践中,const关键字的应用范围广泛,它可以修饰基本数据类型、指针、数组以及结构体等多种数据类型。

1.1. 修饰基本数据类型

const修饰基本数据类型(如int、float、char等)时,该类型的变量将成为常量,其值在初始化后将无法被更改。例如:

const int MAX_SIZE = 100; // 声明一个整型常量,表示最大尺寸

1.2. 修饰指针

const也可以修饰指针,但需要注意指针的指向和指针所指向的内容是否可以被修改。例如:

  • 指向常量的指针(指针所指向的内容不可修改):
const int *ptr = &x; // ptr是一个指向int型常量的指针,不能通过ptr修改x的值
  • 常量指针(指针本身的地址不可修改,但所指向的内容可以修改): 
int x = 10;
int *const cptr = &x; // cptr是一个常量指针,其值(即地址)不可修改,但可以通过cptr修改x的值
  • 指向常量的常量指针(指针本身的地址和所指向的内容都不可修改):
const int x = 10;
const int *const ccptr = &x; // ccptr是一个指向int型常量的常量指针,既不能修改其值(地址),也不能通过ccptr修改x的值

1.3. 修饰数组

const修饰数组时,数组中的所有元素都将变为常量,其值在初始化后将无法被更改。例如:

const char str[] = "Hello, World!"; // 声明一个字符数组常量,其值不可修改

1.4. 修饰结构体

const同样可以修饰结构体,此时结构体的所有成员都将被视为常量,其值在初始化后将无法被更改。例如:

typedef struct {int id;const char *name; // 注意:这里的name是指向字符常量的指针,而不是字符数组常量
} Person;const Person person = {1, "John Doe"}; // 声明一个结构体常量,其成员id和name的值都不可修改
// 注意:虽然name是指向字符常量的指针,但person结构体本身被声明为const,因此不能修改person.id的值,也不能让person.name指向另一个字符串

在嵌入式C编程中,合理使用const关键字不仅可以提高代码的可读性和可维护性,还能有效防止关键数据的意外修改,从而确保系统的稳定性和安全性。

二、const关键字在嵌入式编程中的优势

2.1. 提升代码可读性

使用const关键字可以明确标识出那些不应该被修改的变量。这种明确的声明方式有助于其他开发者在阅读代码时快速理解变量的用途和限制,从而避免不必要的误操作。在嵌入式编程中,代码的可读性尤为重要,因为系统的复杂性和紧凑性往往使得代码难以理解和维护。const关键字的使用可以大大简化这一过程,使代码更加清晰易懂。

2.2. 增强代码安全性

在嵌入式系统中,数据的一致性和安全性是系统稳定运行的基础。使用const关键字可以有效地防止关键数据被意外修改,从而避免潜在的系统崩溃、数据丢失或数据不一致等严重后果。这对于保证系统的可靠性和稳定性至关重要。

2.3. 优化内存使用

编译器在处理const变量时,通常会将其存储在只读内存区域(如ROM),而不是可读写内存区域(如RAM)。这一特性在资源受限的嵌入式系统中尤为重要,因为它可以帮助开发者更有效地利用有限的内存资源。通过将常量数据存储在ROM中,可以节省宝贵的RAM空间,从而提高系统的整体性能和稳定性。

2.4. 促进模块化设计

在嵌入式系统设计中,模块化设计是一种常见且有效的设计策略。使用const关键字可以更容易地实现模块化设计,因为它允许开发者将常量数据封装在模块内部,从而避免全局变量的滥用和潜在的命名冲突。这种封装方式有助于提高代码的可重用性和可维护性。

2.5. 支持静态分析和测试

使用const关键字还可以支持静态代码分析和测试工具的使用。这些工具可以自动检测代码中潜在的错误和漏洞,包括那些与常量数据修改相关的错误。通过结合这些工具的使用,开发者可以更加高效地识别和修复代码中的问题,从而提高系统的整体质量和可靠性。

const关键字在嵌入式编程中具有诸多优势,包括提升代码可读性、增强代码安全性、优化内存使用、促进模块化设计以及支持静态分析和测试等。因此,在嵌入式编程中合理使用const关键字对于提高代码质量和系统性能具有重要意义。

三、const关键字在嵌入式编程中的实际应用

在嵌入式编程中,const关键字具有广泛的应用,它不仅可以提高代码的可读性和可维护性,还可以防止意外的数据修改,从而提高系统的稳定性和安全性。

3.1 配置参数

在嵌入式系统中,配置参数(如波特率、时钟频率、中断优先级等)通常是固定的,不应在运行时被修改。使用const关键字将这些参数声明为常量,可以确保它们在编译时被确定,并且在整个系统运行过程中保持不变。这样做的好处包括:

  • 防止意外修改:防止程序员或恶意代码在运行时修改这些关键参数。
  • 优化:编译器可以对常量进行优化,例如将它们存储在只读存储区(ROM)中,从而减少RAM的使用。
  • 提高可读性:明确标识哪些参数是固定的,有助于其他程序员理解代码。
// 定义配置参数为常量
#define BAUD_RATE 9600
const uint32_t CLOCK_FREQUENCY = 48000000UL;  // 48 MHz
const uint8_t INTERRUPT_PRIORITY = 2;// 使用配置参数
void configureUART(void) {// 假设有一个设置波特率的函数setBaudRate(BAUD_RATE);// 其他UART配置...
}

3.2. 固定数组

嵌入式编程中经常需要使用固定大小的数组来存储一些不变的数据,如设备ID、错误代码表、配置字符串等。使用const关键字声明这些数组,可以确保它们的内容不会被意外修改:

  • 保护数据完整性:防止数组内容被误改,导致系统不稳定或行为异常。
  • 节省资源:如果数组内容在编译时是已知的,编译器可能会将它们存储在ROM中,而不是RAM中,从而节省宝贵的RAM资源。
// 定义固定数组为常量
const char DEVICE_ID[] = "ABC123";
const int ERROR_CODES[] = {0, -1, -2, -3, -4};  // 假设这些代表不同的错误// 使用固定数组
void printDeviceID(void) {printf("Device ID: %s\n", DEVICE_ID);
}int getErrorCode(int index) {if (index >= 0 && index < sizeof(ERROR_CODES) / sizeof(ERROR_CODES[0])) {return ERROR_CODES[index];} else {// 处理无效索引return -1;  // 或者其他错误码}
}

3.3. 状态机

在嵌入式系统的状态机设计中,状态变量通常表示系统当前所处的状态,如启动、运行、空闲、错误等。这些状态是固定的,不应被随意改变。使用const关键字将这些状态变量声明为常量,可以带来以下好处:

  • 提高可读性:使用有意义的常量名代替数字或魔数,使代码更加清晰易懂。
  • 防止错误:避免由于状态值被错误地修改而导致的系统行为异常。
  • 便于调试:在调试过程中,可以更容易地识别和理解系统的当前状态。
// 定义状态变量为常量
typedef enum {STATE_STARTUP,STATE_RUNNING,STATE_IDLE,STATE_ERROR
} SystemState;// 当前系统状态
const SystemState currentState = STATE_IDLE;  // 注意:在实际应用中,这个变量通常不会是const,// 但状态值本身(如STATE_IDLE)应该是const。// 这里为了演示,我们暂时将其设为const。// 状态机处理函数
void stateMachine(void) {switch (currentState) {case STATE_STARTUP:// 执行启动操作// 可能改变状态到STATE_RUNNING或其他状态break;case STATE_RUNNING:// 执行运行操作// 可能改变状态到STATE_IDLE或STATE_ERRORbreak;case STATE_IDLE:// 执行空闲操作// 可能改变状态到STATE_RUNNINGbreak;case STATE_ERROR:// 处理错误// 可能改变状态到STATE_STARTUP(重启)或其他状态break;default:// 处理未知状态break;}
}// 注意:在实际应用中,`currentState`变量通常会在状态机处理过程中被修改。
// 因此,上面的`currentState`被声明为`const`仅用于演示状态值本身是常量。
// 在实际代码中,应该去掉`const`修饰符,并在`stateMachine`函数内部根据需要修改`currentState`的值。

3.4. 其他应用

除了上述应用外,const关键字在嵌入式编程中还有以下一些常见的应用:

  • 函数参数:将函数参数声明为const,表明函数不会修改这些参数的内容。这有助于编译器进行更好的优化,并防止函数内部意外修改参数。
  • 返回值:将函数的返回值声明为const(对于指针或引用返回类型),表明返回的数据不应被修改。这有助于保护数据的完整性。
  • 宏定义:虽然宏定义本身不是const的一种应用,但使用const代替宏定义(在可能的情况下)可以带来更好的类型检查和调试信息。
// 函数参数为const
void printMessage(const char *message) {printf("%s\n", message);// 注意:这里不能修改`message`指向的内容,因为它是const。
}// 返回值为const指针(指向不可修改的数据)
const char* getGreeting(void) {static const char greeting[] = "Hello, World!";return greeting;
}

3.5. 注意事项

  • 在实际嵌入式编程中,const修饰的变量或数据通常会被存储在ROM中(如果编译器和链接器支持并且配置正确)。
  • 在某些情况下,即使使用const修饰符,也可能需要通过特定的编译器指令或链接器脚本来确保数据被正确地放置在ROM中。
  • 对于状态机中的状态变量,通常不会将整个变量声明为const,而是将状态值(如枚举成员)声明为const,并在状态机处理过程中修改状态变量的值。
  • 使用const可以提高代码的可读性和安全性,但也要注意不要过度使用,以免增加不必要的复杂性或限制代码的灵活性。 

const关键字在嵌入式编程中具有广泛的应用价值,它不仅可以提高代码的可读性和可维护性,还可以防止意外的数据修改,从而提高系统的稳定性和安全性。因此,在嵌入式编程中应充分利用const关键字来声明常量、固定数组和状态变量等。

四、使用const关键字时的注意事项

在嵌入式编程中,const关键字的使用能够显著提高代码的可读性、可维护性和安全性。然而,要充分发挥其作用,开发者需要注意以下几个方面。

4.1. 编译器差异

不同的编译器在处理const变量时可能存在细微的差异。这些差异可能涉及const变量的存储位置(如ROM或RAM)、优化策略以及与其他关键字的交互方式。因此,开发者需要了解并遵循所用编译器的具体规范。在迁移代码或在不同编译器之间切换时,这一点尤为重要。

4.2. 与其他关键字的组合使用

在嵌入式C编程中,const关键字可以与其他关键字如volatilestatic等组合使用。然而,这种组合使用需要谨慎处理:

  • const volatile:这种组合表示变量是只读的,但其值可能会因为外部因素(如硬件事件)而发生变化。在嵌入式系统中,这种变量通常用于访问硬件寄存器。
  • static const:这种组合表示变量在编译时是固定的,且在程序的整个生命周期内保持不变。它通常用于定义全局常量或函数内部的静态常量。

开发者需要明确这些组合的含义,并避免产生意外的副作用。例如,错误地将const volatile变量视为普通const变量可能会导致程序行为异常。

4.3. 避免过度使用

虽然const关键字有助于提升代码的可读性和安全性,但过度使用可能会增加代码的复杂性,甚至限制代码的灵活性。例如,将过多变量声明为const可能会使代码难以调试和修改。因此,开发者需要权衡const的使用与代码的可维护性之间的关系。

在实际应用中,开发者应根据具体情况决定是否使用const。对于那些确实不应该在运行时被修改的变量(如配置参数、固定数组等),应毫不犹豫地使用const进行声明。而对于那些可能在未来需要修改或优化的变量,则应谨慎考虑是否使用const

4.4. 编译和链接时的注意事项

在编译和链接过程中,开发者需要确保const变量被正确地放置在ROM中(如果这是所需的行为)。这通常涉及编译器选项和链接器脚本的配置。例如,某些编译器可能需要特定的指令或属性来指示将const数据存储在ROM中。开发者需要查阅编译器的文档以了解如何正确配置这些选项。

此外,当使用多个源文件时,开发者还需要注意const变量的作用域和链接性。对于需要在多个文件中共享的const变量,应使用extern关键字进行声明,并在一个源文件中进行定义。

在使用const关键字时,开发者需要综合考虑编译器的差异、与其他关键字的组合使用、避免过度使用以及编译和链接时的注意事项。通过谨慎和明智地使用const,开发者可以编写出更加健壮、可维护和安全的嵌入式代码。

五、结论

在嵌入式C编程的广阔领域中,const关键字无疑扮演了一个举足轻重的角色。它不仅是一个语言特性,更是提升代码质量、增强系统稳定性的有力工具。通过精心运用const关键字,我们能够在嵌入式系统开发中取得显著的成效。

首先,const关键字极大地提升了代码的可读性。它明确指出了哪些变量在程序运行过程中不应被修改,从而帮助开发者更快地理解代码逻辑,减少因误修改变量而导致的错误。这种明确的指示对于团队协作和代码维护尤为重要,因为它降低了沟通成本,减少了潜在的误解。

其次,const关键字增强了代码的安全性。在嵌入式系统中,资源往往有限,且对实时性要求较高。通过const关键字保护关键数据,我们可以防止因意外修改而导致的系统崩溃或不稳定。这对于确保系统的稳定运行至关重要。

此外,const关键字还有助于提升系统的可靠性。在嵌入式系统中,硬件和软件的交互非常频繁。通过const关键字定义与硬件相关的常量,我们可以确保这些值在软件生命周期内保持不变,从而减少了因硬件变化而导致的软件兼容性问题。

综上所述,const关键字在嵌入式C编程中发挥着不可或缺的作用。它不仅是提升代码质量的关键要素,更是构建健壮、可靠嵌入式系统的基石。因此,我们应该在嵌入式C编程中充分利用const关键字的优势,为系统设计和维护带来更大的便利。通过不断学习和实践,我们可以更加熟练地掌握这一工具,为嵌入式系统的发展贡献自己的力量。

相关文章:

嵌入式 C 编程必备(7):const 关键字 —— 打造稳定的常量空间

目录 一、const关键字的基本含义与用法 1.1. 修饰基本数据类型 1.2. 修饰指针 1.3. 修饰数组 1.4. 修饰结构体 二、const关键字在嵌入式编程中的优势 2.1. 提升代码可读性 2.2. 增强代码安全性 2.3. 优化内存使用 2.4. 促进模块化设计 2.5. 支持静态分析和测试 三、…...

电脑显示没信号显示屏不亮怎么办?电脑没信号解决方法

电脑没信号显示屏不亮这种故障的原因可能有多种&#xff0c;例如显示器的供电、连接、设置等问题&#xff0c;或者电脑的显卡、内存、硬盘、主板等硬件问题。所以我们想要解决这个问题&#xff0c;也是需要多方面排除找到具体原因然后进行修复。下面将为大家介绍一些常见的电脑…...

C++零基础入门:运算符与表达式详解 —— 树莓派Pico编程应用

C语言作为信息学奥赛的指定语言&#xff0c;广泛应用于嵌入式开发、系统编程、游戏开发等领域。对于初学者而言&#xff0c;掌握基本的运算符和表达式是进行编程的基础&#xff0c;而这些基础知识能够帮助你解决各种实际问题。本文将带你深入理解C中的运算符与表达式&#xff0…...

mvc命令

命令 mvc MVC(Model-View-Controller)是一种软件架构模式,用于组织和管理应用程序的代码mvc重要的三部分 (1)‌模型&#xff08;Model&#xff09;‌&#xff1a;负责存储系统的中心数据&#xff0c;提供访问数据的函数&#xff0c;封装了应用程序的功能内核。 (2)视图&…...

Kafka-创建topic源码

一、命令创建topic kafka-topics --create --topic quickstart-events --bootstrap-server cdh1:9092 --partitions 2 --replication-factor 2 二、kafka-topics脚本 exec $(dirname $0)/kafka-run-class.sh org.apache.kafka.tools.TopicCommand "$" 脚本中指定了…...

如何开展单元测试

1、是什么 单元测试&#xff08;Unit Testing&#xff09;又称为模块测试&#xff0c;是针对程序模块来进行正确性检验的测试工作。 程序模块是软件设计的最小单位&#xff0c;程序单元是应用的最小可测试部件 • 在面向过程编程中&#xff0c;一个单元就是单个程序、函数、过…...

网络练级宝典-> UDP传输层协议

目录 传输层 端口号 端口号和进程的关系 UDP协议 UDP协议格式 UDP数据封装&#xff1a; UDP数据分用&#xff1a; 面向数据报 UDP的缓冲区 UDP的缺点 基于UDP的应用层协议 传输层 端口号 我们知道端口号对应的其实就是一个进程的pid&#xff0c;在操作系统中二者的…...

【Elasticsearch】07-ES聚合

1. 桶 桶&#xff08;Bucket&#xff09;聚合&#xff1a;用来对文档做分组 TermAggregation&#xff1a;按照文档字段值分组&#xff0c;例如按照品牌值分组、按照国家分组Date Histogram&#xff1a;按照日期阶梯分组&#xff0c;例如一周为一组&#xff0c;或者一月为一组…...

Unity 画线(UILineRenderer)

实现 以鼠标点击点作为起点创建UILineRenderer 并记录起点。 GameObject go new GameObject(); go.transform.parent transPaint; go.transform.localPosition Vector3.zero; line go.AddComponent<UILineRenderer>(); line.LineWidth widthLine; line.color col…...

【Linux测试题】

1. 选择题 题目&#xff1a; 如果想将电脑中Windows C盘&#xff08;hd1&#xff09;安装在Linux文件系统的/winsys目录下&#xff0c;请问正确的命令是&#xff08;&#xff09;。 选项&#xff1a; A. root104.123.123.123:~# mount dev/hd1 /winsys B. root104.123.123.12…...

什么是快速傅里叶变换?

一、FFT概念 快速傅里叶变换&#xff08;Fast Fourier Transform&#xff0c;FFT&#xff09;是一种高效计算离散傅里叶变换&#xff08;Discrete Fourier Transform&#xff0c;简称DFT&#xff09;及其逆变换的算法。DFT和FFT都是音频处理、图像分析、振动分析、无线通信等许…...

android-studio开发第一个项目,并在设备上调试

恭喜你成功安装并配置好了 Android Studio&#xff01;下面是开发你的第一个 Android 项目并在设备上调试的详细步骤&#xff1a; 1. 启动 Android Studio 首先&#xff0c;启动 Android Studio。你可以通过以下几种方式启动&#xff1a; 使用桌面快捷方式&#xff08;如果已…...

深入浅出:php-学习入门全攻略

文章目录 1. 为什么选择 PHP&#xff1f;2. 安装 PHP 环境2.1 Windows 系统安装步骤 1&#xff1a;下载 PHP步骤 2&#xff1a;解压并配置步骤 3&#xff1a;配置环境变量步骤 4&#xff1a;验证安装 2.2 Mac 系统安装步骤 1&#xff1a;使用 Homebrew 安装步骤 2&#xff1a;验…...

Qml之基本控件

一.Qml常用控件 1.Text(显示普通文本和富文本) 1.1显示普通文本&#xff1a; Window { visible: true width: 320 height: 240 title: qsTr("Hello World") Text { text: "Hello World!" font.family: "Helvetica" font.pointSize: 24 color:…...

redis机制详解

RDB 快照机制 在默认情况下&#xff0c;Redis 会将内存数据库的快照存储在名为 “dump.rdb” 的二进制文件中。同时&#xff0c;你可以通过相关设置&#xff0c;让 Redis 在满足特定条件时自动保存数据集。例如&#xff0c;设定 “save 60 1000”&#xff0c;意味着当在 60 秒内…...

【知识科普】Linux系统下用户权限体系

文章目录 概述一、用户类型二、用户权限的组成三、权限的表示方法四、权限的修改方法五、特殊权限六、权限掩码&#xff08;umask&#xff09; 密码相关一、修改用户密码二、删除用户密码三、设置用户密码有效期四、查询用户密码信息五、密码策略配置 SSH远程访问1. 检查SSH服务…...

【数据结构】堆

目录 一、堆 二、堆的模拟实现 1.结构体 2.push 3.pop和top 三.实现堆排序 1.成堆算法 2.堆排序 heap模拟实现源码_gitee 一、堆 分为大堆和小堆 大堆是每个父节点都大于子节点&#xff0c;小堆则相反是每个父节点都小于子节点 底层抽象结构是完全二叉树&#xff0…...

6.824/6.5840 Lab 1: MapReduce

宁静的夏天 天空中繁星点点 心里头有些思念 思念着你的脸 ——宁夏 完整代码见&#xff1a; https://github.com/SnowLegend-star/6.824 由于这个lab整体难度实在不小&#xff0c;故考虑再三还是决定留下代码仅供参考 6.824的强度早有耳闻&#xff0c;我终于也是到了挑战这座高…...

Day5:生信新手笔记 — R语言基本语法

一、数据类型 &#xff08;重点只有两个&#xff0c;剩下的不看&#xff09; 1.1 向量&#xff08;vector&#xff09; 矩阵&#xff08;Matrix&#xff09; 数组&#xff08;Array&#xff09; 1.2 数据框&#xff08;Data frame&#xff09; x<- c(1,2,3) #常用的向…...

lua download

https://www.lua.org/ https://www.lua.org/versions.html#5.4...

安装更新upgrade导致ubuntu崩溃

安装更新导致ubuntu崩溃 前言uuid编不过&#xff0c;导致的崩溃 记录一些ubuntu崩溃的过程。 目前只有一个&#xff0c;以后遇到都放在这里&#xff0c;以提醒自己。 前言 如果从10000年看现在的linux&#xff0c;不是说不完美&#xff0c;而是糟透了。 linux的版本号&#xf…...

软件测试最新项目合集【商城、外卖、银行、金融等等.......】

项目一&#xff1a;ShopNC商城 项目概况&#xff1a; ShopNC商城是一个电子商务B2C电商平台系统&#xff0c;功能强大&#xff0c;安全便捷。适合企业及个人快速构建个性化网上商城。 包含PCIOS客户端Adroid客户端微商城&#xff0c;系统PC后台是基于ThinkPHP MVC构架开发的跨…...

【学习总结|DAY09】Java 流程控制与数据操作练习一:录入三位数并筛选符合条件的数字

一、主要代码&#xff1a; import java.util.Scanner;public class demo07 {public static void main(String[] args) {Scanner scanner new Scanner(System.in);System.out.print("请输入一个大于100的三位数&#xff1a;");int number scanner.nextInt();if (nu…...

“放弃Redis Desktop Manager使用Redis Insight”:日常使用教程(Redis可视化工具)

文章目录 更新Redis Insight连接页面基础解释自动更新key汉化暂时没有找到方法&#xff0c; Redis Desktop Manager在连接上右键在数据库上右键在key上右键1、添加连接2、key过期时间 参考文章 更新 (TωT)&#xff89;~~~ β&#xff59;ё β&#xff59;ё~ 现在在维护另一…...

使用lumerical脚本语言创建弯曲波导并进行数据分析(纯代码实现)

本文使用lumerical脚本语言创建弯曲波导、设置有限差分时域(FDTD)模拟、改变波导弯曲半径计算损耗、绘制图像展示电场强度分布情况及对具有不同弯曲半径的波导进行一系列模拟和分析操作(代码均有注释讲解)。 一、创建弯曲波导 1.1 基本结构讲解 (1)包层(Clad) 在波导结…...

AC+AP漫游实验

实验拓扑 实验要求 1.AP1服务vlan10&#xff0c;AP2服务vlan20&#xff0c;实现三层漫游 2.AP1与AP2为不同AP组&#xff0c;直接转发 实验步骤 1.配置VLAN放行相关流量 交换机与AP接口为trunk口并修改PVID为30 2.配置相关业务使得ap上线 3.配置vap上线&#xff0c;AP可用…...

七:仪表盘安装-controller node

一&#xff1a;工具、环境准备-controller node 二&#xff1a;OpenStack环境准备-controller node 三&#xff1a;安装服务-controller node 四&#xff1a;工具、环境准备-compute node 五&#xff1a;OpenStack环境准备-compute node 六&#xff1a;安装服务-compute node 七…...

pandas习题 067:小于 60 的部分列修改为 60

(编码题)修改以下名为 df 的 DataFrame 的值,将 Q1、Q2、Q3、Q4 列中小于 60 的分数修改为 60。 import pandas as pd# 示例数据 data = {name: [Alice, Bob, Charlie],...

Flutter 版本管理工具FVM

FVM是一款非常好用的Flutter版本管理工具。FVM官网&#xff1a; 下面是使用 FVM&#xff08;Flutter Version Manager&#xff09;管理 Flutter 版本的整个流程&#xff0c;包括安装、配置环境变量以及基本的使用步骤。 1. 安装 FVM FVM 可以通过多种方式安装&#xff0c;下…...

图学习GNN笔记

目录 第一部分&#xff1a;预测分析中的图学习4.3 案例研究&#xff1a;图上的学习机器学习生命周期 第二部分&#xff1a;图特征学习特征表示与嵌入为什么难以学习&#xff1f; 第三部分&#xff1a;节点嵌入嵌入节点设置学习节点嵌入浅层编码如何定义节点相似性&#xff1f; …...

装饰器—购物打折

from collections import namedtuple# 定义促销策略列表 promos []# 装饰器函数&#xff0c;用于注册促销策略 def promotion(promo_func):promos.append(promo_func)return promo_func# 促销策略1&#xff1a;忠诚度积分折扣 promotion def fidelity(order):""&quo…...

【Linux---10】本地机器 <=> 服务器 文件互传

文章目录 1. 小文件互传2. 大文件互传 1. 小文件互传 使用sz命令。 说明&#xff1a;sz命令是ZModem文件传输协议的一部分&#xff0c;用于在Linux和Unix系统中&#xff0c;从本地系统发送&#xff08;send&#xff09;文件到远程系统。sz命令通常与rz命令&#xff08;ZModem接…...

Mysql数据库基础篇笔记

目录 sql语句 DDL——数据库定义语言&#xff08;定义库&#xff0c;表&#xff0c;字段&#xff09; 数据库操作&#xff1a; 表操作&#xff1a; DML 增删改语句 DQL 语法编写顺序&#xff1a; 条件查询 DCL 用户管理&#xff1a; 权限管理&#xff1a; 函数 常见字符串内置函…...

QT 实现QStackedWidget切换页面右移动画

1.实现效果 以下是一个QStackedWidget,放了两个QPushButton在上面,点击切换不同的界面。 为了方便查看动画特效,设置了每个界面的背景图片。 2.实现思路 首先截取当前界面的图片,渲染到一个QLabel上,然后设置QPropertyAnimation动画,动画的作用对象就是这个QLabel,不断…...

RocketMQ rocketmq-tools管理主题

RocketMQ rocketmq-tools管理主题 环境和软件版本增删改查 环境和软件版本 Win10、IDEA、Jdk1.8、rocketmq 5.1.3、rocketmq-tools 5.1.3 引入依赖 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-tools</artifactId&g…...

Docker 容器隔离关键技术:Seccomp

Docker 容器隔离关键技术&#xff1a;Seccomp 在 Docker 容器中&#xff0c;Seccomp&#xff08;Secure Computing Mode&#xff09; 是一种内核安全机制&#xff0c;用来限制容器内的程序可以调用哪些系统调用&#xff08;Syscalls&#xff09;。通过列清单的方式&#xff0c…...

2024年顶级小型语言模型前15名

本文&#xff0c;我们将深入了解2024年备受瞩目的十五款小型语言模型&#xff08;SLMs&#xff09;&#xff0c;它们分别是Llama 3.1 8B、Gemma2、Qwen 2、Mistral Nemo、Phi-3.5等。这些SLMs以其精巧的体积和高效率著称&#xff0c;它们不需要依赖庞大的服务器资源&#xff0c…...

【大模型微调】pdf转markdown

目前市面上大部分都是pdf文档,要想转换成能训练的文本,调研了各种工具。 觉得MinerU确实不错。 参考此链接进行操作 MinerU/docs/README_Ubuntu_CUDA_Acceleration_en_US.md at master opendatalab/MinerU GitHub 需要注意的几个点: 1. 使用root账户安装的,配置文件在…...

【Nacos02】消息队列与微服务之Nacos 单机部署

Nacos 部署 Nacos 部署说明 Nacos 快速开始 Nacos 快速开始 版本选择 当前推荐的稳定版本为2.X Releases alibaba/nacos GitHuban easy-to-use dynamic service discovery, configuration and service management platform for building cloud native applications. - Re…...

PROTEUS资源导引

本专栏讲述51、32单片机的仿真设计&#xff0c;且所有文章资源共享&#xff0c;如需哪篇文章&#xff0c;可按ctrlF键搜索查询&#xff0c;点击进入即可。 -----------------------------------------------------------目录------------------------------------------------…...

对力扣77组合优化的剪枝操作的理解

77. 组合 代码随想录放出了这一张图 我乍一看觉得想当然,但是仔细想想,又不知道以下剪枝代码作何解释,因此我想通过这篇文章简要解释一下 class Solution { private:vector<vector<int>> result;vector<int> path;void backtracking(int n, int k, int sta…...

FFmpeg 4.3 音视频-多路H265监控录放C++开发十九,ffmpeg封装

封装就是将 一个h264&#xff0c;和一个aac文件重新封装成一个mp4文件。 这里我们的h264 和 aac都是来源于另一个mp4文件&#xff0c;也就是说&#xff0c;我们会将 in.mp4文件解封装成一路videoavstream 和 一路 audioavstream&#xff0c;然后 将这两路的 avstream 合并成一…...

http 与 https 汇总

文章目录 http 与 httpsHTTP&#xff08;超文本传输协议&#xff09;介绍1. 基本概念2. 工作原理3. 特点4. 应用场景 HTTPS&#xff08;超文本传输安全协议&#xff09;介绍1. 基本概念2. 工作原理3. 特点4. 应用场景 HTTP协议的工作原理请求阶段响应阶段客户端解析处理 协议的…...

龙蜥 Linux 安装 Nginx

龙蜥 Linux 安装 Nginx 下载编译安装配置编译参数先装依赖编译安装 使用启动检查配置文件重启关闭 503权限问题参考资料 下载 下载地址详情见参考资料&#xff0c;我下的 nginx-1.26.2.tar.gz 到 /home/jerry/ /home/jerry$ curl -O http://nginx.org/download/nginx-1.26.2.…...

8. 一分钟读懂“代理模式”

8.1 模式介绍 代理模式是一种结构型设计模式&#xff0c;它通过提供一个代理对象来替代对另一个对象&#xff08;真实对象&#xff09;的访问。代理对象与真实对象实现相同的接口&#xff0c;并通过代理类对真实对象的访问进行控制&#xff0c;可以在调用前后执行附加操作&…...

分布式搜索引擎Elasticsearch

Elasticsearch是一个基于Lucene库的开源分布式搜索引擎&#xff0c;它被设计用于云计算中&#xff0c;能够实现快速、near-real-time的搜索&#xff0c;并且可以进行大规模的分布式索引。 以下是一个简单的Python代码示例&#xff0c;展示如何使用Elasticsearch的Python客户端…...

完全按照手册win10里装Ubuntu 虚拟机然后编译ESP32(主要是想针对ESP32C3和S3)开发板的鸿蒙系统(失败)

基本上完全按照手册来的&#xff0c;除了Ubuntu虚拟机使用了22.04 Jammy版本&#xff0c;鸿蒙手册里是20.04 版本&#xff0c;主要是鸿蒙里3年前的手册了&#xff0c;所以就擅自用了高版本。 据此还想到一点&#xff0c;鸿蒙LiteOS&#xff0c;还挺稳定的&#xff0c;3年也没有…...

MySQL 8.0与PostgreSQL 15.8的性能对比

以下是MySQL 8.0与PostgreSQL 15.8的性能对比&#xff1a; MySQL 8.0性能特点&#xff1a; MySQL在处理大量读操作时表现出色&#xff0c;其存储引擎InnoDB提供了行级锁定和高效的事务处理&#xff0c;适用于并发读取的场景。MySQL通过查询缓存来提高读取性能&#xff0c;查询缓…...

hive 行转列

行转列的常规做法是&#xff0c;group bysum(if())【或count(if())】 建表: CREATE TABLE table2 (year INT,month INT,amount DOUBLE );INSERT INTO table2 (year, month, amount) VALUES(1991, 2, 1.2),(1991, 3, 1.3),(1991, 4, 1.4),(1992, 1, 2.1),(1992, 2, 2.2),(1992…...

linux——进程间通信system V消息队列

Linux——命名管道及日志-CSDN博客 文章目录 目录 文章目录 前言 一、system V消息队列是什么&#xff1f; 二、相关库接口 1.shmget接口 2、ftok接口 3、shmget、ftok接口封装 4、共享内存操作 ​编辑 5、shmdt接口 三.函数的调用 1、查看共享内存 2、shell 四…...