自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(75)
  • 收藏
  • 关注

原创 bootloader的全面解析

我们在实现一个boot工程时,包括boot和app程序。需要哪些步骤呢?1:与外界通信协议栈,有线也好,无线也好,本质来说都一样。因为一般来说app程序都比较大,几十个k字节的数据,单片机不可能一次性申请那么大的缓存去存放这些数据,只能是分包去发送,上位机发送完成一包,等待单片机响应,单片机接收到完整一包后,校验没问题就将其写入到内部flash中,发送接收完成信号给上位机,然后继续接收下一包。

2024-05-02 14:27:12 745

原创 IIC协议通信解析,内附完整代码。

这里在发送有效数据位时,有一个规范,在SCL引脚为高电平时,SDA的电平不能被修改,这是数据的采样时刻,数据交互时,会在SCL引脚高电平时进行数据的采样。(3)我们一般使用的IIC协议都是模拟的IIc协议,也就是我们通过时序图来进行对应电平切换模拟出的IIc通信代码。(2)为了进行通信,每一个可以进行IIC通信的从机的芯片手册上会标出该自己用于IIC通信的地址。(1)对于IIC总线来说,它是可以同时接入多个从机进行通信的,但是注意只能是主机(单片机)进行唯一的数据读写操作。根据代码也能很好的看出来,

2023-06-19 16:51:08 2389

原创 STM32F103引脚输入输出模式详解

复用推挽输出(GPIO_Mode_AF_PP)之前学习的时候,比较奇怪的时,为什么有了推挽输出模式,还需要复用推挽输出呢???看过32单片机的数据手册的都知道,对于芯片的每一个内置外设来说,都有它自己的数据寄存器(DR)。而复用推挽输出的输出模式和普通推挽输出的输出模式不同点就在此处。复用输出时,引脚的高低电平数据来源于复用外设模块的数据寄存器。普通输出时,引脚的高低电平数据来源于32中GPIO模块的数据寄存器。所以说我们在使用一些复用功能时,就需要将输出的引脚配置为复用输出模式。

2023-04-03 11:31:47 4807 2

原创 SPI通信协议

SPI 规定了两个 SPI 设备之间通信必须由主设备 (Master) 来控制次设备 (Slave). 一个 Master 设备可以通过提供 Clock 以及对 Slave 设备进行片选 (Slave Select) 来控制多个 Slave 设备, SPI 协议还规定 Slave 设备的 Clock 由 Master 设备通过 SCK 管脚提供给 Slave 设备, Slave 设备本身不能产生或控制 Clock, 没有 Clock 则 Slave 设备不能正常工作。

2023-03-31 08:32:05 1283

原创 排序算法:堆排序,快速排序,归并排序。内附完整代码和算法思路详解。

第一次归并1和5,使得1,5有序,第二趟归并1,5,6,使得1,5,6,有序。第三趟归并4,7,使得4,7,有序。第二趟归并1,5,6,和4,7使得1,4,5,6,7,有序。

2022-12-30 21:47:19 757

原创 Linux: C实现动态线程池。

所谓的池概念:都是事先创建好一些事物的集合,在需要使用时,直接调用即可。而不是在需要时才去创建。这里所讲的线程池,其实就是若干个线程的集合,形成的线程池。

2022-11-16 15:31:41 522

原创 Linux:多进程版本的服务端分析与实现

这里需要注意的是,一定要在创建子进程之前进行信号处理函数的注册。因为在linux操作系统下,进程的执行顺序是随机的,哪个进程抢到cpu的时间片,哪个进程就先执行。这里让父进程在创建子进程前注册信号处理函数,是为了防止在父进程还未执行到注册信号时子进程就已经执行完代码并退出了,这样就会产生僵尸进程

2022-10-06 08:00:00 441

原创 Linux:IPC进程间通信,管道 ,FIFO文件。

管道是一种最基本的IPC通信方式,他只适用于有血缘关系的进程间通信。父子进程和兄弟进程。对于两个不相干的进程间,不适用这种通信方式

2022-10-04 21:34:27 516

原创 Linux:虚拟地址空间,程序和进程,创建并回收子进程,孤儿进程和僵尸进程。为什么要回收子进程?

其实对于任何一个进程来说,它被执行起来,都会由系统给他分配一块虚拟地址空间,但是在该进程退出时,它只能释放自己用户区的资源。那么会使得每启动一个进程就会损失一个G的虚拟地址空间资源,那么这样下去系统资源总会被占满的。

2022-08-20 15:17:07 458 2

原创 Linux中make命令和makefile文件的编写,最后附完整代码。

makefile三要素makefile中的变量与常用函数1:普通变量的定义和使用2:自动变量3:常用函数4:目标与伪目标makefile的总体简介makefile的编写

2022-08-13 08:14:25 895

原创 认识Linux文件信息,文件相关权限,文件的软硬链接。一篇让你完全看懂Linux中文件信息。

一:认识文件信息二:文件的软硬链接2.1:什么是硬链接2.2:硬链接2.3:软链接三:文件的权限解读3.1:文件权限3..2:修改文件的权限3.3:修改文件的拥有者和所属组

2022-08-09 10:47:24 676

原创 Linux基础命令汇总。

Linux基础命令介绍:whoami:查看当前登录的账户pwd:查看当前所在位置ls -laicd:进入指定的目录中,可配合pwd查看rm/rm -r:删除文件/删除目录touch:创建新文件tree:目录中文件按照树状展开mkdir/mkdei -p 创建目录/创建多个目录mancp :拷贝mv :文件的移动which :查看命令的组成其他命令补充.........

2022-08-05 10:41:15 246

原创 STL中map容器使用详解,对组类型的简单剖析。

对组是将一对值合成一个值,这一对值可以是不同的数据类型(当然也可以是相同的数据类型元素)。两个值可以分别使用pair的两个公有属性first和second去访问map容器在进行元素插入的时候,就会对元素进行排序,而排序使用的数据,就是对组元素中键值的大小(默认是从小到大排序规则,也可以指定其他排序规则。使用迭代器进行遍历时,遍历时的顺序是根据指定的排序规则遍历的)......

2022-07-28 15:20:46 706 1

原创 浅析STL三大组件,容器 算法 迭代器。

迭代器是容器与算法之间的胶合剂,所有STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。所以说,我们想遍历某一个容器,就必须使用这个容器的迭代器才可以。...

2022-07-27 16:15:43 626

原创 C++自定义实现string类型

对于C++中独有的一种类型,string类型不管在使用还是维护,都特别的方便。那么今天我们就来自定义实现一个string类型。

2022-07-26 08:33:47 1295

原创 C++模板技术实现 泛型编程,通俗易懂的泛型编程教程//。

我们使用同一个函数模板去操作交换两种不同类型的数据时,是完全可以实现的,这样就很好的避免的相同功能代码被重复开的的情况。在使用函数模板时,我们也可以指定泛型的类型,然后再传入参数,当然参数的类型需要和指定的类型一致。。...

2022-07-16 13:39:27 1584

原创 C++多态:静态多态(函数地址早绑定),动态多态(函数地址晚绑定)虚函数表,虚析构函数重写。

只要类中存在修函数或纯虚函数,那么类内就会自动生成一个虚函数表指针,指向一张虚函数表,在这个虚函数表中,存放着类内所有虚函数的地址。当这个类被它的子类继承时,子类也会继承这个虚函数表指针,与虚函数表,(注意两张虚函数表不是同一张表,可以理解为复制了一张虚函数表交给子类的虚函数标配指针。)现在只要子类中对父类的虚函数和纯虚函数进行函数重写,那么子类中重写后的函数地址就会将原来的函数地址覆盖掉。这样就实现了动态的多态。.........

2022-07-11 10:36:25 1531 2

原创 C++继承(二)多继承,菱形继承,继承中同名成员问题的解决,虚继承。虚基类表和虚基类表指针。

我们通过base1所占空间大小来看,base1继承于person类,而person类中,只有一个int类型的数据,那么根据结构体的内存对齐方式,这里的结果应该是四个字节,而不是8个字节。所以说在base1中,除了person类中的int类型数据,还有一个其他类型的变量,这个变量就是虚基类表指针。指向一张虚基类表............

2022-07-04 16:54:52 633

原创 C++继承(一)继承的格式与三种不同继承方式, 三种继承的示意图,简单继承案例说明继承作用 ,

使用公共继承后,父类中的公共属性,在子类中也属于公共属性,父类中的保护属性,在子类中也属于保护属性。那么对于保护继承来说,子类保护继承于父类后,会将父类中的公共属性与保护属性下的数据都继承到他自己的保护权限下。对于私有继承来说:子类会将父类中所有的属性全都继承到子类的私有权限下。......

2022-07-01 15:41:06 1525

原创 C++运算符重载(二)简单易懂的智能指针教程,指针类运算符重载。->运算符重载,*运算符重载,【】运算符重载。最后附带完整实现代码。

在C++中使用new实例化一个该类的对象时,使用完这个对象后我们需要自己去释放这一块向堆区申请的空间。那么如果我们忘记释放某一个new出来的对象,那么就可能造成内存泄漏的情况。为了避免这样的情况出现,就出现了智能指针这个概念。...

2022-06-27 18:02:37 1511

原创 C++中类的运算符重载教程(一),内附完整代码与解析

我们在实现完成类的两对象+重载函数后,再直接进行两个对象相加时,+运算符会自动匹配operator+函数,然后p1与p2分别与该函数的第一个,第二个参数类型相匹配,最后成功调用该函数。

2022-06-24 18:18:06 1807

原创 简单易懂的C++类的友元教程(friend)。全局函数做类友元,一个类做另一个类的友元,一个类中某个成员函数做友元。过程中顺序很重要哦。最后附有完整实现代码

我们直接让代码走起来,可以看到结果很明确。通过breather中的vist函数,可以直接访问building类的私有属性了。现在在breather类中,只有在vist函数体内才能访问building类的私有属性了。 最后附上完整代码......

2022-06-22 23:59:20 1701 1

原创 类与对象的关系,类创建多个对象,类创建单一对象,静态成员变量与静态成员函数,类的单例模式设计。

单例模式设计(1)将构造函数定义在私有权限下:(2):私有化一个此类的静态成员指针并初始化(3):公有化创建一个静态成员函数

2022-06-19 15:47:34 928

原创 类(class)中的构造函数,析构函数,深拷贝与浅拷贝。最后附有完整代码。

(1)默认构造函数:默认无参数,函数名与类名相同,不写返回类型。(2)有参构造函数:有参数,函数名与类名相同,不写返回类型。(3)拷贝构造函数:函数名与类名相同,不写返回类型。 但是参数类型必须为 const 类名 & p(最后这个p可以任意啊)深拷贝与浅拷贝的对比。............

2022-06-18 09:59:02 918

原创 使用 c++ 和 c 分别描述一个圆,浅谈c++面向对象编程和c面向过程的区别(内附详细代码)

3:class中可以定义函数,就是c++对c最重要的增强之一,这里我们可以将一个类型的所有属性,通过类来表示,而不需要像c中那样,需要将某一类的一些需要计算的属性,封装到外部函数中。

2022-06-14 19:55:47 362

原创 数据结构:树和(c实现)二叉树(非线性结构) 前中后序列遍历二叉树,通过前序的方式创建一个二叉树。内附完整代码

根据字符串"abc##de#g##f###"以前序方式,创建一个二叉树,#代表空节点。二叉树特点:(1)每一个节点最多有两个子树。(每个节点的度不大于2) (2)二叉树的左右子树的顺序不能颠倒。NULL代表的是空节点,为了后面理解方便我把他们画了出来。到了这个节点就不能再向下分了。

2022-05-30 20:42:44 611

原创 数据结构:(c实现)手把手教你实现栈和队列(内附详细代码)

一:栈(1)栈的基本概念(物理图解)在标准规定里,栈是一种特殊的线性表,有栈底和栈顶两端,规定它只能从栈顶出入数据,所以这也是栈的一个基本原则:先入栈的后出栈(后入栈先出栈)。我们在实现一个栈时,通常使用顺序表来实现,以顺序表的表尾来做栈顶。例如上面的一个栈,栈底的位置一直不改变,从栈顶进一个数据(指向栈顶的指针加一),然后又从栈顶出一个数据(指向栈顶的指针减一)。(2)栈的基本结构以及初始化typedef int Stack_data_type;#define M.

2022-05-22 11:17:29 1065 2

原创 数据结构:(链表经典好题)单链表翻转。找到单链表的中间结点 。合并两个有序链表,使得结果依旧有序。判断环形链表。求解单链表的入口(快慢指针操作单链表)

单链表翻转。找到单链表的中间结点 。合并两个有序链表,使得结果依旧有序。判断环形链表。求解单链表的入口(快慢指针操作单链表)

2022-05-19 21:55:13 233 1

原创 数据结构:(c实现)双向带头循环链表。双向,带头,循环分别代表什么? 链表的基本操作接口实现,头增,头删,尾增,尾删,任意位置数据的插入删除(内附详细代码与图解)

一:如何实现双向带头循环链表 (1)链表单个结点的结构 (2)带头??头是什么 (3)双向??互相指向。 (4)循环??尾结点与哨兵位互相指向。二:各种链表接口函数的实现(1)创建哨兵位结点的函数 (2)尾插函数实现(3)尾删函数实现(4)头增函数实现(5)头删函数实现(6)查询函数的实现(7)任意位置插入函数 (8)删除任意结点内附详细代码与图解

2022-05-16 00:38:46 288 1

原创 数据结构:(c实现)单向链表,单链表的头增,尾增,头删,尾删,任意位置的删除与插入。

一:什么是单链表 (1)单链表节点数据结构 (2)单链表结构物理图解二:单链表的几种接口函数的实现 (1)单链表的尾插函数(顺序插入) (2)单链链表一般分成两块:一部分存储数据,另一部分存储下一个节点的指针。链表与顺序表不同,链表的存储形式不是一块物理地址连续的空间。而是在内存中随机存储。需要存入一个新的数据时,就malloc开辟一个新的节点。并将新开辟的空间的地址放置到上一个节点的指针中。 再将该节点的指针赋NULL。...

2022-05-13 01:36:08 1182

原创 顺序表刷题,1:删除数组中指定的值,并返回删除后的元素个数。2:两个有序数组,a数组中有m+n块空间,但只有m个位置有元素,b数组有n个元素,将b数组有序合并到a中。(内附详细代码)

1:删除数组中指定的值,并返回删除后的元素个数。2:两个有序数组,a数组中有m+n块空间,但只有m个位置有元素,b数组有n个元素,将b数组有序合并到a中。

2022-05-10 21:26:36 193

原创 数据结构:(c实现)顺序表的 输入,输出,插入,删除,查找。(内附超详细代码)

c实现顺序表,顺序表的增改删查.内附详细代码。

2022-05-09 22:09:16 8070

原创 空指针与空类型指针,#define 与typedef,#include<stdio.h>和#include“stdio.h“

空指针与空类型指针二者都不能解引用,原因是什么,#define与typedef的区别。

2022-05-01 20:54:28 919

原创 文件操作详解,fputc,fgetc,fputs,fputs,fprintf,fscanf,fread,fwrite,fseek,ftell,rewind,c语言中各种函数操作文件..。

前言:在了解后面的文件相关操作前,我们需要知道文件的文件名代表了什么??文件名:一个文件要有一个唯一的文件标识,以便使用者调用,一个完整的文件名包含了三个部分的信息 文件路径+文件名主干+文件后缀G:\\桌面\\lianxi c++\\Project_4_24\\Project_4_24\\test.txt 详细图解如下:而我们在使用时通常将test.txt认为是该文件的文件名。文件函数介绍:(1)fputc();(向文件中写一个字符)当然传..

2022-04-26 21:04:20 1282 1

原创 fopen函数是如何打开文件,FILE类型到底是什么?文件信息区,C语言文件简单操作。

FILE类型到底是什么,fopen函数是如何打开文件的。

2022-04-24 13:08:37 5050 1

原创 c语言中数组,指针数组,数组指针,函数指针,函数指针数组,以及函数指针数组指针。循环套娃。

指针进阶

2022-04-23 10:50:28 207 1

原创 c语言中的动态内存的开辟 和释放,以及修改开辟的空间的大小,malloc,calloc,free,realloc函数的使用教程详解,内附完整申请动态空间码源。

动态内存开辟详细指南

2022-04-15 12:58:16 1763

原创 结构体如何节省空间(位段的定义) 枚举常量 联合体 创建和访问。。。。。。

系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加结构体简介结构体实现位段联合体的创建和访问联合体在内存中的存储枚举常量的创建和访问提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言提示:这里可以添加本文要记录的大概内容:在c语言的学习中,为了方便描述一些比较复杂的对象,c语言给我们定义了一些

2022-04-10 22:11:37 963 1

原创 结构体 保姆级教程 。。看完包会。结构体声明,创建和访问,结构体的自引用,结构体的内存对齐, 修改编译器的默认对齐数。

前言在c语言中,有一些基本的单一类型变量,如int char float .......等。但是这些单一类型的变量却不足以去描述一个复杂的对象,比如一个人 (人的信息有 ,身高,性别,学历,电话,住址.....等)这些东西就不能用一种单一类型的变量去描述(当然还有很多其他的复杂对象)那么,c语言为了可以很好的描述这些复杂对象,就引入了结构体的概念。结构体定义:结构体是一些值的集合,这些值被称为成员变量。结构体的每个成员变量可以是不同类型的变量这里的定义形式和数组有些类似,只不过数.

2022-04-08 19:47:37 329 1

原创 c语言初级指针详解,一级指针,二级指针。n级指针

1:1级指针首先在对指针进行理解之前,我们要清楚下面这几个个概念:1.1:内存的使用和现实生活对空间的分别方式相似,给不同的地域不同的名称。例如,北京,上海等而内存也是一块空间,所以对这块空间的不同位置进行不同的编号,用起来也会更加方便。这些编号就是我们常说的地址了。我们都知道 ,内存里最小的内存单元就是一个bit位 ,那多大的内存空间可以分配一块地址呢,在c语言的标准中规定,给每个字节大小的空间(8个比特位)配置一个专门的地址。1.2:c语言内存中数据的访问在c语言

2022-04-04 21:11:53 1795 1

空空如也

空空如也

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

TA关注的人

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