- 博客(162)
- 收藏
- 关注
原创 【数据结构】循环链表
尽管在已知位置的情况下,单链表的插入和删除操作可以在O(1)时间内完成,但要找到这个位置却可能需要遍历链表,从而需要O(n)的时间。最常用且效率较高的方法是“快慢指针”法(Floyd判圈算法),这种方法不仅能够判断链表中是否存在环,还能找到环的起点。这意味着如果要访问链表中距离头节点较远的节点,效率会比较低,时间复杂度为O(n),其中n是链表的长度。:与连续存储的数据结构相比,链表的节点在内存中可能分散存储,这会影响CPU缓存的命中率,进而影响程序的整体性能。慢指针每次只移动一步,而快指针每次移动两步。
2025-02-05 16:50:56
1195
2
原创 【数据结构】链表应用-链表重新排序
方法:迭代法,通过遍历链表逐个反转节点指针。时间复杂度:O(n),只需遍历链表一次。空间复杂度:O(1),仅使用常数个额外指针。优点:高效、直观,适合所有单链表反转场景。
2025-02-05 16:30:47
983
原创 【数据结构】链表应用1
设str1和str2分别指向两个单词所在单链表的头节点,链表节点结构为data | next,请设计一个时间上尽可能高效的算法,找出由str1和str2所指向两个链表共同后缀的起始位置(如图字符。【2012】假定采用带头节点的单链表保存单词,当两个单词有相同的后缀时,则可共享相同的后缀存储空间,例如,注意初始化的时候要写指向head,不能指向head->next,否则会不通过,报警告,说指向空指针。用空间换时间,用一个数组来存储已经出现过的绝对值,如果绝对值已经出现过,就删除该节点。本题相对原题稍作改动。
2025-02-05 16:25:18
971
原创 【Let‘s do第四期】DIY液体流量检测仪
非常有幸参加EEPW举办的【Let’s do第四期】DIY液体流量检测仪的活动。我参加了一次免费的DIY活动,本次DIY通过小抽水泵和继电器实现流量控制,结合霍尔效应传感器,准确测量液体的传播时间,实现瞬时流量和累计流量的监测。该技术广泛运用于咖啡机、饮水机等定量取水场景~
2025-01-22 20:17:12
1230
1
原创 【数据结构】线性表-单链表
为了表示每个数据元素 Ai 与其直接后继数据元素 Ai+1之间的逻辑关系,对数据元素Ai来说,除了其本身的信息之外,还需要存储一个指示其直接后继的信息(直接后继的存储位置)。如果后面已经有了数据,那么头插法的演示效果如下,先让新节点指向第一个节点,再让头节点指向新节点(这样就能防止后面的数据丢失)线性表链式存储结构的特点是:用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。按照头插法,依次插入 1 2 3,遍历链表输出 3 2 1,这是正确的!
2025-01-17 13:13:08
747
原创 【数据结构】线性表-顺序表
为了表示每个数据元素 Ai 与其直接后继数据元素 Ai+1之间的逻辑关系,对数据元素Ai来说,除了其本身的信息之外,还需要存储一个指示其直接后继的信息(直接后继的存储位置)。方法:从删除的位置,从前往后依次遍历,用后面的元素覆盖前面的元素,最后一个元素会多余出来,不用管,最后length-1即可!线性表链式存储结构的特点是:用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。线性表是 n个数据元素的有限序列,其中几个数据是相同数据类型的。查找元素就是遍历,查看位置!
2025-01-06 21:01:58
1234
原创 【嵌入式C语言】函数输入参数-连续空间的传递
void *在 FreeRTOS 中主要用于实现灵活性,允许开发者创建通用的任务、队列和其他机制,而不必局限于特定的数据类型。然而,这也意味着你需要特别小心地管理类型转换,以避免潜在的错误。始终确保在使用void *指针之前将其转换为正确的类型,并且理解你的代码正在操作的数据结构。
2025-01-04 17:45:43
698
原创 【嵌入式C语言】函数的使用
一堆代码的集合,用一个标签去描述它复用化标签 — 函数名int *p;int a[100];函数 数组 , 函数具备3要素:函数名 (地址输入参数返回值在定义函数时,必须将3要素告知编译器。?{xxx}如何用指针保存函数??定义函数,调用函数的使用?int fun(int a, int b, char c) //定义函数int main()//函数指针return 0;函数指针的用途作为参数传递作为返回值。
2024-12-27 16:36:09
882
原创 【嵌入式C语言】内存分布
对于这个新地址的读法,由程序员灵活把握,输入参数指定分配的大小,单位是B。程序运行时的空间,函数内部使用的变量,函数一旦返回,就释放了,生存周期(在函数内)较短。文件链接在一起,生成可执行文件,如下图所示,放到section中,就是放到各个段中。程序运行时,可以自由,自我管理的分配和释放的空间。输出结果如下,可以看到这两个地址相差很远,猜测应该在不同的段中~输出结果如下,可以看到两个地址相差很小,猜测在同一个段中~分配:malloc,calloc,realloc,new。编译-汇编-链接-运行。
2024-12-27 14:11:05
449
原创 【嵌入式C语言】指针&数组&结构体
总体而言,指针数组和数组指针提供了在数组和指针之间灵活切换的方式,依赖于实际需求选择使用哪一种形式。指针数组和数组指针是两个不同的概念,它们涉及到指针和数组的组合使用。是一个指针,指向包含5个元素的整数数组,它被初始化为指向二维数组。是一个包含3个指针的数组,每个指针分别指向整数变量。可以看到指针数组的大小是个数*对应类型的指针的大小。二维数组是一行一行读取的,一次就读取4列的数据。分别看一下定义的顺序不同,占用的空间大小!由于定义的顺序不同,占用的空间大小也不同!第二种定义的顺序,在内存中的分布如下。
2024-12-26 17:27:12
604
原创 【嵌入式C语言】数组的定义和数组空间的初始化
数组:内存分配的一种形式大小读取方式数据类型 数组名[m] (m的作用域是在申请的时候,这是个建议符)数组名是一个常量符号,一定不要放到=的左边数组名是一个常量符号,一定不要放到=的左边。
2024-12-25 17:14:22
596
原创 【嵌入式C语言】多级指针
int **p;多级指针:存放地址的地址空间在内存的表现形式应用的图示:把毫不相关的内存组合成线性的关系二维指针在使用的时候一般使用p[0]p[1]p[2]……p[n]这个n有多大呢?在二维指针中,有个不成文的规定,假设,这时候二维指针就结束了!
2024-12-25 16:48:40
1378
原创 【嵌入式C语言】指针运算符
指针的越界访问是指在编程语言中(特别是像C和C++这样的低级语言),通过指针访问了超出分配给该指针所指向的数据结构的内存范围。:当指针指向的内存已经被释放,但指针仍然持有旧的地址时,称为悬空指针。:当写入的数据量超过了缓冲区所能容纳的容量,多余的数据会覆盖相邻的内存区域,这通常是由于没有正确检查输入长度而引起的。在编写代码时保持警惕,遵循良好的编程实践,并利用可用的工具和技术,可以帮助避免指针越界访问的问题。等函数动态分配了一块内存,并且随后尝试访问这块内存之外的区域,就会发生越界访问。
2024-12-23 14:36:22
732
原创 【嵌入式C语言】指针修饰符
CPU与缓存之间的数据传输一样,就比如CPU去访问LCD的一个固定的地址,然后这个地址的内容是不断进行刷新的,屏幕上显示的内容就是不断刷新的。在这个例子中,*p 是不可更改的(即不能通过 p 来改变它所指向的值),但是你可以改变 p 使其指向其他的整数变量。类型的指针,这个指针的指向位置是可以任意变的,内容也是可以修改的,再往左看,多了个。修饰,意思就是,指向的内存地址可以改变,但是只能读取,不能修改!先看const p,这样定义的是p不可变,指向位置是不变的,不能就是。这样的指针类型是可以修改内容的。
2024-12-23 13:29:34
894
原创 【CAN总线】STM32的CAN外设
发送邮箱有3个,每个邮箱可以存放一个CAN报文,如果我们想发送一个报文,那就把报文写到一个空置邮箱中,然后设置寄存器请求发送就ok了,剩下的等待总线空闲,操作引脚输出波形,位同步,仲裁都是由硬件电路自动完成的。收到的报文,如果能通过接收过滤器,就存入接收FIFO(先进先出寄存器(队列)),不能通过接收过滤器的报文直接扔掉,减轻软件的负担。• 2个3级深度的接收FIFO(三个接收的缓存区,总共可以缓存2*3=6个报文)• 3个可配置优先级的发送邮箱(发送的时候,有三个缓存区)与收发器连接,收发器引出。
2024-12-21 23:16:45
767
原创 【嵌入式C语言】指针
指针:访问内存空间,内存类型资源地址、门牌号的代名词指针变量:存放指针这个概念的盒子指针符号int a;int *p = a;C语言编译器对指针这个特殊的概念,有两个疑问分配一个盒子,盒子要多大?------ 在32位OS中,指针占用4个字节,4Bytes盒子里存放的地址,所指向的内存的读取方法是什么?------ 看指针是如何定义的,char *p或者int *p,或者其他的定义方式空间大小的描述2^10 = 1K2^20 = 1M2^30 = 1G。
2024-12-20 22:14:31
280
原创 【LeetCode】35.搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。暴力解法,力扣提交版本。vscode测试版本。
2024-12-18 17:55:39
481
原创 【CAN总线】CAN简介&硬件电路
CAN总线(Controller Area Network Bus)控制器局域网总线(设计理念:CAN总线构建一种局域网,每一个挂在在这个局域网内的设备,都可以利用这个局域网去发送自己的消息,也可以接收局域网的各种消息,每个设备都是平等的,都在共享局域网的通信资源)CAN总线是由BOSCH公司开发的一种简洁易用、传输速度快、易扩展、可靠性高、稳定性高的串行通信总线,广泛应用于汽车、嵌入式、工业控制等领域CAN总线特征:两根通信线(CAN_H、CAN_L),线路少,无需共地。
2024-12-18 14:14:16
4429
原创 【嵌入式C语言】关键字之类型修饰符
可以看出编译器对c=a这步进行优化,不再执行从a的内存中取值,而是直接从寄存器中取值,如果这段时间内a的发生变化,那么c就不能得到最新的值,这个时候就需要使用volatile告诉编译器,不要对变量a优化,每次都是从内存中取a的值。作用:告诉编译器该变量是容易发生变化的,不能对该变量进行优化,每次取值都必须从内存中取值而不是直接去取之前在寄存器中的值(确保本条指令不会被编译器的优化而忽略)修饰变量的值的修改,不仅仅可以通过软件,也可以通过其他方式(硬件外部的用户)还是可变的,不能显示的修改,可以用指针修改。
2024-11-29 16:24:54
677
原创 【LeetCode】70.爬楼梯
我们从最后一级台阶n开始分析,有两种方法可以上去,n-1爬一次即可,n-2需要两个台阶即可到达第n个台阶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?提交不能通过,超出时间限制了,时间复杂度是O(2^n)在vscode里运行是没有问题的,放到力扣里就报错了。需要 n 阶你才能到达楼顶。当前层爬楼梯方法数等于前两层爬楼梯数相加。注意:给定 n 是一个正整数。: 有两种方法可以爬到楼顶。: 有三种方法可以爬到楼顶。
2024-11-13 21:22:24
701
原创 【FreeRTOS】事件组实验-改进姿态控制
学习视频:【FreeRTOS 入门与工程实践 --由浅入深带你学习 FreeRTOS(FreeRTOS 教程 基于 STM32,以实际项目为导向)】 【精准空降到 00:28】 https://www.bilibili.com/video/BV1Jw411i7Fz/?参考《FreeRTOS 入门与工程实践(基于 DshanMCU-103).pdf》《第 10 章 同步互斥与通信》《第 14 章 事件组(event group)》
2024-09-05 21:25:37
1021
原创 【FreeRTOS】事件组实验_车辆协同
学习视频:【FreeRTOS入门与工程实践 --由浅入深带你学习FreeRTOS(FreeRTOS教程 基于STM32,以实际项目为导向)】 【精准空降到 00:28】 https://www.bilibili.com/video/BV1Jw411i7Fz/?参考《FreeRTOS入门与工程实践(基于DshanMCU-103).pdf》《第10章 同步互斥与通信》《第14章 事件组(event group)》
2024-09-04 12:06:30
772
原创 【FreeRTOS】事件组的本质
学习视频:【FreeRTOS入门与工程实践 --由浅入深带你学习FreeRTOS(FreeRTOS教程 基于STM32,以实际项目为导向)】 【精准空降到 00:28】 https://www.bilibili.com/video/BV1Jw411i7Fz/?参考《FreeRTOS入门与工程实践(基于DshanMCU-103).pdf》
2024-09-03 21:27:58
1307
原创 【FreeRTOS】使用互斥量解决优先级反转
学习视频:【FreeRTOS入门与工程实践 --由浅入深带你学习FreeRTOS(FreeRTOS教程 基于STM32,以实际项目为导向)】 【精准空降到 08:07】 https://www.bilibili.com/video/BV1Jw411i7Fz/?参考《FreeRTOS入门与工程实践(基于DshanMCU-103).pdf》
2024-08-30 21:11:01
1227
原创 【FreeRTOS】信号量实验-优先级反转
学习视频:【FreeRTOS入门与工程实践 --由浅入深带你学习FreeRTOS(FreeRTOS教程 基于STM32,以实际项目为导向)】 【精准空降到 03:06】 https://www.bilibili.com/video/BV1Jw411i7Fz/?参考《FreeRTOS入门与工程实践(基于DshanMCU-103).pdf》
2024-08-29 19:24:25
933
原创 【FreeRTOS】信号量实验-控制车辆运行
参考《FreeRTOS入门与工程实践(基于DshanMCU-103).pdf》完成信号量实验-控制车辆运行,补充信号量的知识
2024-08-29 11:25:23
1017
原创 【FreeRTOS】信号量的本质
学习视频:【FreeRTOS入门与工程实践 --由浅入深带你学习FreeRTOS(FreeRTOS教程 基于STM32,以实际项目为导向)】 【精准空降到 00:42】 https://www.bilibili.com/video/BV1Jw411i7Fz/?参考《FreeRTOS入门与工程实践(基于DshanMCU-103).pdf》前面介绍的。
2024-08-23 16:08:07
756
原创 【FreeRTOS】队列实验-分发数据给多个任务(赛车游戏)
学习视频:【FreeRTOS入门与工程实践 --由浅入深带你学习FreeRTOS(FreeRTOS教程 基于STM32,以实际项目为导向)】 【精准空降到 01:25】 https://www.bilibili.com/video/BV1Jw411i7Fz/?参考《FreeRTOS入门与工程实践(基于DshanMCU-103).pdf》
2024-08-23 00:30:02
798
1
原创 【OpenCV】基础知识
这样就创建好了一个文件夹,然后像我这样一级一级向下分,细分文件夹。新建项目,路径不要出现中文。添加解释器,添加本地解释器。
2024-08-22 17:47:41
401
原创 【FreeRTOS】队列集实验 增加MPU6050姿态控制
我们要实现一个框架,底层都写自己的队列,在InputTask读队列集,根据不同队列句柄,分别调用不同的处理函数,处理函数里,都会把原始的硬件数据,转换成游戏的控制数据,写入队列,写入队列之后,挡球板的任务就可以读到数据,就实现控制挡球板了。我们在15_queueset_game\Core\Inc\FreeRTOSConfig.h加一句。现在我们就实现了,解析出数据放到自己的队列里。我们现在就实现了用队列集改进程序框架。在初始化时候,创建自己的队列。包含需要的头文件,最后会报错。烧写程序之后,挡球板不见了。
2024-08-20 20:43:31
951
原创 【FreeRTOS】队列集实验-改进程序框架(编程)
我们要实现一个框架,底层都写自己的队列,在InputTask读队列集,根据不同队列句柄,分别调用不同的处理函数,处理函数里,都会把原始的硬件数据,转换成游戏的控制数据,写入队列,写入队列之后,挡球板的任务就可以读到数据,就实现控制挡球板了。我们在15_queueset_game\Core\Inc\FreeRTOSConfig.h加一句。现在我们就实现了,解析出数据放到自己的队列里。我们现在就实现了用队列集改进程序框架。在初始化时候,创建自己的队列。
2024-08-19 23:01:36
1206
【蓝桥杯嵌入式】第六届省赛
2024-05-01
调幅波解调-二极管峰值包络检波器Multisim【高频电子线路】
2023-06-24
振幅调制器Multisim【高频电子线路】
2023-06-24
石英晶体振荡器Multisim【高频电子线路】
2023-06-24
LC正弦波振荡器Multisim【高频电子线路】
2023-06-24
高频丙类谐振功率放大器Multisim【高频电子线路】
2023-06-24
高频小信号谐振放大器Multisim【高频电子线路】
2023-06-24
NI Multisim 14.0软件卸载工具
2023-02-11
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人