自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

ALL IS FILE_

C51-->STM32-->FreeRTOS-->Linux

  • 博客(133)
  • 收藏
  • 关注

原创 ROS开发学习记录【一】

本文总结了ROS基础学习的第一阶段,重点介绍了在无GUI嵌入式Linux/工控机环境下搭建ROS系统的核心要点。文章首先明确了学习目标:掌握ROS运行模型、节点通信机制和工程级调试能力。详细解析了ROS的分布式通信本质、catkin工作空间结构,并通过创建myros_demo包实例,展示了发布/订阅节点的代码实现。特别强调了CMakeLists.txt配置的关键作用和无GUI环境下的命令行调试技巧。最后总结了命名空间和参数服务器这两个工程化重点,以及通过参数配置实现不重新编译即可修改节点行为的能力。

2025-12-31 17:28:43 1101

原创 嵌入式linux相关库和工具【安装命令】

本文系统介绍了嵌入式Linux开发中常用的库分类及安装方法,主要包括:1)基础系统库(gcc、make等);2)网络通信库(SSL、MQTT等);3)硬件接口库(GPIO、I2C等);4)图形界面库(SDL、Qt等);5)多媒体处理库;6)数据格式库(JSON、XML);7)数据库;8)数学算法库;9)实时系统库;10)嵌入式专用库;11)调试工具;12)交叉编译工具链;13)无人船项目专用库(GPS、点云处理等)。文章还提供了按需安装建议和验证方法,为嵌入式开发者提供了全面的库管理参考。

2025-11-28 14:04:18 310

原创 Bootloader与OTA技术深度解析:从原理到“跳转后APP未启动”问题解决思路

摘要: Bootloader与OTA技术是嵌入式设备固件升级的核心,但实践中常出现“跳转后APP未启动”问题。本文从原理、流程、调试三方面系统分析:Bootloader负责硬件初始化、固件校验及跳转控制,需正确处理向量表、中断禁用和栈指针配置;OTA升级需保障传输可靠性与固件完整性。问题根源可能涉及硬件(电源、晶振)、软件(向量表错位、中断残留)或流程(标志位未清除)。通过分层排查(硬件→软件→流程)、工具辅助(调试器/示波器)及规范设计(地址对齐/版本管理)可有效解决。文中提供代码示例与调试方法,助力开发

2025-09-18 11:09:53 1158

原创 如何调试工控机的 232/485/CAN 是否正常

摘要: 本文介绍了在Linux工控机上测试RS-232/485和CAN接口的方法。 RS-232/485测试:使用minicom工具,通过物理短接DATA+和DATA-(RS-485)或TX/RX(RS-232)进行环回测试,观察数据是否回显。若成功,则接口正常。 CAN接口测试:安装can-utils工具包,配置CAN接口(如can0)并设置比特率。使用candump监听总线数据,或通过cansend发送测试帧并验证自发自收功能,以确认硬件和驱动是否正常。 故障排查包括检查物理连接、驱动加载、比特率匹配及

2025-09-03 09:31:04 1476

原创 RS485、RS232、RS422协议

摘要:RS232、RS422和RS485是三种串行通信标准,各有特点。RS232采用单端信号,适合15米内的点对点通信;RS422使用差分信号,支持一主多从,通信距离达1200米;RS485同样采用差分信号,具备组网能力,适合工业自动化。RS232简单可靠,RS422适合广播同步,RS485组网灵活。三者在电气特性、连接方式和应用场景上存在差异,需根据实际需求选择。

2025-08-29 17:19:24 539

原创 卡尔曼滤波算法笔记、例程、原理、应用

本文介绍了卡尔曼滤波算法及其在姿态估计和GPS定位中的应用。卡尔曼滤波通过预测-更新循环,结合系统模型和传感器测量,实现最优状态估计。文章详细阐述了算法数学原理、项目实现架构(包括IMU和GPS数据处理流程),展示了滤波前后数据对比效果:原始数据存在明显抖动和跳变,而滤波后数据平滑稳定。实际应用表明,卡尔曼滤波显著提升了PID控制精度、路径规划质量和系统稳定性,并通过调整过程噪声Q和观测噪声R参数实现性能优化。该算法作为智能数据过滤器,有效提升了系统整体性能。

2025-08-25 11:41:51 1607 1

原创 嵌入式linux(usv)项目编译需要的步骤

本文摘要: 本文详细介绍了USV自动驾驶系统的环境配置与部署流程,主要内容包括:1)安装编译工具链和依赖库;2)系统环境检查(内核版本、CAN模块);3)项目编译步骤;4)CAN总线、串口和网络配置;5)运行程序及后台管理;6)常见故障排查方法;7)开发环境搭建;8)可选系统服务配置;9)监控调试工具使用。该指南提供了完整的系统部署解决方案,涵盖了从环境准备到运行维护的全过程,特别注意了设备权限设置和网络配置等关键环节。

2025-08-25 09:25:16 820

原创 Linux--Git教程

【代码】Linux--Git教程。

2025-07-22 17:24:01 162

原创 单片机常用通信外设特点及通信方式对比表

→ 同一总线上挂2个相同地址传感器?→ 晶振误差±5%?,否则数据错乱到你怀疑人生!→ 120Ω终端电阻。

2025-06-25 10:43:54 732

原创 《第一章~~~第五章-综合运用———“同门切磋,第一回合”》 C++职业生涯笔记---手机通讯录管理系统综合实战

👉 本程序综合运用了C++核心知识点,代码完整可运行!- 把联系人信息打包成结构体,管理更轻松。- 添加emoji和格式美化提升使用体验。- 每个功能独立封装,代码清晰易维护。- 通过指针快速找到要操作的联系人。- 确保显示数据时不被意外修改。

2025-06-13 21:24:01 513

原创 《第五章-心法进阶》 C++修炼生涯笔记(基础篇)指针与结构体⭐⭐⭐⭐⭐

🌟 C++指针与结构体超全指南 | 编程萌新必看!附代码运行效果💻

2025-06-13 20:52:13 896

原创 《第四章-筋骨淬炼》 C++修炼生涯笔记(基础篇)数组与函数

一维数组是存储相同类型元素的线性集合,定义时需要指定数据类型和数组长度。定义方式示例说明数据类型 数组名[数组长度];定义长度为5的整型数组,未初始化数据类型 数组名[数组长度] = {值1, 值2, ...};定义并初始化(全部元素)数据类型 数组名[] = {值1, 值2, ...};定义并初始化,数组长度自动推断特点数组元素在内存中连续存储数组索引从0开始数组长度必须是常量表达式// 正确示例// 错误示例:长度不能是变量int n = 5;// 编译错误。

2025-06-13 20:21:46 1139

原创 《 第三章-招式初成》 C++修炼生涯笔记(基础篇)程序流程结构

掌握这些流程控制结构,能够构建逻辑清晰、高效可靠的C++程序,为后续学习面向对象和高级特性打下坚实基础。会导致"贯穿"现象,程序会继续执行后续case的语句。最常用的循环结构,包含初始化、条件判断和更新。选择结构根据条件判断决定程序执行路径。用于多分支选择,适合离散值判断。跳转语句用于改变程序执行流程。循环结构用于重复执行代码块。先执行一次循环体,再判断条件。先判断条件,再执行循环体。简化容器和数组的遍历。

2025-06-13 19:59:53 1045

原创 《第二章-内功筑基》 C++修炼生涯笔记(基础篇)数据类型与运算符

掌握这些核心知识,相当于打通C++内功的“任督二脉”,后续修炼面向对象和模板等高级境界将事半功倍!

2025-06-13 19:28:56 1164

原创 《第一章-初入江湖》 C++修炼生涯笔记(基础篇)C++初识

遵循团队编码规范,优先使用描述性名称,提高代码可读性和可维护性。通常定义在变量前加关键字const,修饰该变量为常量,不可修改.作用:C++规定给标识符(变量、常量)命名时,有一套自己的规则。作用:在代码中添加一些注释,方便自己和其他程序员阅读代码。例如:const int day = 7;作用:给一段指定的内存空间起名,方便操作内存。作用:关键字是C++预先保留单词(标识符)在定义变量或者常量的时候,不要用关键字。多行注释: /* 这是多行注释 */单行注释: //这是单行注释。

2025-06-13 18:59:08 1061

原创 《数据结构笔记六》队列 ⭐⭐⭐

通过代码实现和理论分析,可以更深入地理解队列在算法和系统开发中的应用价值。:通过限制操作位置(队尾入队、队首出队),强制实现FIFO逻辑。:队列适用于需要“顺序处理”的场景,如任务调度、数据缓冲等。指针到达数组末尾后即使前面有空位也无法继续入队(假溢出)。当队列满时,可分配更大的数组并迁移数据(例如容量翻倍)。:判断队列是否已满(仅限固定容量队列)需要快速访问和固定容量时选择数组实现。入队时检测队列满,出队时检测队列空。)实现指针循环,复用空闲空间。:操作系统中的进程就绪队列。:元素出队(移除队首元素)

2025-05-28 13:57:18 387

原创 《数据结构笔记五》栈!⭐⭐⭐

栈(stack)

2025-05-28 13:40:04 821

原创 《数据结构笔记四》双链表:创建,插入(头插、尾插、中间任意位置插入),删除,遍历,释放内存等核心操作。

运行该程序时,可以通过双向打印验证链表结构的正确性,同时所有内存操作都经过安全处理,避免常见的内存泄漏问题。5. 编写在任意位置插入的函数(比如指定位置索引)。6. 编写删除节点的函数(按位置或按值)。验证无效位置输入(负数、超长位置)每个动态分配的节点都会被正确释放。测试用例覆盖头/尾/中间操作场景。9. 主函数中测试这些操作。2. 编写创建节点的函数。7. 编写遍历链表的函数。8. 编写释放链表的函数。处理空链表插入/删除操作。3. 编写头插法函数。4. 编写尾插法函数。:双向遍历验证链表结构。

2025-05-27 16:46:20 438

原创 《数据结构笔记三》:单链表(创建、插入、遍历、删除、释放内存等核心操作)

单链表:创建、插入、遍历、删除、释放内存等核心操作

2025-05-23 18:45:23 1203

原创 《数据结构笔记二》:顺序表

用一组连续的内存单元依次存储线性表的各个元素,也就是说,逻辑上相邻的元素,实际的物理存储空间也是连续的。线性表中的元素个数n(n>=0),定义为线性表的长度,当n=0时称之为空表。由n(n>=0)个数据特性相同的元素构成的有限序列,称为线性表。线性表是n个数据元素的有限序列,其中n个数据的是相同的数据类型。除最后一个元素外,结构中的每一个数据元素均只有一个后继。除第一个元素外,结构中的每一个数据元素均只有一个前驱。存在唯一的一个被称之为 “最后一个” 的数据元素。查找的这个元素的位置为:1。

2025-05-22 18:42:37 370

原创 《数据结构笔记一》: 指针、结构体、动态内存分配、算法时间复杂度。

编写一个函数,传入两个int参数,在函数创建一个结构体point类型的变量。将传入的两个参数分别赋值给该结构体变量的x和y,最后将该结构体变量返回。随着问题规模n的增大,算法执行时间和增长率和f(n)增长率成正比。结构体是一个或多个变量的集合,这些变量可以是不同的类型。可以看到 取 *p地址输出的是数组的首位元素。那如果想取数组的其他元素呢?c程序编译后,会以三种形式使用内存。在C语言中,动态分配内存的基本步骤。评价算法好坏的基本标准。结构体的初始化与调用。

2025-05-22 14:35:07 861

原创 在c/c++中,如何使用链表进行插入、删除和遍历功能。

处理头节点删除和中间节点删除两种情况。依次插入3个节点(1→2→3):释放链表内存,避免内存泄漏。:存储节点值(此处为整型)使用二级指针修改头节点指针。:指向下一个节点的指针。:在链表头部插入新节点。分步删除节点并打印结果。时间复杂度:O(1)时间复杂度:O(n)

2025-05-16 16:55:38 917

原创 在Linux中如何使用Kill(),向进程发送发送信号

以上代码通过 kill()函数向指定进程发送 SIGINT 信号,可通过外部传参将接收信号的进程 pid 传入到程序中,再执行该测试代码之前,需要运行先一个用于接收此信号的进程.

2025-05-14 16:12:33 546

原创 在linux中,如何使用malloc()函数向操作系统申请堆内存,使用free()函数释放内存。

如果分配内存失败(譬如系统堆内存不足)将返回 NULL,如果参数 size 为 0,返回值也是 NULL。二、free()函数原型。

2025-05-14 11:58:13 466

原创 在Linux中使用 times函数 和 close函数 两种方式 打印进程时间。

times函数用于获取当前进程的时间信息,其原型为clock_t times(struct tms *buf),需包含头文件<sys/times.h>。该函数将时间信息存储在struct tms结构体中,参数buf指向该结构体。返回值类型为clock_t,表示从系统启动到当前时刻的时钟滴答数,可通过除以节拍率转换为秒数。若调用失败,返回-1并设置errno。struct tms包含用户CPU时间、系统CPU时间及子进程的相关时间。示例代码展示了如何使用times函数测量代码段的执行时间,并输出用

2025-05-13 15:51:25 592

原创 在Liunx中,使用stat 函数获取文件的相关信息。(详细)

struct stat 是内核定义的一个结构体,在<sys/stat.h>头文件中申明,所以可以在应用层使用,这个结构体中的所有元素加起来构成了文件的属性信息。通过 stat(), fstat(), 或 lstat() 系统调用获取。它记录了文件的类型、权限、大小、时间戳等信息。

2025-04-29 14:25:51 617

原创 在Linux中,如何使用系统调用fsync()将参数fd所指的文件数据和元数据写入磁盘?

将文件描述符fd关联的文件数据及其元数据(如修改时间、权限等),确保数据在系统崩溃或断电后不会丢失。fd是已打开文件的描述符(通过open()获取)。成功时返回0。失败时返回-1,并设置errno表示错误原因(如EBADFEIO等)

2025-04-28 11:04:58 990 1

原创 在Linux中,使用标准IO库,进行格式化IO操作

作用:将格式化数据输出到标准输出(stdout)。示例: 作用:将格式化数据输出到指定的文件流(如文件、标准错误流)。示例: 作用:将格式化数据输出到文件描述符指定的文件(需包含 )。示例: 作用:将格式化数据写入字符数组中。风险:不检查缓冲区大小,可能导致溢出。示例: 作用:安全版的,指定缓冲区大小防止溢出。示例: 输入函数 作用:从标准输入(stdin)读取格式化数据。示例: 2.作用:从文件流中读取格式化数据。示例: 作用:从字符串中解析格式化数据。

2025-04-27 14:53:34 319

原创 在Linux中使用ferror()函数和feof()函数判断文件是否读取成功,或者读取指针是否到达了文件末尾?

检测文件流是否到达了文件末尾(End-of-File, EOF)。:检测文件流是否发生了读写错误(如磁盘损坏、权限不足等)。

2025-04-27 14:00:19 388

原创 在Linux中,使用IO标准库进行读写操作。

【代码】在Linux中,使用IO标准库进行读写操作。使用到的函数有:fopen()、fwrite()、fseek()、fread()、fclose()

2025-04-27 13:35:46 237

原创 在Linux中使用fcntl函数和ioctl函数

(File Control)用于操作文件描述符(file descriptor)的属性或行为,提供对文件或设备的通用控制接口。,提供与硬件设备或内核驱动交互的接口。控制摄像头、打印机、磁盘等设备的底层行为(如调整分辨率、弹出光盘)。管理文件的记录锁(文件区间锁),防止多进程竞争。的参数和命令需严格参考设备文档或内核头文件(如。(如设置串口波特率、网络接口参数),必须用。修改终端参数(如波特率、数据位)。(如非阻塞模式、文件锁),优先用。修改文件描述符的阻塞模式(如。示例二 ioctl函数。

2025-04-27 13:29:57 601

原创 在Linux中使用truncate函数和ftruncate函数来实现截断文件

示例二 ftruncate函数。示例一 truncate函数。

2025-04-24 13:03:15 450

原创 在Linux中,如何操作文件描述符复制,使用dup()函数

【代码】在Linux中,如何操作文件描述符复制,使用dup()函数。

2025-04-24 11:32:01 279

原创 在Linux中,如何使用文件描述符多次打开同一文件,并写入数据?

在Linux中,如何使用文件描述符多次打开同一文件,并写入数据?

2025-04-24 10:43:17 267

原创 在Linux中,使用read函数去读取写入文件空洞部分时,读取出来的内容是什么?为什么这样操作,以及应用场景?

使用 `read` 函数读取文件空洞(hole)部分时,读取到的内容会被系统填充为 `'\0'`(即零字节)。文件空洞是稀疏文件中未实际分配磁盘空间的区域,但逻辑上表现为连续的零字节。- 空洞部分不会占用实际磁盘空间(通过 `du -h hole_file` 可验证),但逻辑上表现为连续的零字节。- 例如,上述示例文件的总逻辑大小为 `5 + 10MB + 5`,但物理大小仅约为 `10KB`(取决于文件系统)。- 使用 `read` 读取空洞时,系统会返回零字节填充的缓冲区,与普通未初始化内存不同。

2025-04-23 12:16:45 524

原创 printf 函数,常用的格式化输出样式

函数用于格式化输出,它允许你指定不同的格式说明符来控制输出的格式。这些格式说明符可以与各种标志、宽度、精度和长度修饰符组合使用,以实现更复杂的格式化输出。表示打印一个有符号整数,并用前导零填充到至少8位宽;表示打印浮点数并保留两位小数。

2024-10-30 15:38:02 765

原创 C语言中一般内存溢出的情况

在C语言中,内存溢出(Memory Overflow)通常指的是程序尝试写入的数据超过了为其分配的内存空间。这通常发生在数组操作中,当程序试图访问数组之外的内存时,就可能发生内存溢出。内存溢出是一个严重的安全问题,因为它可能导致程序崩溃、数据损坏,甚至可能被恶意利用来执行任意代码。5.不正确的内存释放:在释放内存后没有将指针设置为NULL,然后将再次使用该指针。2.错误的内存分配:在动态分配内存时,没有正确计算所需的内存大小。4.缓冲区溢出:向一个固定大小的缓冲区写入过多的数据。

2024-10-24 17:53:04 932

原创 嵌入式系统---看门狗

在嵌入式系统中,看门狗定时器(Watchdog Timer,WDT)是一种常用的机制,用于检测和恢复系统在异常情况下的故障。如果系统因为某种原因(如软件死循环)而变得无响应,看门狗定时器可以自动重启系统,从而防止系统长时间处于不可用状态。要“关闭”看门狗定时器,通常意味着停止喂狗,让看门狗定时器超时并触发重启。在某些系统中,可能需要特殊的操作或权限来完全禁用看门狗定时器,这通常不推荐在正常运行的系统中进行,因为它会降低系统的可靠性和稳定性。如果系统出现问题,没有及时喂狗,看门狗定时器就会超时并触发重启。

2024-10-15 16:06:59 1999

原创 C语言的32个关键字

2. **break**: 立即退出最近的 `for`、`while` 或 `do-while` 循环。25. **static**: 声明静态变量或函数,具有限制的作用域和持久的生命周期。10. **else**: 与 `if` 配合使用,表示“否则”执行的代码块。27. **switch**: 条件语句,允许基于不同的情况执行不同的代码块。7. **default**: 用于 `switch` 语句,表示默认选项。3. **case**: 用于 `switch` 语句中,表示一个选项。

2024-07-05 11:27:43 698

原创 C语言标准库中的函数

`strncpy`: 复制一个字符串到另一个字符串,最多复制指定数量的字符。- `strncat`: 将一个字符串的部分添加到另一个字符串的末尾。- `strstr`: 查找一个字符串在另一个字符串中首次出现的位置。- `strcat`: 将一个字符串添加到另一个字符串的末尾。- `strchr`: 查找字符串中第一次出现指定字符的位置。- `strtok_r`: 可重入版本的 `strtok`。- `strcpy`: 复制一个字符串到另一个字符串。

2024-07-05 11:24:55 586

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除