- 博客(91)
- 收藏
- 关注
原创 3. C51版本Keil环境搭建
以管理员身份打开下载好的 keil软件查看CID,用于购买证书将从代理商那里购买到的官方证书输入,点击添加添加完成后,激活时效显示如下,说明成功。
2025-11-14 13:44:46
88
原创 48. LINUX网络编程(4)
若业务并发低但要求强隔离,选多进程UDP服务器;若业务高并发且能接受线程共享资源的复杂度,选多线程UDP服务器。两者均通过“一请求一执行单元(进程/线程)”的方式实现UDP并发,充分利用了UDP“无连接、数据报独立”的特性。
2025-11-14 00:50:42
262
原创 47. LINUX网络编程(3)
网络编程常用函数socket() 创建套接字bind() 绑定本机地址和端口connect() 建立连接listen() 设置监听端口accept() 接受TCP连接recv(), read(), recvfrom() 数据接收send(), write(), sendto() 数据发送close(), shutdown() 关闭套接字在网络通信中:⚙️ 四、每个函数的作用详解1️⃣ socket() — 创建套接字作用:创建一个通信端点(“电话机”)。返回值:成功返回一个 s
2025-11-14 00:26:09
663
原创 46. 嵌入式 Linux 环境下网络编程部分实战
以下是 嵌入式Linux环境下 与 配套实战代码,包含 IPv4/IPv6 双场景的 IP 转换、Socket 地址绑定、数据收发基础流程,代码可直接编译运行,适配嵌入式 Linux(如 ARM、x86 架构)。二、核心流程解析(嵌入式重点关注)1. 双栈 Socket 创建用 创建 IPv6 Socket,通过 开启双栈模式,让 Socket 同时监听 IPv4 和 IPv6 连接(嵌入式 Linux 内核需开启 配置)。若仅需 IPv4,可将地址族改为 ,IP 字符串用 (通配地址)
2025-11-13 03:10:45
453
原创 45. LINUX网络编程(2)
类比面向连接 (TCP)无连接 (UDP/IPX)日常比喻打电话 📞发短信 📩连接状态先建立连接再通信直接发消息是否确认每条消息都确认不确认可靠性高低速度稍慢很快应用举例文件下载、网页语音聊天、视频直播“面向连接”和“无连接”描述的是数据传输是否需要建立通信状态和确认机制。TCP/IP:面向连接、可靠传输。UDP / IPX:无连接、快速传输。Socket(套接字)”其实就是:程序之间(通常是两台电脑之间)通信的一个“接口”。一根可以传输数据的“管道。
2025-11-13 02:57:13
356
原创 44. 网络编程基础
接口”这个词本意是:两个系统之间进行交互(交流、沟通)的边界。你家电视的遥控器就是一个接口:你按按钮(输入),电视机响应(输出)。USB 接口让键盘、U盘与电脑通信。软件系统也一样,不同的程序模块之间要交流,就需要一个接口。供程序员使用的一组函数、方法、命令、或通信规则,用于与某个软件系统、硬件设备或模块进行交互。能做什么(功能)怎么做(调用方式)输入输出是什么(参数和返回值)不需要关心内部细节(黑盒思想)编程接口是程序与程序之间交流的“约定”,定义了怎么用,而隐藏了怎么做。
2025-11-13 01:24:54
466
原创 43. LINUX网络编程(1)
网络互联促成了TCP/IP协议的产生从此,TCP/IP协议诞生1983年ARPAnet上停止使用NCP,互联网上的主机全部使用TCP/IP协议。TCP/IP协议成为Internet中的“世界语”
2025-11-12 20:58:06
730
原创 42. CMake + GCC + 交叉编译联合调试(gdbserver + QEMU 实战)
阶段工具操作编写代码C / CMake使用模块化结构交叉编译生成 ARM ELF模拟运行QEMU验证功能远程调试单步跟踪 ARM 程序硬件部署scp / tftp传输到开发板执行现场调试远程调试目标设备。
2025-11-09 21:09:14
769
原创 41. CMake
阶段学习内容示例入门单文件项目进阶模块化工程实战静态库 / 动态库高级条件控制 + 变量if / set专业交叉编译 + 外部库现代target-based 写法模块内容✅ 基础结构🧩 模块化⚙️ 控制编译📦 库管理🔧 可移植性toolchain 跨平台编译🏗️ 安装install() 导出结构🧠 现代化🚀高级 CMake 实战:构建一个嵌入式驱动框架(支持多平台交叉编译 + 动态配置)我们现在进入CMake 高级实战篇——
2025-11-09 21:08:04
1063
原创 40.交叉编译
在一台电脑上编译出在另一种架构上运行的程序。你的开发主机:Ubuntu x86_64目标设备:ARM Cortex-A7你希望在 Ubuntu 上写好代码,然后生成能在 ARM 板子上运行的.elf或.bin文件。这时,就需要交叉编译器(cross compiler)。[源代码]│▼[交叉编译器 (arm-linux-gnueabi-gcc)]│├── 编译(.o)├── 链接(.elf)└── 转换(.bin/.so)▼[目标程序] → 上传至嵌入式设备 → 运行。
2025-11-09 21:06:40
978
原创 2. 单片机基础概述
在一个芯片上实现一个完整的计算机系统就是单片微型计算机,简称单片机,俗称 MCU/微控制器当然,有些有机械件的外围,由于材料的问题无法集成,如键盘,如显示器。STC8H 系列单片机是不需要外部品振和外部复位的单片机,是以超强抗干扰/超低价/高速/低功耗为目标的 8051单片机,在相同的工作频率下,STC8H 系列单片机比传统的 8051约快 12 倍(速度快 11.2~13.2倍),依次按顺序执行完全部的111条指令,STC8H 系列单片机仅需 147 个时钟,而传统 8051 则需要1944 个时钟。
2025-11-09 01:31:18
1063
原创 1. 学习内容
学习内容: 会读芯片手册,能看懂原理图,能自己绘制开发板,点灯,pwm, adc,中断系统,电位器,数码管,温湿度传感器,独立按键,矩阵键盘,rtc时钟,外部中断,IIC协议, SPI协议, USB的hid协议,uart通讯,蓝牙芯片通讯等。学习以上内容一定要配合逻辑分析仪去学习。stc现在有32位的单片机,但是建议入门选8位的,对于新手来讲,stc8便宜,资源丰富,各种外设都支持,学习难度不大,作为入门是最佳选择。况且从开发角度来看,会了8位的,再上手32位的就是水到渠成,毫不费力的事情,反之则不然。
2025-11-08 01:08:21
172
原创 36. 进程的基本概念与进程的创建、运行与回收
对象静态 or 动态是否占资源是否有独立内存空间是否并发执行示例程序静态(磁盘文件)❌ 否❌ 否❌ 否hello.out进程动态(运行时)✅ 是✅ 是✅ 是线程动态(进程内部)✅ 是❌ 否,共享进程资源✅ 是上下文指的就是 CPU 执行某个进程时的所有寄存器状态、程序计数器位置、栈顶指针等。把当前进程A的寄存器、栈顶指针等保存到它的 PCB;从进程B的 PCB 中恢复寄存器状态;CPU 就能继续执行进程B。这就是上下文切换。概念桌面 Linux 中的对应。
2025-11-07 00:11:32
916
原创 5. Unix/Linux 系统常用类型别名清单
以下是 Unix/Linux 系统编程中高频使用的“类型别名”(均为库定义,非 C 语言关键字),按“类型名-头文件-底层类型-用途”结构化整理,兼顾准确性和实用性:以下是 Unix/Linux 系统常用类型别名的代码示例 + 详细解释,覆盖所有类型的核心使用场景:解释: 用于标识进程, 父进程返回子进程 PID,子进程返回 0,失败返回 -1。/ 分别获取当前进程和父进程的 PID。解释: 表示用户唯一标识, 返回当前用户的 UID, 用户的 UID 为 0。 同理,标识用户组。解释: 表示用户组唯
2025-11-06 16:27:57
1020
原创 11. C语言 sprintf() 和 sscanf()
操作方向函数示例类似操作写入字符串sprintf()格式化输出到字符串printf()输出到屏幕从字符串读取sscanf()从字符串中提取数据scanf()从键盘输入安全版本snprintf()限制输出长度——函数作用方向典型用途安全版本sprintf()格式化输出到字符串输出构造字符串、调试打印snprintf()sscanf()从字符串读取数据输入协议解析、配置读取——printf()输出到屏幕输出控制台显示——scanf()从键盘读取输入输入用户输入——
2025-11-03 04:23:53
575
原创 35. 文件IO (6)
模块主要功能涉及API应用场景文件日志系统数据记录fwritefprintf温度记录、错误日志文件配置系统参数保存fopenfscanfrenameWiFi、ID配置文件恢复机制防掉电保护rename, 校验安全更新配置虚拟文件系统驱动调试/proc/sysLinux 驱动层通信文件I/O不仅仅是“读写数据”,更是一种系统通信机制;嵌入式设备通常通过“伪文件系统”与用户交互;合理的文件设计 =数据可靠 + 调试可控 + 系统安全;
2025-11-03 04:20:31
606
原创 34. 文件IO (5)嵌入式系统中的文件 I/O 实现机制 文件I/O与设备I/O的关系(驱动视角)
函数功能open()打开一个文件或设备文件read()从文件/设备读取数据write()向文件/设备写入数据close()关闭文件或设备ioctl()控制设备的特殊操作(I/O Control)
2025-11-02 02:16:32
629
原创 33. 文件IO (4) 二进制文件操作与结构体存储 文件路径与目录操作
fwrite是处理二进制数据的“主力函数”,其核心优势是按字节精确操作连续内存块,不依赖数据的文本格式,适用于结构体、数组、二进制文件等场景。用二进制模式打开文件(wb通过返回值判断写入是否完整;结合fflushfsync确保数据可靠落盘。它与fread配合,是实现二进制数据持久化的核心工具。fread是处理二进制数据读取的“主力函数”,其核心优势是按字节精确读取连续数据块,不依赖文本格式,适用于结构体、数组、二进制文件等场景。用二进制模式打开文件(rb检查返回值并结合feofferror。
2025-11-01 15:08:36
617
原创 32. 文件IO (3) 文件缓冲区与同步机制
层次名称谁控制可否跳过是否物理写入应用层FILE 缓冲C库可跳过否系统调用层write()OS否否内核层Page CacheOS可通过 O_DIRECT 跳过否(延迟写)驱动层Block I/O驱动程序否是硬件层Flash/SD/磁盘控制器否✅ 真正写入fsync()是保证数据持久性的“最后一道防线”,其核心价值在于强制将内核缓冲区中的数据写入物理磁盘,避免系统崩溃导致的数据丢失。
2025-11-01 04:03:42
884
原创 31. 文件IO (2) 文件指针与定位操作
在 C 语言文件 I/O 中,缓冲区(Buffer)是内存中一块临时存储区,用于暂时存放从文件中读取或要写入文件的数据。C 标准库(stdio.h)中的所有文件操作函数(如printffprintffwrite等)都是带缓冲的 I/O。避免频繁调用系统调用(readwrite),因为那会触发上下文切换,非常慢;提高磁盘访问效率;使 I/O 操作可以批量进行(写够一批再写)。
2025-10-31 05:01:51
834
原创 3. vim上手
在Ubuntu下使用Vim是Linux系统中非常基础且重要的技能,Vim是一款高效的文本编辑器,以“模式化操作”为核心,初期可能有点难上手,但熟练后会极大提升编辑效率。以下从。
2025-10-30 22:52:42
804
原创 30. 文件IO (1) 文件 I/O 基础概念与文件的基本读写操作
文件(File)是操作系统用来组织和管理数据的基本单位。一张图片(.jpg)一个程序(.elf)还是一个串口设备(/dev/ttyUSB0)在操作系统看来,它们都是“文件”。👉换句话说:在 Linux / Unix / 嵌入式系统中,“一切皆文件”。分类内容文件数据区实际内容,例如文本、二进制数据文件控制块(FCB)存储文件的元信息,如文件名、权限、大小、时间戳等在 C 程序中,当你打开一个文件时,操作系统并不是直接给你文件的内容,而是返回一个。
2025-10-29 22:55:44
912
原创 22. 课件整理 文件IO
文件写入操作完成后,文件指针会自动指向文件末尾。解决办法有两种:一是通过后续讲解的方法移动文件指针到文件头;二是关闭文件后重新打开,文件指针会重置到文件开头。核心区别在于存储格式:文本文件仅能存储文本内容,其数据以字符编码形式存储;二进制文件可存储任意类型数据(如图片、音频、程序数据等),数据以二进制形式直接存储。该程序完全满足“每隔1秒追加时间、序号递增、Ctrl-C中断”的需求,且保证了文件操作的安全性。成功时返回读取的字符;若到文件末尾或出错时返回EOF(值为-1)。到文件末尾或出错时返回NULL。
2025-10-29 22:53:00
1028
原创 10. 弱智问题整理(1)
结构体类型别名在 C 语言的标准输入输出库<stdio.h>中,系统已经提前定义了一个管理文件流的结构体(用于存储文件的状态、缓冲区、读写位置等信息),并通过typedef给这个结构体起了一个别名——FILE。// 标准库 <stdio.h> 中隐含的定义(简化版)// 包含文件描述符、缓冲区、读写状态等成员int fd;// ... 其他文件管理字段} FILE;当你在代码中时,就会自动引入这个typedef定义,因此可以直接用FILE作为类型来声明指针(如FILE *fp;FILE *
2025-10-29 03:14:27
1026
原创 9. C语言void *详解
qsort是 C 语言中强大的通用排序工具,通过自定义比较函数可适配任意数据类型的排序需求。包含<stdlib.h>→ 定义比较函数 → 调用qsort并传入参数。掌握它能大幅简化排序逻辑,避免重复实现不同类型的排序算法。优点缺点可通用地处理不同类型的数据无法进行指针算术提供了一种灵活的接口设计方式类型安全问题支持动态内存分配与多种数据结构必须显式转换为具体类型。
2025-10-29 03:00:38
708
原创 8. int main(int argc, char *argv[]) 与 int main()
用于需要命令行参数的程序,argc是参数个数,argv是参数数组(包含程序名和用户输入);int main():用于无需外部参数的程序,代码逻辑完全固定。选择哪种形式取决于程序是否需要通过命令行动态接收输入——例如写一个简单的计算器,若希望通过直接计算,就必须用带参数的main函数。
2025-10-28 21:11:27
271
原创 27.条件编译与宏调试技巧(系统深入讲解)
包含三大部分:1️⃣ 用宏控制不同平台代码(跨平台编译)2️⃣ 嵌入式中利用 映射寄存器与位操作3️⃣ 用宏生成通用驱动模板(宏元编程思想)在多平台(如 ARM、x86、RISC-V)编译同一份代码时,不同平台往往有不同的指令集、寄存器、系统调用。条件编译可以让同一份代码在编译时自动选择对应实现。或:✅ 示例:跨平台控制编译时,根据不同平台自动打印不同内容。💡 原理:编译器会自动为不同架构定义系统宏:就相当于在源码里:✅ 示例:跨平台系统调用在编译时:在 Windows
2025-10-27 20:15:23
755
原创 29. Makefile 创建和使用变量
自动变量是Makefile中一类特殊的变量,它们由make自动提供,通常用于表示规则中的目标文件依赖文件命令等内容。自动变量通常在构建规则中使用,帮助你简化和动态化构建过程。自动变量说明使用场景$@目标文件的名称用于表示当前规则的目标文件$<第一个依赖文件用于表示规则中的第一个依赖文件$^所有依赖文件(去重)用于表示所有的依赖文件所有比目标文件新的依赖文件用于增量构建时,更新过的依赖文件$*目标文件的文件名部分用于获取目标文件的文件名(不含扩展名)$(@D)目标文件的目录部分。
2025-10-27 20:12:10
920
原创 28. C语言高级编程 Makefile
目标文件名定义变量TARGET,值为calc,表示最终要生成的可执行文件名称(即编译的目标产物)。后续用$(TARGET)引用该变量,若需修改输出文件名,只需改这里即可,无需修改整个文件。# 源文件定义变量SRC,值为所有参与编译的C源文件列表main.cadd.csub.c若后续新增源文件(如mul.c),只需在此处添加,无需修改编译规则。# 编译器CC = gcc定义变量CC,值为gcc,指定使用GCC编译器。若需更换编译器(如clang),只需将gcc改为clang。
2025-10-27 11:49:27
690
原创 1. 电压和电流
电流的产生电学的第一个概念,电流电路与电池电路就是电流导通的道路,电池是一种特殊的通过化学反应产生能量的装置, 电池正极,吸收电子,电池负极发送电子。一个电池和灯泡组成电流的方向两百年前的科学家无法观测到电子● 猜测电流是:正极->负极● 但真实情况是,电子是:负极->正极不过这些不影响,因为电流的定义是:正电荷的流动方向,即正极->负极(和负电荷相反)我们不必关心实际电子的流动方向,只需要记住 正极->负极 即可,现代电路全部是基于 正极->负极 设计和应用的AC和DC交流电和直流电AC是
2025-10-26 17:14:25
703
原创 7. C语言高级编程-内存管理
auto是默认存储类别,如果你不显式指定存储类别,局部变量就会被当作auto变量处理。这种变量存储在栈区,生命周期仅限于函数调用期间。static关键字用于声明静态变量,无论是局部变量还是全局变量,它们都会有静态生命周期。这种变量不会在函数调用结束后销毁,生命周期贯穿整个程序运行。extern关键字用于声明一个外部变量,这个变量是在别的文件中定义的,但我们可以在当前文件中访问它。它用于跨文件共享变量,使得多个文件可以引用同一个变量。register关键字建议编译器将变量存储在。
2025-10-26 14:12:56
971
原创 6. C语言 共用体及typedef
共用体(union)和结构体(struct)很像,但它们在内存上的工作方式完全不同。特性structunion各成员都有独立的内存✅ 是❌ 否(共享同一段内存)内存大小所有成员大小之和最大成员的大小同时保存多个值可以只能保存一个成员的值概念structuniontypedef内存独立每个成员独立占空间所有成员共用空间不影响内存,仅起别名用途数据组织内存复用、位操作、硬件寄存器类型简化、可读性提升嵌入式意义模块化数据寄存器映射统一风格、提高可维护性。
2025-10-26 13:30:17
597
原创 5. C语言 结构体
/ 普通变量// 初始化// 结构体数组// 指针方式概念说明嵌入式意义struct把不同类型数据组合在一起封装硬件数据结构typedef给结构体起别名简化代码风格指针访问用->操作成员操作寄存器、通信结构内存对齐保证性能、兼容性影响结构体大小位域按位操作寄存器精确控制硬件位嵌套结构体中再包含结构体模块化设计。
2025-10-25 21:15:52
952
原创 2. C语言 多级指针
简单来说:多级指针就是 “指向指针的指针”。一级指针 → 指向一个普通变量;二级指针 → 指向一个一级指针;三级指针 → 指向一个二级指针;以此类推。层级声明解引用表达式代表含义一级int *p;*p变量的值二级int **pp;**pp变量的值三级int ***ppp;***ppp变量的值N级int *...*p;*(...*(p))层层解引用到原始变量模块指针层级常见用途函数指针回调机制函数指针数组事件表二维数组int **arr动态矩阵字符串数组。
2025-10-24 15:01:47
576
原创 3. char、字符串、字符串数组、二维字符数组、char[] 的区别与联系
类型定义存储位置可否修改应用二维字符数组栈区✅ 可修改临时变量字符指针数组栈区+文字区❌ 只读常量表、命令表字符指针char *p栈区(指针变量)❌ 指向只读字符串参数字符数组char str[]栈区✅ 可修改缓冲区、输入输出知识点关键理解"Hello"是字符串常量(只读)char *p指向字符串首地址char str[]可修改的数组副本存放字符串指针的数组真正的二维字符数组p[i]等价于*(p+i)整个数组字节大小当前字符串长度项目含义list数组,包含若干个。
2025-10-24 14:36:28
488
原创 1. C语言 指针和数组
指针是一个存放地址的变量。你可以把它理解为“指向另一个变量的箭头int a = 10;// 普通变量// p 是一个指针,存放 a 的地址名称内容地址a100x1000p0x10000x2000// 打印 p 中的地址(&a)// 打印 a 的值(10)✅ “*p” 表示“取出 p 指向地址中的值✅ “&a” 表示“取出 a 的地址数组是一组相同类型的连续内存单元C 语言中数组名其实就能隐式转换为指针(地址)。元素地址值arr[0]0x100010arr[1]0x1004。
2025-10-24 14:26:20
347
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅