- 博客(73)
- 资源 (4)
- 收藏
- 关注
转载 八张图带你快速认识MOS管
三极管是流控型器件,MOS管是压控型器件,两者存在相似之处。三极管机可能经常用,但MOS管你用的可能较少。对于MOS管先抛出几个问题:如何区分P-MOS和N-MOS;如何区分MOS的G、D、S管脚;MOS管的寄生二极管方向如何;MOS管如何导通;带着这几个问题,再看下面的内容,你会理解的更快、更多。...
2022-05-06 20:17:43 2192
原创 STM32特殊引脚
1.PC13,PC14,PC15这三个引脚是用来控制备份电池区域的。2.PB3,PB4,PA13,PA14,PA15是JTAG调试端口引脚。配置为普通IO //PC13,14,15 RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE ); PWR_BackupAccessCmd( ENABLE );/* 允许修改RTC和后备寄存器*/ RCC_LSEConfig( RCC_LS
2021-06-03 15:08:37 3850
原创 SPI学习笔记
一、基本原理SPI是串行外设接口(Serial Peripheral Interface)的缩写。是 Motorola 公司推出的一种同步串行接口技术,是一种高速的,全双工,同步的通信总线。优点:1.支持全双工通信 2.通信简单 3.数据传输速率快缺点:没有指定的流控制,没有应答机制确认是否接收到数据,所以跟IIC总线协议比较在数据可靠性上有一定的缺陷。它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共
2021-02-20 16:26:46 669
转载 do...while(0)的妙用
在C++中,有三种类型的循环语句:for, while, 和do…while, 但是在一般应用中作循环时,我们可能用for和while要多一些,do…while相对不受重视。但是,最近在读我们项目的代码时,却发现了do…while的一些十分聪明的用法,不是用来做循环,而是用作其他来提高代码的健壮性。do…while(0)消除goto语句。通常,如果在一个函数中开始要分配一些资源,然后在中途执行过程中如果遇到错误则退出函数,当然,退出前先释放资源,我们的代码可能是这样//version1b.
2020-11-27 12:06:38 141
转载 Getmemory函数详解--内存操作的理解
题目一:void GetMemory(char *p){ p = (char *)malloc(100);}void Test(void){ char *str = NULL; GetMemory(str);//目的是通过此函数给str空间 strcpy(str, "hello world"); printf(str);}出现问题:在函数内部修改形参并不能真正的改变传入实参的值代码解析:1.调用 GetMemory(str) 后,str并未产生变化
2020-11-08 23:19:34 3878
转载 内存碎片产生原因及终极解决办法
内存碎片通常分为内部碎片和外部碎片:内部碎片是由于采用固定大小的内存分区,当一个进程不能完全使用分给它的固定内存区域时就产生了内部碎片,通常内部碎片难以完全避免;外部碎片是由于某些未分配的连续内存区域太小,以至于不能满足任意进程的内存分配请求,从而不能被进程利用的内存区域。现在普遍采用的段页式内存分配方式就是将进程的内存区域分为不同的段,然后将每一段由多个固定大小的页组成。通过页表机制,使段内的页可以不必连续处于同一内存区域,从而减少了外部碎片,然而同一页内仍然可能存在少量的内部碎片,只是一页的内存
2020-11-08 00:31:30 2975
转载 栈和堆的具体区别
栈(stack)和堆(heap)的具体区别1、在申请方式上栈(stack): 现在很多人都称之为堆栈,这个时候实际上还是指的栈。它由编译器自动管理,无需我们手工控制。 例如,声明函数中的一个局部变量 int b 系统自动在栈中为b开辟空间;在调用一个函数时,系统自动的给函数的形参变量在栈中开辟空间。堆(heap): 申请和释放由程序员控制,并指明大小。容易产生memory leak。在C中使用malloc函数。如:char *p1 = (char *)malloc(10);在C++中用new运算
2020-11-08 00:05:49 718
转载 linux下如何用GDB调试c++程序
GDB 是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。 一般来说,GDB主要帮忙你完成下面四个方面的功能:启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)当程序被停住时,可以检查此时你的程序中所发生的
2020-11-06 17:36:48 174
转载 数据结构与算法 ---- 斐波那契查找
// 斐波那契查找.cpp #include "stdafx.h" #include <memory> #include <iostream> using namespace std; const int max_size=20;//斐波那契数组的长度 /*构造一个斐波那契数组*/ void Fibonacci(int * F) { F[0]=0; F[1]=1; for(int i=2;i&
2020-10-28 17:06:26 166
原创 数据结构与算法 ---- 插值查找
基于折半查找算法,将查找点的选择改进为自适应的,根据关键字在整个有序表中所处的位置,让mid的值更靠近关键字key,这样也就间接减少了比较次数,大大提高了效率。public class InsertionSearch{public static int InsertionSearch(int[] a, int value, int low, int high){ int mid = low+(value-a[low])/(a[high]-a[low])*(high-low); if(a[m.
2020-10-28 11:29:21 118
原创 数据结构与算法 ----堆排序
升序#include <stdio.h>#include <stdlib.h>#define MAX 9//单个记录的结构体typedef struct { int key;}SqNote;//记录表的结构体typedef struct { SqNote r[MAX]; int length;}SqList;//将以 r[s]为根结点的子树构成堆,堆中每个根结点的值都比其孩子结点的值大void HeapAdjust(SqList * H,
2020-10-23 15:55:45 112
原创 数据结构与算法 ---- 希尔排序
希尔排序和折半插入排序都是对直接插入排序的改进折半插入排序:https://blog.csdn.net/qq_41877840/article/details/109227231希尔排序过程:#include <stdio.h>void ShellSort(int a[], int n);int main(){ int i; int a[10] = {2,6,2,9,4,20,18,7,1,5}; ShellSort(a,10); for(i=0; i<10;.
2020-10-23 09:31:30 110
原创 数据结构与算法 ---- 折半插入排序
#include <stdio.h>void BInsertSort(int a[], int n);int main(){ int i; int a[10] = {2,6,2,9,4,0,18,7,1,5}; BInsertSort(a,10); for(i=0; i<10; i++) printf("%d ",a[i]); return 0;}void BInsertSort(int a[], int n){ int low, high,mid,
2020-10-22 17:49:33 239
原创 数据结构与算法 ---- 直接插入排序
采用直接插入排序算法将无序表{3,1,7,5,2,4,9,6}进行升序排序的过程为:(1)首先考虑记录 3 ,由于插入排序刚开始,有序表中没有任何记录,所以 3 可以直接添加到有序表中,则有序表和无序表可以如图 1 所示:(2)向有序表中插入记录 1 时,同有序表中记录 3 进行比较,1<3,所以插入到记录 3 的左侧,如图 2 所示:(3)向有序表插入记录 7 时,同有序表中记录 3 进行比较,3<7,所以插入到记录 3 的右侧,如图 3 所示:(4)向有序表中插入记录 5 时,
2020-10-22 16:56:28 345
转载 数据结构与算法 ---- 二路归并排序
二路归并排序主要运用了“分治算法”,分治算法就是将一个大的问题划分为n个规模较小而结构相似的子问题。这些子问题解决的方法都是类似的,解决掉这些小的问题之后,归并子问题的结果,就得到了“大”问题的解。二路归并排序主旨是“分解”与“归并”分解:1.将一个数组分成两个数组,分别对两个数组进行排序。2.循环第一步,直到划分出来的“小数组”只包含一个元素,只有一个元素的数组默认为已经排好序。归并:1.将两个有序的数组合并到一个大的数组中。2.从最小的只包含一个元素的数组开始两两合并。此时,合并好的数组
2020-09-19 20:08:00 446
原创 git学习笔记
git init:把当前目录变成Git可以管理的仓库git add < file >:把文件添加到仓库git commit -m < message >:把文件提交到仓库git status 查看版本库状态git diff可以查看修改内容git reset --hard commit_id 回到commit_id版本git log 可以查看提交历史,以便确定要回退到哪个版本git reflog查看命令历史,以便确定要回到未来的哪个版本ssh-keygen -t rs.
2020-09-11 08:29:20 97
转载 数据结构与算法 ---- 快速排序算法
快速排序:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。举个栗子详细的说明一下:下面序列把第一位57作为基准位,用变量把它存起来,因为一会就没了a.把所有比57小的数放在57的左面,把比57大的数放在57的右面b.两边同时进行,左边找大的,右边找小的,把小的放左边,大的放右边,具体操作如下:第一趟:从指针j开始,24小于57,放到左边,把5.
2020-09-05 16:15:03 198
转载 数据结构与算法 ---- 选择排序算法
#include<iostream>using namespace std;#define N 10 void Select_Sort(int* arr, int n) //arr为数据数组,n为数组长度{ for (int i = 0; i < n; i++) { int min = i; for (int j = i; j < n; j++) { if (arr[min] > arr[j]) { min = j; } } .
2020-09-05 14:52:26 107
原创 数据结构与算法 ---- 冒泡排序算法
冒泡排序是一种简单的排序算法,它也是一种稳定排序算法。其实现原理是重复扫描待排序序列,并比较每一对相邻的元素,当该对元素顺序不正确时进行交换。一直重复这个过程,直到没有任何两个相邻元素可以交换,就表明完成了排序。假设待排序序列为 (5,1,4,2,8),如果采用冒泡排序对其进行升序(由小到大)排序,则整个排序过程如下所示:第一轮排序,此时整个序列中的元素都位于待排序序列,依次扫描每对相邻的元素,并对顺序不正确的元素对交换位置,整个过程如图 1 所示。从图 1 可以看到,经过第一轮冒泡排序,从.
2020-09-04 22:08:35 1401
转载 各种数据类型在16位、32位和64位系统下所占字节差异简介
编写C、C++程序时需要考虑每种数据类型在内存中所占的内存大小,即使同一种数据类型在不同平台下所占内存大小亦不相同,具体对比如下:
2020-09-04 11:03:46 272
转载 MQTT,CoAP,LWM2M,UDP,TCP各自特点
UDP 用户数据报协议(UDP,User Datagram Protocol)传输层协议1.是无连接的,即发送数据之前不需要建立连接。2.尽最大努力交付,即不保证可靠交付3.传输效率高,适用于对高速传输和实时性有较高的通信或广播通信。4.支持一对一,一对多,多对一和多对多的交互通信。TCP传输控制协议(TCP,Transmission Control Protocol)传输层协议1.TCP面向连接(如打电话要先拨号建立连接)。2.提供可靠的服务,3.通过TCP连接传送的数据,无差错,不丢失,
2020-08-23 21:12:19 1327
转载 数据结构与算法 ---- 图的广度优先搜索(BFS)和深度优先搜索(DFS)
1.前言和树的遍历类似,图的遍历也是从图中某点出发,然后按照某种方法对图中所有顶点进行访问,且仅访问一次。但是图的遍历相对树而言要更为复杂。因为图中的任意顶点都可能与其他顶点相邻,所以在图的遍历中必须记录已被访问的顶点,避免重复访问。根据搜索路径的不同,我们可以将遍历图的方法分为两种:广度优先搜索和深度优先搜索。2.图的基本概念2.1.无向图和无向图顶点对(u,v)是无序的,即(u,v)和(v,u)是同一条边。常用一对圆括号表示。顶点对<u,v>是有序的,它是指从顶点u到顶点 v
2020-08-11 11:49:24 823
转载 数据结构与算法 ---- 哈希表查找
1、哈希查找也叫散列查找,整个散列查找过程大概分两步(1)在存储时通过散列函数计算记录的散列地址,并按此散列地址存储该记录。(2)当查找时,一样通过散列函数计算记录的散列地址,然后访问散列地址的记录。散列函数的构造方法(1)直接定址法取关键字的某个线性函数值为散列地址f(key) = a × key +b需要事先知道关键字的分布情况,适合查找表较小且连续的情况。(2)数字分析法使用关键字的一部分来计算散列存储的位置。 适合处理关键字位数较大的情况。(3)平方取中法假设关键字是1234
2020-08-10 15:05:51 269
原创 数据结构与算法 ---- 分块查找
算法简介分块查找又称索引顺序查找,它是顺序查找的一种改进方法。算法思想(1)将n个数据元素"按块有序"划分为m块(m ≤ n)。每一块中的结点不必有序,但块与块之间必须"按块有序";即后一块中任一元素都必须大于前一块中最大的元素;(2)块之间进行二分或者顺序查找,块内进行顺序查找算法流程1、先选取各块中的最大关键字构成一个索引表;2、查找分两个部分:先对索引表进行二分查找或顺序查找,以确定待查记录在哪一块中;3、在已确定的块中用顺序法进行查找。实现代码#include <stdi
2020-08-10 11:34:23 1473
原创 数据结构与算法 ---- KMP算法(串模式匹配算法)
KMP算法是对BF算法的改进,利用了在匹配过程中得到的信息跳过不必要的匹配,从而达到一个较高的匹配效率。next数据next数组是用来记录模式串弟j位和主串第i位匹配失败时,模式串需要移到k位继续主串第i位匹配。next数组实际上记录的是模式串每一位前面的最长可匹配后缀和最长可匹配前缀,上图:!![在这里插入图片描述](https://img-blog.csdnimg.cn/20200806092203223.png...
2020-08-06 11:28:42 362
转载 数据结构与算法 ---- BF算法(串模式匹配算法)
串的模式匹配算法,通俗地理解,是一种用来判断两个串之间是否具有"主串与子串"关系的算法。主串与子串:如果串 A(如 “shujujiegou”)中包含有串 B(如 “ju”),则称串 A 为主串,串 B 为子串。主串与子串之间的关系可简单理解为一个串 “包含” 另一个串的关系。实现串的模式匹配的算法主要有以下两种:①普通的模式匹配算法(BF);②快速模式匹配算法(KMP);BF算法原理(暴力解法)普通模式匹配算法,其实现过程没有任何技巧,就是简单粗暴地拿一个串同另一个串中的字符一一比对,得到.
2020-08-05 17:01:00 985
转载 数据结构与算法 ---- 平衡二叉树(AVL树)
平衡二叉树,又称为 AVL 树。实际上就是遵循以下两个特点的二叉树:①每棵子树中的左子树和右子树的深度差不能超过 1;②二叉树中每棵子树都要求是平衡二叉树; 其实就是在二叉树的基础上,若树中每棵子树都满足其左子树和右子树的深度差都不超过1,则这棵二叉树就是平衡二叉树。平衡因子:每个结点都有其各自的平衡因子,表示的就是其左子树深度同右子树深度的差。平衡二叉树中各结点平衡因子的取值只可能是:0、1 和 -1。如图 1 所示,其中 (a) 的两棵二叉树中由于各个结点的平衡因子数的绝对值都不超过 1.
2020-08-05 15:47:09 653
转载 数据结构与算法 ---- 二叉排序树
什么是二叉排序树?二叉排序树要么是空二叉树,要么具有如下特点:(1)二叉排序树中,如果其根结点有左子树,那么左子树上所有结点的值都小于根结点的值;(2)二叉排序树中,如果其根结点有右子树,那么右子树上所有结点的值都大小根结点的值;(3)二叉排序树的左右子树也要求都是二叉排序树;例如,图 1 就是一个二叉排序树:使用二叉排序树查找关键字二叉排序树中查找某关键字时,查找过程类似于次优二叉树,在二叉排序树不为空树的前提下,首先将被查找值同树的根结点进行比较,会有 3 种不同的结果:(1)如果相等
2020-08-05 08:20:11 519
转载 数据结构与算法 ---- 二分查找
二分查找,也称折半查找,在某些情况下相比于顺序查找,使用折半查找算法的效率更高。但是该算法的使用的前提是静态查找表中的数据必须是有序的。二分查找(折半查找)算法对静态查找表{5,13,19,21,37,56,64,75,80,88,92}采用折半查找算法查找关键字为 21 的过程为:如上图 1 所示,指针 low 和 high 分别指向查找表的第一个关键字和最后一个关键字,指针 mid 指向处于 low 和 high 指针中间位置的关键字。在查找的过程中每次都同 mid 指向的关键字进行比较,由.
2020-08-04 20:39:56 902
原创 C语言 ---- FILE文件操作
文件操作C语言文件为流式文件,进行C语言文件的存取时,都会先进行“打开文件”操作,这个操作就是在打开数据流,而“关闭文件”操作就是关闭数据流。读取文件当进行文件读取时,不会直接对磁盘进行读取,而是先打开数据流,将磁盘上的文件信息拷贝到缓冲区内,然后程序再从缓冲区中读取所需数据,如下图所示:写入文件当写入文件时,并不会马上写入磁盘中,而是先写入缓冲区,只有在缓冲区已满或“关闭文件”时,才会将数据写入磁盘,如下图所示。打开文件fp = fopen("c:\\test.txt", "r") //
2020-08-01 21:58:32 501
原创 Cortex M3 ---- 寄存器组
Cortex‐M3 处理器拥有 R0‐R15 的寄存器组R0-R12:通用寄存器R0‐R12 都是 32 位通用寄存器,用于数据操作。但是注意:绝大多数 16 位 Thumb 指令只能访问 R0‐R7,而 32 位 Thumb‐2 指令可以访问所有寄存器。Banked R13: 两个堆栈指针Cortex‐M3 拥有两个堆栈指针,然而它们是 banked,因此任一时刻只能使用其中的一个。z 主堆栈指针(MSP):复位后缺省使用的堆栈指针,用于操作系统内核以及异常处理例程(包括中断服务例程)z
2020-07-27 11:10:05 493
转载 float浮点数的二进制存储方式图解
首先先讲怎么将小数转换成二进制数字(两个实例)1、对于数字 80.125,怎么将其转换成二进制呢?对于整数部分 80 转换成二进制,就是 1010000而对于小数部分 0.125,可以看下面的图( 一直乘 2 ,遇到 1 退出。如果乘 2 之后的数字大于 1,则减去 1 )所以 0.125 转换成小数就是 0.001所以 80.125 转换成的二进制数就是1010000.0012、对于数字 12.2,怎么将其转换成二进制呢?对于整数部分 12 转换成二进制,就是 1100而对于小数部分 0
2020-07-25 21:47:08 1335 1
原创 总线 ---- SPI总线协议
简介SPI是Motorola 公司推出的一种同步串行接口技术,是一种高速的,全双工,同步的通信总线。在芯片的管脚上占用四根线,SPI的四根线分别为:SDI(MISO) :主器件数据输入,从器件数据输出SDO(MOSI) :主器件数据输出,从器件数据输入SCLK:时钟信号,由主器件产生。CS:从器件使能信号,由主器件控制选择实能哪个器件spi主从硬件连接图内部工作原理图SPI接口在内部硬件实际上是两个简单的移位寄存器,传输的数据为8位,在主器件产生的从器件使能信号和移位脉冲下,按位传输,
2020-07-25 09:47:45 867
原创 总线 ---- IIC总线
简介I2C总线是飞利浦(PHLIPS)公司推出的一种半双工串行总线,用于连接微控制器及其外围设备, I2C串行总线有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。 它仅通过两根信号线就可以完成对所有挂载在I2C总线上的从器件进行操作。这样的好处是可以大大的节省我们微处理器的IO口资源。硬件连接IIC总线可以挂载多个主设备和多个从设备,同一时刻只能有一个主设备两根信号线都接上拉电阻,总线在空闲状态下为高电平IIC时序在数据传输过程中,时钟信号为高电平期间,数据线上的数据必须保持稳定
2020-07-24 22:34:10 571
原创 C语言 ---- volatile关键字的作用
Volatile意思是“易变的”,应该解释为“直接存取原始内存地址”比较合适。作用:volatile的作业的是告诉编译器不要对该变量进行优化,这个变量可能会有意向不想的改变,然后都会直接从变量内存地址中读取数据,从而可以提供对特殊地址的稳定访问。如果没有volatile声明,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。编译器优化介绍: 由于内存访问速度远不及CPU处理速度,为提高机器整体性能,1)在硬件上: 引入硬件高速缓存Cac
2020-07-23 16:29:38 422
0.96OLED显示屏STM32F103C8T6_IIC.7z
2020-10-18
基于Zigbee的智能家居.7z
2020-09-11
嵌入式C语言精华+.pdf
2020-07-26
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人