- 博客(28)
- 收藏
- 关注
原创 vscode 通过 SSH 远程控制 Ubuntu
1. 安装网络工具,方便后续查看ubuntu的网络ip。记住虚拟机的IP地址,一会要用。二、vscode 环境搭建。2.打开设置,选择第一个。4.查看ssh是否运行。5.然后查看本机ip。
2026-06-13 17:08:33
124
原创 Windows与Ubuntu共享文件夹设置
打开WMware中我们的虚拟机设置,然后点击选项,找到共享文件,配置为总是启用,再选择我们在windows中创建的share文件夹的路径,最后选择启用此共享就好了。进入我们的Linux系统,然后再次创建一个文件夹:share,用来有windows共享,最后这个文件夹与windows创建的share文件是互通的。最后我们要设置一下每一次启动Linux都可以与windows可以共享文件。挂载成功后就可以与windows通过共享文件来交流了。一、在Windows中创建用于共享的文件夹。二、配置VMware。
2026-05-06 18:06:04
90
原创 常用的CMake函数
优先使用 target 系列函数:用()替代全局函数,实现模块化管理;合理选择库类型:嵌入式平台优先使用静态库(STATIC),避免动态库依赖问题;跨平台适配技巧:结合和if判断,编写兼容多平台的脚本;文件管理建议:小型项目用简化操作,大型项目手动列文件提升可控性;脚本调试技巧:用打印变量值,排查脚本逻辑错误。
2026-02-27 17:05:11
576
原创 LVGL源码获取和裁剪
摘要:本文介绍了LVGL图形库的源码获取与裁剪方法。首先从官网下载v8.3版本资源包,然后进行文件裁剪,仅保留移植所需的必要文件。重点说明了各文件夹的作用及裁剪建议:demos和examples可完全删除,src为核心源码需选择性保留,lv_conf.h为关键配置文件。详细解析了porting文件夹下的显示驱动、输入设备和文件系统三个移植模板的功能及使用建议。通过合理裁剪可显著减小工程体积,同时确保核心功能正常运行。
2026-02-27 14:09:27
983
原创 Linux——socket通信
本文详细解析了Linux/Unix系统下Socket网络编程的核心函数,涵盖TCP/UDP全流程。重点讲解了socket()创建套接字、bind()绑定地址、listen()监听连接、accept()接收连接等TCP专用函数,以及UDP专用的recvfrom()/sendto()函数。文章详细说明了每个函数的参数含义、返回值、使用场景和常见错误,特别强调了字节序转换的必要性。同时对比了TCP面向连接和UDP无连接的特性差异,为网络编程新手提供了全面的函数使用指南和注意事项,帮助开发者系统掌握Socket编程
2026-02-25 18:26:35
706
原创 Linux ——条件变量
条件变量核心价值:解决 “线程等待条件” 的问题,避免无效轮询,提升 CPU 利用率;核心函数;(必带互斥锁);(唤醒一个)/(唤醒所有);;关键规则条件变量必须和互斥锁配合使用;条件判断用while而非if(解决虚假唤醒);典型场景:生产者 - 消费者模型、线程池、任务队列等;核心逻辑:加锁→判断条件→wait(释放锁 + 阻塞)→被唤醒→重新加锁→再次判断条件→执行逻辑→解锁 + 唤醒。
2026-02-22 23:43:51
557
原创 Linux——互斥锁
互斥锁核心作用:保证同一时间只有一个线程操作共享资源,解决竞态条件;核心函数;(阻塞)/(非阻塞);;;关键注意点避免死锁(重复加锁、交叉锁);解锁前必须加锁,且只有持有锁的线程能解锁;根据锁持有时间选择互斥锁(长)或自旋锁(短)。
2026-02-22 22:12:08
615
原创 Linux——线程
摘要:Linux系统中线程本质是共享地址空间的轻量级进程(LWP),通过pthread库实现线程管理。核心函数包括pthread_create()创建线程、pthread_join()等待线程、pthread_exit()终止线程。多线程操作共享资源时需使用互斥锁(pthread_mutex)等同步机制避免竞态条件。线程优势在于创建/切换开销小、通信成本低,但稳定性较差,单个线程崩溃会导致整个进程退出。编译时需链接-lpthread库,使用时需注意资源回收和同步问题。
2026-02-22 20:44:40
662
原创 Linux 进程通信——信号量
核心定位:有名信号量是跨进程同步 / 互斥的轻量级方案,通过 “名称” 实现内核级共享;核心操作sem_open(创建 / 打开)→sem_wait(阻塞申请)/(非阻塞申请)→sem_post(释放唤醒)→sem_closesem_unlink(清理);关键参数:初始值 0(同步)/1(互斥),名称以开头;避坑核心:编译链接pthread+rt,处理sem_wait的信号中断,手动清理信号量避免残留。
2026-02-20 23:49:01
687
原创 Linux 进程通信——信号
信号是 Linux 内核向进程发送的,用于通知进程发生了特定事件(如错误、用户操作、进程间通信),进程可捕获、忽略或按默认行为处理。⚠️ 关键区分:与 “信号量(Semaphore)” 无关联 —— 信号是 “事件通知”,信号量是 “同步 / 互斥计数器”。在 Linux中,信号(signal)是一种常用的进程间通信(IPC)机制,用于进程之间的异步通知。通过发送信号,一个进程可以通知另一个进程发生某些事件。信号和我们学习单片机时的中断异常概念是非常类似的,信号是一种软件中断。
2026-02-20 23:35:04
605
原创 Linux进程通信——消息队列
唯一性:队列名称以开头,系统内唯一;权限:创建队列时的mode参数决定其他进程能否打开;资源清理mq_close()仅关描述符,才彻底删除队列;数据传输:支持任意字节流(字符串 / 结构体),仅关注长度,不解析内容;阻塞 / 非阻塞mq_flags作用于所有操作(发送 + 接收),需按需设置。
2026-02-20 00:38:01
801
原创 Linux进程通讯——共享内存
本文介绍了Linux下共享内存的高效进程通信机制。共享内存通过让多个进程直接访问同一块物理内存区域,避免了数据拷贝开销,是速度最快的IPC方式。手册详细解析了核心概念、POSIX共享内存API(shm_open、ftruncate、mmap等)的使用流程和注意事项,强调必须配合同步机制保证数据安全。共享内存适用于大数据量、低延迟场景,但需要严格遵循创建→映射→使用→释放的顺序,并注意资源清理。
2026-02-19 00:50:52
613
原创 Linux 进程间通信 —— 匿名管道和命名管道
是清理命名管道的必备函数,解决管道文件残留问题;(2)调用时机:通信完成、关闭文件描述符后立即调用;(3)核心特性:删除文件目录项,不影响正在打开该文件的进程的操作;(4)错误处理:调用后检查返回值,用perror()定位删除失败原因。知识点关联逻辑命名管道创建(mkfifo)mkfifo()创建文件,unlink()清理文件管道生命周期命名管道需unlink()手动销毁,匿名管道自动销毁管道残留问题unlink()是解决管道残留的唯一方式。
2026-02-16 00:51:27
640
原创 Linux 进程核心知识
execl()成功后,子进程代码被完全替换,原代码后续逻辑永不执行;僵尸进程的核心解决方式是父进程调用wait()waitpid(),而非等待系统自动释放;WNOHANG是实现 “非阻塞监控” 的关键,无此参数则父进程会阻塞到子进程退出;fork()创建的是独立进程(非线程),父子进程有独立 PID 和资源,线程则共享进程资源;父进程的main()逻辑(如监控循环)会持续执行,不受子进程execl()/ 退出的影响。
2026-02-14 01:24:14
734
1
原创 Linux 文件操作:open、close、write、read、seek的用法
本文介绍了Linux系统调用中文件操作的四个核心API:open()用于打开/创建文件,支持多种模式和权限设置;close()用于关闭文件描述符,防止资源泄漏;write()实现数据写入,需注意字符串处理和写入位置;read()完成数据读取,强调缓冲区管理和文件指针控制。每个函数详细说明了参数、返回值和使用注意事项,为文件I/O操作提供了完整的编程参考。
2026-02-13 01:10:34
435
原创 Linux嵌入式应用中make/makefile/cmake详解
在Linux嵌入式开发中,gcc、make、makefile、cmake四者协同工作,构成了完整的项目构建流程,核心逻辑是“简化配置、自动化编译、跨平台适配”,具体流程可分为以下几步,结合实际开发场景梳理如下:编写源代码:开发者使用编辑器(如Vim、VS Code)编写嵌入式项目的源代码(.c、.cpp文件)、头文件(.h文件),明确项目的功能模块、依赖关系(如驱动模块依赖硬件抽象层头文件)。
2026-02-11 21:17:07
520
原创 【蓝桥杯】按键长按短按双击功能的实现 STM32
本文介绍了一种基于状态机的STM32按键长按短按功能实现方案。通过硬件上拉电阻设计和软件定时器中断机制,结合四状态(空闲、消抖、按下确认、长按等待释放)的状态机模型,有效解决了机械按键抖动问题,并准确识别短按(<1秒)和长按(≥1秒)事件。系统采用1ms定时器中断扫描按键状态,通过结构体管理多个按键的状态和事件标志,实现了高效稳定的按键检测功能。该方案逻辑清晰、资源占用低,适用于嵌入式系统开发。
2025-11-26 00:21:12
1355
原创 深入解析CAN总线:从原理到应用
•CAN总线()控制器局域网总线•CAN总线是由BOSCH公司开发的一种简洁易用、传输速度快、易扩展、可靠性高的串行通信总线,广泛应用于汽车、嵌入式、工业控制等领域•CAN总线特征:1.两根通信线(CAN_HCAN_L),线路少2.差分信号通信,抗干扰能力强3.高速CANISO11898):4.低速CANISO11519):5.异步,无需时钟线,通信速率由设备各自约定6.半双工,可挂载多设备,多设备同时发送数据时通过仲裁判断先后顺序7.11位/29。
2025-05-20 17:48:02
5086
1
原创 单片机中的 Flash、RAM、堆和栈详解:它们都存放什么?彼此有什么关系?
在嵌入式开发中,理解STM32单片机的内存结构对程序设计和系统稳定性至关重要。STM32F103系列包含Flash、RAM、堆(Heap)和栈(Stack)等存储器资源。Flash是非易失性存储器,用于存储程序代码和常量,地址从0x08000000开始,大小为64KB。RAM是易失性存储器,用于运行时数据存储,地址从0x20000000开始,大小为20KB,分为.data、.bss、堆和栈等段。堆用于动态内存分配,从低地址向上增长;栈用于函数调用和局部变量,从高地址向下增长。Flash和RAM在启动时通过.
2025-05-17 23:42:25
3174
原创 [C语言]结构体详解,自定义类型:结构体.
C语⾔已经提供了内置类型,如:char、short、int、long、float、double等,但是只有这些内置类 型还是不够的,假设我想描述学⽣,描述⼀本书,这时单⼀的内置类型是不⾏的。描述⼀个学⽣需要 名字、年龄、学号、⾝⾼、体重等;描述⼀本书需要作者、出版社、定价等。C语⾔为了解决这个问 题,增加了结构体这种⾃定义的数据类型,让程序员可以自己创造适合的类型。
2024-10-19 18:27:41
428
1
原创 【stm32f103c8t6】SysTick滴答定时器延时函数详解
首选要先选择滴答定时器的时钟源(8分频还是1分频)在这里我选择的是8分频。当我们选择8分频的时候,滴答定时器的计数频率就是9MHZ,(也就是计数寄存器 (VAL)1秒计数9 000 000次),计数寄存器一次的时间就是 1/9000000 秒,当计数9次时就是1us,计数器每计数一次就会减一,当减为0 时,重装载寄存器 (LOAD)的值就会给计数寄存器 (VAL),同时控制寄存器 (CTRL)的COUNTFLAG位会置一个标志位。根据这个标志位来判断是否计数1us。
2024-07-15 14:20:15
2292
原创 【C语言】二维数组的传参详解,二维数组作为函数参数的传参
在我们来了解二维数组的传参之前,首先要了解二维数组在内存中是怎么存放的。在了解二维数组在内存中是怎么存放的之前不妨先了解一下一维数组在内存中是怎么存放的。
2024-07-13 21:55:23
2591
3
原创 【STM32F103C8t6】【HAL】HC-SR04超声波测距模块详解
该文章主要讲解以stm32f103c8t6为主控,用HAL库来对HC-SR04超声波模块的进行代码编写。代码的主要核心思路是通过定时的输入捕获模式对Echo的信号进行捕获,这里我采用的是双通道的形式分别捕获Echo的上升沿和Echo的下降沿。通过分别读取两个通道捕获的计数值,然后做差就可以得到Echo信号的高电平时间。
2024-07-12 17:10:19
4583
3
原创 STM32创建HAL库工程 (手把手教)
HAL库是ST公司目前主力推行的开发方式,全称就是Hardware Abstraction Layer(抽象印象层)。库如其名,很抽象,一眼看上去不太容易知道他的作用是什么。但它相对于标准库来说更加简洁高效,同样的功能,标准库可能要用几句话,HAL库只需用一句话就够了。并且HAL库也很好的解决了程序移植的问题。因此HAL库是ST未来主推的库。
2024-04-10 23:12:58
6569
3
原创 C语言中的system()函数详解,并用其实现电脑关机
如何使用C/C++来实现电脑关机呢??让自己也当一次黑客。在C/C++中为我们提供了system()函数,本章就是通过用system()来实现电脑关机。在实现用C/C++中的system()函数来实现电脑关机之前我们先来了解一下电脑的。
2024-02-04 14:28:12
1340
3
原创 rand() C/C++ 随机数的产生
rand函数⽣成随机数的默认种⼦是1,需要注意的是:srand函数是不需要频繁调⽤的,⼀次运⾏的程序中调⽤⼀次就够了。那么什么是伪随机数呢?程序中在调⽤rand函数之前先调⽤srand函数,通过srand函数的参数seed来设置rand函数⽣成随 机数的时候的种⼦,只要种⼦在变化,每次⽣成的随机数序列也就变化起来了。,
2024-02-03 23:10:39
600
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅