C语言零基础入门:嵌入式系统开发之旅
C语言零基础入门:嵌入式系统开发之旅
一、引言
嵌入式系统开发是当今科技领域中一个极具魅力和挑战性的方向。从智能家居设备到汽车电子系统,从智能穿戴设备到工业自动化控制,嵌入式系统无处不在。而C语言,作为嵌入式开发中最常用的语言之一,以其高效、灵活和接近硬件的特点,成为了嵌入式开发者的首选工具。如果你对嵌入式系统开发充满兴趣,但又对C语言一窍不通,那么这篇文章将是你开启这段奇妙旅程的完美起点。
二、C语言简介
C语言是一种通用的、过程式的编程语言,由美国贝尔实验室的Dennis Ritchie在20世纪70年代初开发。它具有简洁、高效、灵活的特点,能够提供对硬件的直接访问,同时又具备高级语言的抽象能力。C语言的设计目标是提供一种简洁而高效的编程语言,既能够用于编写系统软件,也能够用于开发各种应用软件。
(一)C语言的特点
• 简洁高效:C语言的语法简洁明了,关键字数量较少,但功能强大。它提供了丰富的数据类型、运算符和控制结构,能够让开发者以较少的代码实现复杂的逻辑。
• 可移植性:C语言编写的程序经过编译后可以在多种硬件平台上运行,具有良好的可移植性。这使得C语言在跨平台开发中具有很大的优势。
• 接近硬件:C语言提供了对硬件的直接访问能力,开发者可以通过指针操作内存,直接与硬件设备进行交互。这一特点使得C语言在嵌入式系统开发中具有不可替代的地位。
• 丰富的库支持:C语言拥有大量的标准库和第三方库,这些库提供了丰富的功能,如字符串处理、文件操作、数学计算等,大大提高了开发效率。
三、C语言基础语法
在开始嵌入式系统开发之前,我们需要掌握C语言的基本语法。以下是一些核心概念和语法结构。
(一)变量与数据类型
变量是程序中用于存储数据的容器,而数据类型则决定了变量可以存储的数据种类和范围。C语言提供了多种基本数据类型,包括整型(`int`)、浮点型(`float`、`double`)、字符型(`char`)等。
int age = 20; // 整型变量,存储整数float height = 1.75; // 浮点型变量,存储小数char gender = 'M'; // 字符型变量,存储单个字符
(二)运算符
C语言提供了丰富的运算符,用于执行各种数学运算和逻辑运算。常见的运算符包括:
• 算术运算符:`+`、`-`、`*`、`/`、`%`(取模)
• 关系运算符:`>`、`<`、`>=`、`<=`、`==`(等于)、`!=`(不等于)
• 逻辑运算符:`&&`(逻辑与)、`||`(逻辑或)、`!`(逻辑非)
int a = 10, b = 20;int sum = a + b; // 算术运算int isEqual = (a == b); // 关系运算int isTrue = (a > 0 && b > 0); // 逻辑运算
(三)控制结构
控制结构用于控制程序的执行流程,包括条件语句和循环语句。
1.条件语句
条件语句用于根据条件的真假执行不同的代码块。C语言提供了`if`语句和`switch`语句。
if (age >= 18) {printf("成年人\n");} else {printf("未成年人\n");}switch (gender) {case 'M':printf("男性\n");break;case 'F':printf("女性\n");break;default:printf("未知性别\n");}
2.循环语句
循环语句用于重复执行某段代码,直到满足某个条件为止。C语言提供了`for`循环、`while`循环和`do-while`循环。
for (int i = 0; i < 5; i++) {printf("循环次数:%d\n", i);}int count = 0;while (count < 5) {printf("循环次数:%d\n", count);count++;}int count2 = 0;do {printf("循环次数:%d\n", count2);count2++;} while (count2 < 5);
(四)函数
函数是C语言中用于封装代码的模块,它将一组相关的操作封装在一起,方便重复使用和维护。函数由函数名、参数列表和返回值组成。
// 定义一个函数int add(int a, int b) {return a + b;}// 调用函数int result = add(10, 20);printf("结果:%d\n", result);
四、C语言与嵌入式系统开发
嵌入式系统是一种专用的计算机系统,它被设计用于执行特定的任务,通常嵌入在其他设备中。嵌入式系统的开发需要考虑硬件资源的限制、实时性要求和可靠性等因素。C语言在嵌入式系统开发中具有以下优势:
(一)硬件资源管理
嵌入式系统通常具有有限的硬件资源,如内存、处理器速度等。C语言提供了对硬件的直接访问能力,开发者可以通过指针操作内存,优化代码的存储和执行效率。
// 示例:通过指针访问硬件寄存器volatile unsigned int *led_register = (unsigned int *)0x10000000;*led_register = 1; // 打开LED灯
(二)实时性支持
嵌入式系统往往需要在严格的时间约束下完成任务,例如实时控制系统。C语言的高效性和对硬件的直接访问能力使其能够满足实时性要求。
// 示例:定时器中断服务函数void TimerInterruptHandler() {static int count = 0;count++;if (count >= 1000) {printf("1秒已过\n");count = 0;}}
(三)可靠性与稳定性
嵌入式系统通常需要长时间稳定运行,C语言的低级特性使得开发者能够精确控制程序的行为,减少资源泄漏和错误的发生。
// 示例:内存分配与释放int *buffer = (int *)malloc(100 * sizeof(int));if (buffer == NULL) {printf("内存分配失败\n");} else {// 使用bufferfree(buffer); // 释放内存}
五、嵌入式开发环境搭建
在开始嵌入式系统开发之前,我们需要搭建一个合适的开发环境。以下是一些常用的工具和步骤。
(一)开发工具
• 集成开发环境(IDE):如Keil uVision、IAR EWARM等,这些IDE提供了代码编辑、编译、调试等功能,方便开发者进行嵌入式开发。
• 编译器:C语言编译器将C代码转换为机器代码,常见的嵌入式编译器有GCC(GNU Compiler Collection)。
• 调试器:调试器用于检查程序的运行状态,发现和修复错误。常用的调试器有GDB(GNU Debugger)。
(二)硬件平台
选择一个适合学习的嵌入式硬件平台非常重要。对于初学者,可以考虑以下几种平台:
• Arduino:一个开源的电子原型平台,具有丰富的开发板和扩展模块,适合初学者学习嵌入式开发。
• STM32:一款高性能的32位微控制器,具有丰富的外设接口和强大的处理能力,适合进阶学习。
• 树莓派:一款小型的单板计算机,具有丰富的接口和强大的计算能力,适合学习嵌入式系统开发和物联网应用。
(三)搭建步骤
以STM32为例,以下是搭建开发环境的步骤:
• 安装开发工具:下载并安装Keil uVision IDE。
• 配置硬件驱动:安装STM32的硬件驱动程序,确保开发板能够被电脑识别。
• 创建项目:在Keil中创建一个新的STM32项目,选择合适的芯片型号和编译器。
• 编写代码:在项目中编写C语言代码,实现所需的功能。
• 编译与下载:编译代码并将其下载到开发板中,运行程序并调试。
六、嵌入式开发中的C语言实践
为了更好地理解C语言在嵌入式系统开发中的应用,我们通过一个简单的项目来实践。项目目标是实现一个基于STM32的LED闪烁控制程序。
(一)硬件连接
将一个LED灯连接到STM32开发板的某个GPIO(通用输入输出)
引脚上,例如 PA0 引脚。具体的连接方式可以参考开发板的硬件手册,通常需要通过一个电阻将 LED 的正极连接到 GPIO 引脚,负极连接到地(GND)。
(二)代码实现
以下是实现 LED 闪烁功能的 C 语言代码示例。我们将通过控制 GPIO 引脚的电平来点亮和熄灭 LED。
1.初始化 GPIO 引脚
在嵌入式开发中,GPIO 引脚需要进行初始化配置,指定其工作模式(输入、输出、中断等)和电气特性(上拉、下拉等)。
#include "stm32f10x.h" // 引入 STM32 的头文件,具体文件名可能因芯片型号而异// 初始化 GPIO 引脚void GPIO_Init(void) {// 1. 使能 GPIOA 时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 2. 配置 PA0 引脚为推挽输出模式GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 选择 PA0 引脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 设置为推挽输出模式GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 设置 GPIO 速度为 50MHzGPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化 GPIOA}
2.实现 LED 闪烁功能
通过控制 GPIO 引脚的电平(高电平或低电平)来点亮和熄灭 LED。我们使用`GPIO_SetBits()`和`GPIO_ResetBits()`函数来控制引脚电平。
// 延时函数,用于控制 LED 闪烁的间隔时间void Delay(uint32_t time) {while (time--) {__NOP(); // 空操作,用于延时}}// 主函数int main(void) {// 初始化 GPIO 引脚GPIO_Init();while (1) { // 无限循环// 点亮 LED(将 PA0 设置为高电平)GPIO_SetBits(GPIOA, GPIO_Pin_0);Delay(1000000); // 延时 1 秒// 熄灭 LED(将 PA0 设置为低电平)GPIO_ResetBits(GPIOA, GPIO_Pin_0);Delay(1000000); // 延时 1 秒}}
(三)编译与下载
• 编译代码:在 Keil uVision IDE 中,将上述代码保存到项目中,并进行编译。确保所有头文件和库文件都已正确配置。
• 下载到开发板:连接开发板的调试接口(如 SWD 或 JTAG),使用 Keil 的调试工具将编译后的程序下载到 STM32 开发板中。
• 观察结果:运行程序后,观察 LED 是否按照预期闪烁。
七、C语言在嵌入式开发中的高级应用
在掌握了基本的 C 语言语法和简单的嵌入式开发流程后,我们可以进一步探索 C 语言在嵌入式系统开发中的高级应用。
(一)中断处理
中断是嵌入式系统中的重要概念,它允许硬件设备在特定事件发生时通知处理器执行特定的代码(中断服务程序)。C语言可以通过函数指针和关键字`interrupt`来实现中断处理。
示例:外部中断假设我们希望在按下按钮时点亮 LED,可以通过配置外部中断来实现。// 外部中断初始化void EXTI_Init(void) {// 配置外部中断引脚(如 PA1)// 配置中断触发条件(上升沿、下降沿等)// 启用中断}// 外部中断服务程序void EXTI0_IRQHandler(void) {if (EXTI_GetITStatus(EXTI_Line0) != RESET) { // 检查中断是否发生// 点亮 LEDGPIO_SetBits(GPIOA, GPIO_Pin_0);// 清除中断标志EXTI_ClearITPendingBit(EXTI_Line0);}}
(二)内存管理
嵌入式系统通常具有有限的内存资源,因此需要谨慎管理内存。C语言提供了动态内存分配和释放的机制,如`malloc()`和`free()`,但在嵌入式开发中,更推荐使用静态内存分配,以避免动态分配带来的碎片化问题。
示例:静态内存分配// 定义一个静态缓冲区static uint8_t buffer[1024];// 使用缓冲区void ProcessData(void) {// 直接操作 buffer,无需动态分配}
(三)实时操作系统(RTOS)
在复杂的嵌入式系统中,实时操作系统(RTOS)可以提高系统的可靠性和效率。RTOS 提供了任务调度、信号量、队列等功能,使得多个任务可以并发运行。C语言是实现 RTOS 的主要语言之一。
示例:使用 FreeRTOSFreeRTOS 是一个流行的开源 RTOS,支持多种微控制器。以下是一个简单的任务创建示例:#include "FreeRTOS.h"#include "task.h"// 任务函数void vLEDTask(void *pvParameters) {while (1) {GPIO_SetBits(GPIOA, GPIO_Pin_0); // 点亮 LEDvTaskDelay(pdMS_TO_TICKS(1000)); // 延时 1 秒GPIO_ResetBits(GPIOA, GPIO_Pin_0); // 熄灭 LEDvTaskDelay(pdMS_TO_TICKS(1000)); // 延时 1 秒}}// 主函数int main(void) {// 初始化硬件GPIO_Init();// 创建任务xTaskCreate(vLEDTask, "LED Task", configMINIMAL_STACK_SIZE, NULL, 1, NULL);// 启动调度器vTaskStartScheduler();// 主函数永远不会到达这里while (1) { }}
八、参考资源
• 《C Primer Plus》:一本经典的 C 语言入门书籍,适合初学者学习 C 语言的基础语法和编程思想。
• 《嵌入式系统设计》:深入介绍了嵌入式系统的设计原理和开发流程,适合有一定基础的读者。
• STM32 官方文档:提供了详细的芯片手册、参考手册和开发指南,是学习 STM32 开发的权威资料。
• FreeRTOS 官方网站:提供了丰富的文档和示例代码,帮助开发者快速上手实时操作系统开发。
相关文章:
C语言零基础入门:嵌入式系统开发之旅
C语言零基础入门:嵌入式系统开发之旅 一、引言 嵌入式系统开发是当今科技领域中一个极具魅力和挑战性的方向。从智能家居设备到汽车电子系统,从智能穿戴设备到工业自动化控制,嵌入式系统无处不在。而C语言,作为嵌入式开发中最常…...
【数据分享】1999—2023年地级市地方一般公共预算收支状况数据(科学技术支出/教育支出等)
在之前的文章中,我们分享过基于2000-2024年《中国城市统计年鉴》整理的1999-2023年地级市的人口相关数据、染物排放和环境治理相关数据、房地产投资情况和商品房销售面积相关指标数据和社会消费品零售总额和年末金融机构存贷款余额(均可查看之前的文章获…...
直方图(信息学奥赛一本通-1115)
【题目描述】 给定一个非负整数数组,统计里面每一个数的出现次数。我们只统计到数组里最大的数。假设 Fmax(Fmax<10000)是数组里最大的数,那么我们只统计{0,1,2.....Fmax}里每个数出现的次数。 【输入】 第一行n是数组的大小。…...
基于NXP+FPGA轨道交通人机交互(HMI)和健康管理单元(PHM)解决方案
人机接口 (HMI) 是交互式显示设备,可用于司机和乘务员的交互式信息显示。也可以用于CCTV监视。满足多种接口设备连接的同时,搭载的Linux系统,可以满足客户的定制化需求。 关键特性 触摸式按键位于显示区域周围,耐用性好࿰…...
宇树与智元的崛起:机器人“灵魂”注入的技术密码
目录 机器人运动的基石:大扭矩与平衡术 大扭矩:力量的源泉 平衡术:动态平衡的艺术 从运动到智能:AI学习的“灵魂”注入 强化学习:试错中的成长 模仿学习:站在巨人的肩膀上 数据与知识共享࿱…...
TCP 全连接队列 内核层理解socket
TCP 全连接队列 理解 listen 的第二个参数 int listen(int sockfd, int backlog);backlog 参数表示 全连接队列(accept 队列)的最大长度。 那什么是全连接队列呢? 三次握手 & accept() 处理流程 客户端发送 SYN,服务器收到并…...
成功破解加密机制,研究人员解锁LinuxESXi Akira勒索软件
一位网络安全研究人员成功破解了Akira勒索软件在Linux/ESXi系统中的加密机制,使得受害者无需支付赎金即可恢复数据。 这一突破利用了勒索软件加密方法中的关键漏洞。据研究人员介绍,该恶意软件使用纳秒级的时间戳作为加密过程中的种子,这使其…...
vue2:el-table列中文字前面加icon图标的两种方式
1、文字前面加icon <el-table-column label="姓名" align="left" prop="nickName"><template #default="{ row }"><i v-if="row.sync" class="el-icon-lock"></i><span>{{ row.nic…...
深入探索Android Bitmap:从原理到实战
一、Bitmap 是什么 在 Android 开发中,Bitmap 是极为重要的基石。简单来说,Bitmap 代表位图,是图片在内存里的具体呈现形式 ,任何诸如 JPEG、PNG、WEBP 等格式的图片,一旦被加载到内存中,就会以 Bitmap 对…...
软考计算机知识-流水线
计算机流水线类似工业生产过程的流水线,在同一时间,m个部件进行不同的操作,完成对不同对象的处理。 理解重叠:让不同的指令在时间上重叠地解释。在解释第k条指令的操作完成之前,就可以开始解释第k1条指令。 题1&#…...
【Linux】从互斥原理到C++ RAII封装实践
📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…...
【哈希表与字符串的算法之路:思路与实现】—— LeetCode
文章目录 两数之和面试题01.02.判定是否为字符重排存在重复元素存在重复元素||字母异位词分组最长公共前缀和最长回文子串二进制求和字符串相乘 两数之和 这题的思路很简单,在读完题目之后,便可以想到暴力枚举,直接遍历整个数组两遍即可&…...
rdiff-backup备份
目录 1. 服务器备份知识点 1.1 备份策略 1.2 备份步骤和宝塔面板简介 1.3 CentOS7重要目录 2. 备份工具 2.1 tar -g 备份演示 2. rsync 备份演示 3. rdiff-backup 备份演示 4. 差异和优缺点 3. rdiff-backup安装和使用 3.1 备份命令rdiff-backup 3.2 恢复命令--…...
Netty基础—4.NIO的使用简介一
大纲 1.Buffer缓冲区 2.Channel通道 3.BIO编程 4.伪异步IO编程 5.改造程序以支持长连接 6.NIO三大核心组件 7.NIO服务端的创建流程 8.NIO客户端的创建流程 9.NIO优点总结 10.NIO问题总结 1.Buffer缓冲区 (1)Buffer缓冲区的作用 (2)Buffer缓冲区的4个核心概念 (3)使…...
贪心算法简介(greed)
前言: 贪心算法(Greedy Algorithm)是一种在每个决策阶段都选择当前最优解的算法策略,通过局部最优的累积来寻求全局最优解。其本质是"短视"策略,不回溯已做选择。 什么是贪心、如何来理解贪心(个人对贪心的…...
驻场运维服务方案书(Word文件)
目 录 第一章 背景分析 1.1. 项目背景 1.2. 项目目标 1.3. 系统现状 1.3.1. 网络系统 1.3.2. 设备清单梳理 1.3.3. 应用系统 第二章 需求分析及理解 2.1. 在重要日期能保障信息系统安全 2.2. 信息系统可长期安全、持续、稳定的运行 2.3. 提升发现安全问题、解决安全…...
嵌入式硬件--开发工具-AD使用常用操作
ad16.1.12 1.如何显示/隐藏其他图层 在pcb界面点击L--试图界面中找到“视图选项”--单层模式选择 not in single layer mode 在pcb界面点击L--试图界面中找到“视图选项”--单层模式选择 gray scale other layers 【Altium】AD如何只显示一层,隐藏其他层显示&…...
在 Ubuntu 上安装和配置 Docker 的完整指南
Docker 是一个开源的平台,旨在简化应用程序的开发、部署和运行。通过将应用程序及其依赖项打包到容器中,Docker 确保应用程序可以在任何环境中一致地运行。 目录 前言安装前的准备安装 Docker 步骤 1:更新包索引步骤 2:安装必要…...
微服务全局ID方案汇总
自增id 对于大多数系统来说,使用mysql的自增id当作主键再最合适不过了。在数据库层面就可以获取一个顺序的、唯一的、空间占用少的id。 自增id需要是 int、bigint这些整数类型,uint 支持 40 亿的数据量,bigint unsign(0 &#x…...
实验5 逻辑回归
实验5 逻辑回归 【实验目的】掌握逻辑回归算法 【实验内容】处理样本,使用逻辑回归算法进行参数估计,并画出分类边界 【实验要求】写明实验步骤,必要时补充截图 1、参照“2.1梯度下降法实现线性逻辑回归.ipynb”和“2.2 sklearn实现线性逻辑…...
【原创】在高性能服务器上,使用受限用户运行Nginx,充当反向代理服务器[未完待续]
1 起因 在公共高性能服务器上运行OllamaDeepSeek,如果按照默认配置启动Ollama程序,则自己在远程无法连接你启动的Ollama服务。 如果修改掉默认的配置,则会遇到你的Ollama被他人完全控制的安全风险。 不过,我们可以使用一个方向…...
Linux 下 MySQL 8 搭建教程
一、下载 你可以从 MySQL 官方下载地址 下载所需的 MySQL 安装包。 二、环境准备 1. 查看 MySQL 是否存在 使用以下命令查看系统中是否已经安装了 MySQL: rpm -qa|grep -i mysql2. 清空 /etc/ 目录下的 my.cnf 执行以下命令删除 my.cnf 文件: [roo…...
vue 仿deepseek前端开发一个对话界面
后端:调用deepseek的api,所以返回数据格式和deepseek相同 {"model": "DeepSeek-R1-Distill-Qwen-1.5B", "choices": [{"index": 0, "delta": {"role": "assistant", "cont…...
MinIO问题总结(持续更新)
目录 Q: 之前使用正常,突然使用空间为0B,上传文件也是0B(部署在k8s中)Q: 无法上传大文件参考yaml Q: 之前使用正常,突然使用空间为0B,上传文件也是0B(部署在k8s中) A: 1、检查pod状态…...
STM32配套程序接线图
1 工程模板 2 LED闪烁 3LED流水灯 4蜂鸣器 5按键控制LED 6光敏传感器控制蜂鸣器 7OLED显示屏 8对射式红外传感器计次 9旋转编码器计次 10 定时器定时中断 11定时器外部时钟 12PWM驱动LED呼吸灯 13 PWM驱动舵机 14 PWM驱动直流电机 15输入捕获模式测频率 16PWMI模式测频率占空…...
深入理解Linux网络随笔(七):容器网络虚拟化--Veth设备对
深入理解Linux网络随笔(七):容器网络虚拟化 微服务架构中服务被拆分成多个独立的容器,docker网络虚拟化的核心技术为:Veth设备对、Network Namespace、Bridg。 Veth设备对 veth设备是一种 成对 出现的虚拟网络接口&…...
实战指南:鸿蒙ArkTS中实现列表下拉刷新与触底加载的完整解析
前言: 在移动应用开发中,下拉刷新和触底加载更多是提升用户体验的核心功能。鸿蒙ArkUI框架通过Refresh组件和List组件的onReachEnd事件,为开发者提供了简洁高效的实现方案。本文将通过代码示例,详解如何利用ArkTS实现这两个功能。…...
【栈数据结构应用解析:常见算法题详细解答】—— Leetcode
文章目录 栈的模拟实现删除字符串中的所有相邻重复项比较含退格的字符串基本计算器||字符串解码验证栈序列 栈的模拟实现 #include <iostream>using namespace std;const int N 1e5 10;// 创建栈 int stk[N], n;// 进栈 - 本质就是顺序表里面的尾插 void push(int x) …...
Git常用操作之GitLab
Git常用操作之GitLab 小薛博客官网:小薛博客Git常用操作之GitLab官方地址 1、GitLab安装 https://gitlab.cn/install/ 1、Docker安装GitLab https://docs.gitlab.cn/jh/install/docker.html 1、设置卷位置 在设置其他所有内容之前,请配置一个新的…...
2025探索短剧行业新可能报告40+份汇总解读|附PDF下载
原文链接:https://tecdat.cn/?p41043 近年来,短剧以其紧凑的剧情、碎片化的观看体验,迅速吸引了大量用户。百度作为互联网巨头,在短剧领域积极布局。从早期建立行业专属模型冷启动,到如今构建完整的商业生态…...
各省水资源平台 水资源遥测终端机都用什么协议
各个省水资源平台 水资源遥测终端机 的建设大部分从2012年开始启动,经过多年建设,基本都已经形成了稳定的通讯要求;河北瑾航科技 遥测终端机,兼容了大部分省市的通讯协议,如果需要,可以咨询和互相学习&…...
C#+EF+SqlServer性能优化笔记
文章目录 前言一、C#EF 代码优化1.接口代码改异步2.查询异步,只查询需要的数据3.查询数据判断时4.直接使用sql查询 二、数据库优化1.减少关联表,一些基础数据,字典表可以考虑放到redis中,在代码中映射2.增加索引,删除无…...
列表动态列处理
1、在initialize()方法里,获取列表控件,添加CreateListColumnsListener监听 public void initialize(){ BillList billlist(BillList)this.getControl("billlistap"); billlist.addCreateListColumnsListener(this::beforeCreateListColumns)…...
电机控制常见面试问题(十二)
文章目录 一.电机锁相环1.理解锁相环2.电机控制中的锁相环应用3.数字锁相环(DPLL) vs 模拟锁相环(APLL)4.锁相环设计的关键技术挑战5.总结 二、磁链观测1.什么是磁链?2.为什么要观测磁链?3.怎么观测磁链&am…...
芯驿电子 ALINX 亮相德国纽伦堡,Embedded World 2025 精彩回顾
2025年3月13日,全球规模最大的嵌入式行业盛会——德国纽伦堡国际嵌入式展(embedded world 2025)圆满落幕。 在这场汇聚全球 950 家展商、3 万余专业观众的科技盛宴中,芯驿电子 ALINX 展位人头攒动,多款尖端产品吸引客户…...
西门子S7-1200 PLC远程上下载程序方案
西门子S7-1200 PLC远程上下载程序方案(巨控GRM552YW-C模块) 三步完成配置 | 全球适用 | 稳定高效 三步快速完成远程配置 硬件部署 准备巨控GRM552YW-CHE模块1台,通过网口连接西门子S7-1200 PLC以太网口。 模块支持4G/5G/Wi-Fi/网线接入外网…...
MFC窗口的创建/消息映射机制
mfc.h #include<afxwin.h>//mfc头文件//应用程序类 class MyApp:public CWinApp //继承于应用程序类 { public://程序入口virtual BOOL InitInstance(); };//框架类 class MyFrame:public CFrameWnd { public:MyFrame();//声明宏 提供消息映射机制DECLARE_MESSAGE_MAP()…...
【每日学点HarmonyOS Next知识】tab对齐、相对布局、自定义弹窗全屏、动画集合、回到桌面
1、HarmonyOS Tabs 是否能支持 tabbar 居左对齐? 当前方案为自定义tabbar实现,示例demo: Entry Component struct TabsExample {State tabArray: Array<number> [0, 1,2]State focusIndex: number 0State pre: number 0State inde…...
如何在TikTok网页版切换地区设置
今天我们来聊聊如何在TikTok网页版上更改地区设置。TikTok作为全球知名的短视频社交应用,不仅仅局限于某个国家或地区。修改地区设置可以让你探索来自不同地方的内容,享受更为丰富的社交互动体验。那么,具体该如何操作呢?让我一步…...
redis工具类
前言 Redis 是一个高性能的键值存储系统,广泛应用于缓存、消息队列、实时分析等场景。为了更高效地操作 Redis,许多开发者会选择使用 Redisson 客户端库。 依赖配置 首先确保您的项目中已经包含了 Redisson 的最新版本(如 3.44.0ÿ…...
【Python办公】Excel通用匹配工具(双表互匹)
目录 专栏导读1、背景介绍2、库的安装3、核心代码4、完整代码总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文章专栏:请点击——>Python办公自动化专…...
安徽省青少年信息学奥林匹克竞赛初中组第1题LuoguP762
先放题目: 【题目背景】.你 .可 .以 .选 .择 .跳 .过 .背 .景 .部 .分。初春的一天,正是乍暖还寒时候,狂风乍起。小可可裹紧了单薄的外衣,往小雪家中赶去。“今天真不是个出门的时候啊!”小可可感叹道。“但是我还有东西要买………...
AVL树的平衡算法的简化问题
AVL树是一种紧凑的二叉查找树。它的每个结点,都有左右子树高度相等,或者只相差1这样的特性。文章https://blog.csdn.net/aaasssdddd96/article/details/106291144给出了一个例子。 为了便于讨论,这里对AVL树的结点平衡情况定义2个名称&#…...
NFS实验配置笔记
NFS NFS服务 nfs,最早是Sun这家公司所发展出来的,它最大的功能就是可以透过网络,让不同的机器,不同的操作系统,进行实现文档的共享。所以你可以简单的将他看做是文件服务器。 实验准备 ①先准备一个服务器端的操作…...
C盘清理技巧分享:释放空间,提升电脑性能
目录 1. 引言 2. C盘空间不足的影响 3. C盘清理的必要性 4. C盘清理的具体技巧 4.1 删除临时文件 4.2 清理系统还原点 4.3 卸载不必要的程序 4.4 清理下载文件夹 4.5 移动大文件到其他盘 4.6 清理系统缓存 4.7 使用磁盘清理工具 4.8 清理Windows更新文件 4.9 禁用…...
【云馨AI-大模型】RAGFlow功能预览:Dify接入外部知识库RAGFlow指南
介绍 Dify介绍 开源的 LLM 应用开发平台。提供从 Agent 构建到 AI workflow 编排、RAG 检索、模型管理等能力,轻松构建和运营生成式 AI 原生应用。比 LangChain 更易用。官网:https://dify.ai/zh RAGFlow介绍 RAGFlow 是一款基于深度文档理解构建的…...
大模型学习笔记------Llama 3模型架构之旋转编码(RoPE)
大模型学习笔记------Llama 3模型架构之旋转编码(RoPE) 1、位置编码简介1.1 绝对位置编码1.2 相对位置编码 2、旋转编码(RoPE)2.1 基本概念---旋转矩阵2.2 RoPE计算原理2.2.1 绝对位置编码2.2.2 相对位置编码 3、旋转编码…...
Anthropic 的模型
Anthropic 的模型(特别是 Claude 系列)之所以在性能和推理能力上表现强劲,可以从技术设计、研究理念、训练方法以及应用优化等多个方面进行详细分析。以下是基于当前信息(截至 2025 年 3 月 13 日)和行业趋势的深入剖析…...
初探大模型开发:使用 LangChain 和 DeepSeek 构建简单 Demo
最近,我开始接触大模型开发,并尝试使用 LangChain 和 DeepSeek 构建了一个简单的 Demo。通过这个 Demo,我不仅加深了对大模型的理解,还体验到了 LangChain 和 DeepSeek 的强大功能。下面,我将分享我的开发过程以及一些…...
FPGA初级项目10——基于SPI的DAC芯片进行数模转换
FPGA初级项目10——基于SPI的DAC芯片进行数模转换 DAC芯片介绍 DAC 芯片(数字模拟转换器)是一种将数字信号转换为连续模拟信号(如电压或电流)的集成电路,广泛应用于电子系统中,连接数字世界与模拟世界。 …...