- 博客(60)
- 收藏
- 关注
原创 FreeRTOS内存管理
FreeRTOS提供了5种内存管理方法(Heap_1到Heap_5),针对嵌入式系统资源受限的特点进行优化。与标准C库的malloc/free相比,这些方法具有代码精简、线程安全、确定性执行等优势。Heap_1仅支持分配不支持释放;Heap_2使用最佳匹配算法但存在碎片问题;Heap_3基于标准库实现;Heap_4采用首次适应算法并能合并空闲内存;Heap_5可管理不连续的多块内存。每种方法都通过pvPortMalloc/vPortFree接口提供内存管理功能,并包含空闲内存检测等辅助函数。开发者可根据具体
2025-12-21 22:28:21
664
原创 堆和栈的详解
堆:一块内存空间,可以从中分配出一个小buffer,用完后再把它放回去。栈:也是一块内存空间,CPU的SP寄存器指向它,它可以用于函数调用、局部变量、多任务系统里保存现场这里可以看到,在首地址为0x20000004的位置处存入41 42 43 44。
2025-12-21 11:59:16
159
原创 ARM架构简明教程
摘要:本文介绍了ARM精简指令集(RISC)芯片的特点,包括其对内存的简单读写操作和CPU内部运算特性。重点讲解了CPU内部寄存器(R0-R15)的功能,特别是R13(SP)、R14(LR)和R15(PC)的特殊用途。文章还详细说明了常见ARM汇编指令如LDR、STR、ADD等的用法,并通过一个C函数add()的反汇编实例,展示了函数调用时寄存器和栈的操作过程,包括参数传递、局部变量存储和返回地址处理等关键环节。
2025-12-21 11:43:46
170
原创 温湿度采集系统(stm32+mqtt+Onenet云平台+esp8266)
本文设计了一个基于STM32F103C8T6的温湿度监测系统,通过SHT30传感器采集环境数据,当温湿度超出预设阈值时触发声光报警。系统包含核心控制、温湿度采集、报警输出、人机交互和电源五大模块,采用1602 LCD显示屏实时显示数据,支持按键设置阈值和查看历史记录。硬件设计注重信号稳定性和低功耗,软件实现"采集-判断-报警"闭环控制,响应时间≤2秒,适用于仓库、实验室等场景的环境监控。系统通过I2C总线通信,配备完善的电源保护电路,具有高精度(温度±0.5℃、湿度±3%RH)和可靠性的
2025-11-23 13:02:57
948
原创 STM32中--NVIC的介绍和工作原理
NVIC 支持:(10个内部中断,60个外部中断)8位的,所以256个中断(16内核+240外部),支持:256个优先级,允许裁剪。如果抢占优先级和子优先级都相同,则根据 中断向量表中的位置(自然优先级) 决定顺序,位置靠前的中断优先执行。中断A的抢占优先级更高(0 < 1),因此中断A会立即打断中断B(如果中断B正在执行)。如果两个中断的抢占优先级不同,抢占优先级高的中断会立即打断低抢占优先级的中断。如果两个中断的抢占优先级相同,子优先级高的会先执行,但不会打断对方。数值越小,优先级越高(0为最高)。
2025-08-27 21:28:22
495
原创 TCP/IP协议格式(以太网头,IP头,TCP头)以及TCP三次握手/四次挥手
一个网络报文的结构大概如下: 太网报头长度为14个字节。主要包括:目的地址占6个字节,源地址6个字节,类型2个字节。 以太网传输中的冲突和帧大小关系以太网帧大小必须在64-1518字节(不包含前导码和定界符),即包括目的地址(6B)、源地址(6B)、类型(2B)、数据、FCS(4B)在内,其中数据段大小在46~1500字节之间。以太网由前导码(7B)、定界符(1B)、目的地址(6B)、源地址(6B)、类型(2B)、数据、FCS(4B)。 前导码(preamble):交替的0和1,设备从静默状态变成有信号状
2025-03-22 21:56:46
1151
原创 网络编程知识预备阶段
OSI(Open System Interconnect)七层模型是一种将计算机网络通信协议划分为七个不同层次的标准化框架。每一层都负责不同的功能,从物理连接到应用程序的处理。这种模型有助于不同的系统之间进行通信时,更好地理解和管理网络通信的过程。OSI定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层),即ISO开放互连系统参考模型。特点:1.每一层实现不同的功能,对上层的数据做透明传输。2.每一层向上层提供服务,同时使用下层提供的服务。
2025-03-17 20:53:57
635
原创 CAN详解
CAN电平标准CAN简介•CAN总线()控制器局域网总线•CAN总线是由BOSCH公司开发的一种简洁易用、传输速度快、易扩展、可靠性高的串行通信总线,广泛应用于汽车、嵌入式、工业控制等领域•CAN总线特征:1、两根通信线(CAN_HCAN_L),线路少。2、差分信号通信,抗干扰能力强。3、高速CANISO11898):4、低速CANISO11519):5、异步,无需时钟线,通信速率由设备各自约定。
2024-11-28 22:24:12
1927
原创 【AUTOSAR标准文档】IO Hardware Abstraction 摘录
译文:I/O硬件抽象提供的ECU信号(示例)此序列图解释了第7.5.2.5章中的示例。在此示例中,传感器/执行器组件是客户端,I/O硬件抽象是服务器。传感器/执行器组件请求获取af_pressure AUTOSAR信号的新值,该信号在I/O硬件抽象层级别上是一个ECU信号。ADC(模数转换器)转换完成后,来自MCAL(微控制器抽象层)驱动程序的通知会被转换为传感器/执行器组件的RTE(运行时环境)事件。然后,传感器/执行器组件可以同步读取af_pressure信号缓冲区中存储的值。
2024-10-21 22:36:01
1283
原创 【AUTOSAR标准文档】服务类型介绍
② Memory③Crypto⑥ SystemAUTOSAR标准文档中的内容可以翻译为以下中文表述:基础软件可以细分为以下类型的服务:① 输入/输出(I/O)对传感器、执行器和ECU(电子控制单元)车载外设的标准化访问② 内存对内部/外部内存(非易失性内存)的标准化访问③ 密码学(Crypto)对包括内部/外部硬件加速器在内的密码学原语的标准化访问④ 通信对以下内容的标准化访问:车辆网络系统、ECU车载通信系统和ECU内部软件⑤ 车外通信(Off-board)
2024-10-20 00:08:02
1193
原创 【AUTOSAR标准文档】AotuSar结构横向分层详解(RTE、BSW)
TheTaskProperties微控制器抽象层是基础软件的最低层。它包含内部驱动程序,这些驱动程序是能够直接访问微控制器(µC)及其内部外设的软件模块。任务使更高的软件层与微控制器(µC)保持独立。特性实现:依赖于微控制器(µC)的上层(此处“Upper”可能指的是该层之上的软件层或接口,即该层的实现是依赖于µC的,但其为上层提供了与µC无关的接口)。
2024-10-17 23:12:04
911
原创 【C语言】预处理详解
define reg register //为 register这个关键字,创建一个简短的名字;) //用更形象的符号来替换一种实现case //在写case语句的时候自动把 break写上。// 如果定义的 stuff过长,可以分成几行写,除了最后一行外,每行的后面都加一个反斜杠(续行符)。提问:在define定义标识符的时候,要不要在最后加上;?比如:建议不要加上;,这样容易导致问题。比如下面的场景:这里会出现语法错误。
2024-08-03 12:35:05
955
原创 【C语言】程序环境
在ANSI C的任何一种实现中,存在两个不同的环境。第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。第2种是执行环境,它用于实际执行代码。
2024-07-31 21:49:50
304
原创 【C语言】动态内存管理和柔性数组详解
C语言提供了一个动态内存开辟的函数:这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。如果开辟成功,则返回一个指向开辟好空间的指针。如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己 来决定。如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。
2024-07-20 21:57:09
838
原创 【C语言】自定义类型:结构体,枚举,联合详解
有了结构体类型,那如何定义变量,其实很简单。int x;int y;}p1;//声明类型的同时定义变量p1//定义结构体变量p2//初始化:定义变量的同时赋初值。struct Stu //类型声明//名字int age;//年龄//初始化int data;//结构体嵌套初始化//结构体嵌套初始化位段的声明和结构是类似的,有两个不同:1.位段的成员必须是 int、unsigned int 或signed int。2.位段的成员名后边有一个冒号和一个数字。
2024-07-18 17:12:08
902
原创 【C语言】内存函数的介绍与模拟实现
和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。如果源空间和目标空间出现重叠,就得使用memmove函数处理。return 0;比较从ptr1和ptr2指针开始的num个字节返回值如下:int main()int n;
2024-07-08 17:37:46
334
原创 【C语言】strstr,strtok和strerror函数的介绍与模拟实现
sep参数是个字符串,定义了用作分隔符的字符集合。第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标 记。strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注: strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容 并且可修改。strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串 中的位置。
2024-07-07 00:14:26
436
原创 【C语言】字符函数和字符串函数的介绍和模拟实现
C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在 常量字符串中或者字符数组 中。字符串常量 适用于那些对它不做修改的字符串函数。字符串已经 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )。参数指向的字符串必须要以 '\0' 结束。注意函数的返回值为size_t,是无符号的( 易错 )
2024-07-05 16:39:39
862
原创 【C语言】指针和数组经典练习题(一)
1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。3. 除此之外所有的数组名都表示首元素的地址。
2024-06-30 23:40:10
463
原创 【C语言】回调函数(qsort模拟实现)
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个 函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数 的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进 行响应。使用回调函数,模拟实现qsort(采用冒泡的方式)。注意:这里第一次使用 void* 的指针,讲解 void* 的作用。
2024-06-25 10:04:07
608
原创 【C语言】函数指针数组和指向函数指针数组的指针
那要把函数的地址存到一个数组中,那这个数组就叫函数指针数组,那函数指针的数组如何定义呢?parr1 先和 [] 结合,说明 parr1是数组,数组的内容是什么呢?数组是一个存放相同类型数据的存储空间,那我们已经学习了指针数组。是int (*)()类型的函数指针。函数指针数组的用途:转移表。
2024-06-22 17:34:16
861
原创 【C语言】函数指针
pfun1可以存放。pfun1先和*结合,说明pfun1是指针,指针指向的是一个函数,指向的函数无参 数,返回值类型为void。首先,能给存储地址,就要求pfun1或者pfun2是指针,那哪个是指针?与数组不同:int arr[];输出的是两个地址,这两个地址是 test 函数的地址。那我们的函数的地址要想保存起来,怎么保存?经过查阅资料得知:&Add == Add。
2024-06-20 19:38:36
779
原创 【C语言】 指针数组和数组指针
数组指针是指针?还是数组?答案是:指针。我们已经熟悉:整形指针: int * pint;能够指向整形数据的指针。浮点型指针: float * pf;能够指向浮点型数据的指针。那数组指针应该是:能够指向数组的指针。下面代码哪个是数组指针?//p1, p2分别是什么?解释:p先和*结合,说明p是一个指针变量,然后指着指向的是一个大小为10个整型的数组。所以p是一个 指针,指向一个数组,叫数组指针。这里要注意:[]的优先级要高于*号的,所以必须加上()来保证p先和*结合。
2024-06-17 21:45:36
766
原创 【C语言】字符指针
这里str3和str4指向的是一个同一个常量字符串。但是用相同的常量字符串去初始化 不同的数组的时候就会开辟出不同的内存块。所以str1和str2不同,str3和str4不同。特别容易让同学以为是把字符串 hello bit放到字符指针 pstr 里了,但是/本质是把字符串 hello bit. 首字符的地址放到了pstr中。上面代码的意思是把一个常量字符串的首字符h的地址存放到指针变量 pstr 中。从监视可以看出,str1和str2放在栈区,str3和str4放在常量区。
2024-06-16 23:57:01
611
原创 浮点型在内存中的存储
常见的浮点数:3.141591E10浮点数家族包括: float、double、long double 类型。浮点数表示的范围:float.h中定义。
2024-06-14 23:19:21
843
原创 深度剖析数据在内存中的存储(整型)
什么大端小端:大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址 中。小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地 址中。为什么有大端和小端:为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元 都对应着一个字节,一个字节为8 bit。
2024-06-10 23:30:07
1181
原创 位图与布隆过滤器
1. 面试题给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在 这40亿个数中。【腾讯】1. 遍历,时间复杂度O(N)2. 排序(O(NlogN)),利用二分查找: logN3. 位图解决数据是否在给定的整形数据中,结果是在或者不在,刚好是两种状态,那么可以使用一 个二进制比特位来代表数据是否存在的信息,如果二进制比特位为1,代表存在,为0 代表不存在。比如:2. 位图概念所谓位图,就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景。
2024-06-09 16:54:34
1089
原创 C++哈希详解
顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素 时,必须要经过关键码的多次比较。顺序查找时间复杂度为O(N),平衡树中为树的高度,即 O($log_2 N$),搜索的效率取决于搜索过程中元素的比较次数。
2024-06-08 00:22:39
2723
原创 unordered_map介绍
1. unordered_map是存储键值对的关联式容器,其允许通过keys快速的索引到与 其对应的value。2. 在unordered_map中,键值通常用于惟一地标识元素,而映射值是一个对象,其内容与此 键关联。键和映射值的类型可能不同。3. 在内部,unordered_map没有对按照任何特定的顺序排序, 为了能在常数范围内 找到key所对应的value,unordered_map将相同哈希值的键值对放在相同的桶中。
2024-06-08 00:02:45
444
原创 const详解
关键字const用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变。将const 在指针前进行修饰,那么就修饰指针所指向的变量。将const 在指针后进行修饰,那么就修饰指针变量本身。但是,可以通过取地址进行修改。但是指针指向的内容可以被修改。但是指针变量可以被修改。
2024-06-07 23:56:19
415
原创 map和set的模拟实现
迭代器的好处是可以方便遍历,是数据结构的底层实现与用户透明。如果想要给红黑树增加迭代 器,需要考虑以前问题:begin()与end()STL明确规定,begin()与end()代表的是一段前闭后开的区间,而对红黑树进行中序遍历后, 可以得到一个有序的序列,因此:begin()可以放在红黑树中最小节点(即最左侧节点)的位 置,end()放在最大节点(最右侧节点)的下一个位置,关键是最大节点的下一个位置在哪块?能否给成nullptr呢?
2024-06-06 10:55:12
494
原创 红黑树详解
enum ColorRED,BLACK,// 节点的左孩子// 节点的右孩子// 节点的双亲(红黑树需要旋转,为了实现简单给出该字段)// 节点的值域Color _col;// 节点的颜色, _kv(kv)
2024-06-03 23:53:22
2366
原创 AVL 树详解
向二叉搜索树中插入新结点后,如果能保证每个结点的左右 子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均 搜索长度。
2024-06-02 16:26:45
1484
原创 map和set
1. set是按照一定次序存储元素的容器2. 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。3. 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行 排序。4. set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对 子集进行直接迭代。
2024-06-01 10:40:49
1295
原创 C++之二叉树进阶
二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树。
2024-05-26 00:24:05
1213
原创 C++之多态详解
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了 Person。Person对象买票全价,Student对象买票半价。那么在继承中要构成多态还有两个条件:1. 必须通过基类的指针或者引用调用虚函数2. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。
2024-05-25 00:44:08
2285
温湿度采集系统(stm32+mqtt+Onenet云平台+esp8266)
2025-11-30
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅
1