- 博客(32)
- 资源 (1)
- 收藏
- 关注
原创 【学习记录】AVL树及相关链表,线程池实现
本来打算使用avl树套链表的结构,来避免优先级相等的情况,但是最后发现当绝大多数优先级都相等,avl树还是不可避免的退化成单链表,而需求中也确实是绝大多数都是优先级相等。所以评估之后觉得avl树带来的提升远不及其提升的复杂度,所以放弃该方案,改为链表实现,现将此前实验的代码整理如下,AVL树部分应该没有问题。
2025-02-12 10:52:00
286
原创 【学习记录】关于C语言使用函数指针参数传递过程中参数数量变多的情况
首先这里是通过函数进行对a b c三个变量重新赋值,正常的只传递参数也是相同的效果。此段[x29, 20] [x29, 24] [x29, 28]三个分别是三个局部变量a,b,c在栈上的地址,这一步就是给局部变量赋初始值。所以由此看来,可以多传参数(会被丢弃),但是不能少穿,少穿会导致不可预知的后果,因为多余参数的数值我们并不能知道,将局部变量的地址给x0 x1 x2,函数传递参数较少的情况下是使用寄存器传值的。拿到函数的地址,也就是get_gata2的地址然后跳转过去。mov w0, 0 是返回值。
2024-11-05 10:31:30
220
原创 【学习记录】关于c++类和多态的底层原理探索
这里提一嘴:当前架构和编译器下:参数传递较少的时候使用的是寄存器传值,通常来说当参数大于四个的时候就会使用堆栈传值,并且在类方法调用时,所有的非静态成员函数都隐式的接收了一个参数为类对象本身,可以理解为this,在类方法内部如果想要访问内对象中的值则通过地址偏移访问,形式上相当于c中的。由此看来,虽然上层可以搞得花里胡哨,但是对于底层来说众生平等,任你什么对象继承多态的,对于汇编层面就是库库掉函数,库库写寄存器,所以上层对于程序员的轻松,只是有人替我们负重前行了(编译器)。以下举个例子来抛砖引玉。
2024-09-30 15:49:54
403
原创 【学习记录】c语言线程池
最近在研究c语言的后端http服务器的时候遇到了一个问题,一般来说前端发起一个请求,收到之后建立连接新建线程处理请求,结束之后就关闭线程,流程没有什么问题,但是当请求很多,处理又比较简单的时候,新建线程就显得很费,所以引入线程池的方式来减少创建线程的开销。线程池(Thread Pool)是一种并发编程中常用的技术,用于管理和重用线程。它通过减少线程的创建和销毁次数,以及控制并发执行的线程数量,来提高系统的性能和资源利用率。
2024-09-12 09:23:58
361
原创 【学习记录】二叉树的整理和实现+表达式求值
最近工作中遇到了一个问题,某个进程占用cpu过高,初步分析得知应该是链表的频繁创建,插入,删除导致的。所以思考有没有什么方法可以改进的。因为遇到的问题本质是一个表达式求值的问题,所以想到使用二叉树的方式来解决。由此刚好重新整理了以前写的二叉树笔记。参考书籍数据结构 ——严蔚敏。
2024-08-04 13:10:25
479
原创 【学习记录】软件iic
注: 移植主要对接.h文件相关io的宏 目前我使用的芯片平台主频为120Mhz。如果在其他平台使用 可能需要调试一下.c文件开头的延时。由于有时候出现硬件iic总线挂死的情况,所以记录一下软件iic的方法,代码来源网上资料整合。
2024-02-02 11:57:27
465
原创 【学习记录】记录一个优雅的方法在 C语言中插入汇编代码
首先s_flash_command_run定义为一个数组首地址为0x1FFFF000,所以经过强制转换s_flash_run_entry函数的入口地址即为0x1FFFF001。最近搞keaz128的flash读写时需要向一个寄存器写入0x80,发现其中一段代码很有意思,代码如下。查看反汇编发现数组中的内容正好是二进制代码,和数组内容一一对应。经过分析,并查看反汇编代码,结果如下。其中让我感到迷惑的是这两句。
2023-12-09 13:19:19
498
2
原创 按键单双击及长按事件判定(非硬延时)
按键作为十分常见的硬件外设,从一开始就会接触到,但是之前使用的都是硬延时来判断单双击和长按的,不仅会阻塞程序运行还会浪费性能,但是如果使用硬件定时器的话就有点浪费资源了。不久以前我在ESP32的一个项目上写过一个利用软件定时器的案件事件判断方法,但是需要建构在Freertos上,所以不是十分方便。现在给出我最近采用的方法。
2023-09-09 11:20:20
539
原创 【学习记录】内存管理之分块内存管理
分块式内存管理由内存池和内存管理表两部分组成。内存池被等分为n块,对应的内存管理表,大小也为n,内存管理表的每一个项对应内存池的一块内存。内存管理表的项值代表的意义:当该项值为0的时候,代表对应的内存块未被占用,当该项值非零的时候,代表该项对应的内存块已经被占用,其数值则代表被连续占用的内存块数。比如某项值为10,那么说明包括本项对应的内存块在内,总共分配了10个内存块给外部的某个指针。
2023-09-01 22:26:02
230
1
原创 【学习记录】IIC驱动ICM42670+卡尔曼滤波+四元数姿态角解算
ICM42670陀螺仪可以使用iic驱动,单片机平台使用GD32f305VE。
2023-08-23 09:39:29
4868
3
原创 【学习记录】嵌入式操作系统中内存分配及任务切换
实时操作系统在创建任务的时候会给这个任务分配一个单独的栈空间,而不像裸机程序一样自始至终都是一个。这点参考ARM Cortex-M m3/m4权威指南可以得到验证
2023-08-15 16:06:11
141
1
原创 【低功耗】关于温度计的一些低功耗探索(基于STM32L051)
为什么要想起要搞一手低功耗呢?是因为我晚上打游戏的时候打着打着就很热,打开空调呢不一会就很冷,所以就心想有没有可以查看温度的东西方便我开关空调。嗯...然后我就在某宝上一搜。行!九块九,真便宜啊,但是作为一个刚刚入行的嵌入式工程师是不屑于某宝成品的。说干就干,我先是在网上找了相关资料,给我启发较大的一篇是 小米温度计的拆解。结合以上资料我又查找了一些别的资料然后制定了一个初步的方案。
2023-08-10 01:44:24
1244
3
原创 环形队列缓冲区实际运用记录
然后是对实际存储空间arry分配内存,arry可根据实际选用的数据结构定义。注意的是int CQueueInit(CQueue** cq, int k)第一个参数必须是一个二维指针,不然对arry分配的内存传递不出来,或者还有其它两种方式在我。最近在GD32中遇到CAN数据接受的问题,为了防止数据丢失采用了环形缓冲区的结构来做数据缓冲。这里其实是定义一个M_CanQueue,它是一个CQueue类型的指针,开始并不会分配内存。环形缓冲区最重要的两点。
2023-08-01 16:54:41
411
1
原创 【学习记录】GD32 IIC读写BL24C256A 256Kbits(EEPROM)
这里trandirection参数表示读取还是写入,如果是读取在i2c_master_addressing函数内部会自动在最低位置1,如果是写入那么会自动将最低为清零。然后是读写的函数,这里给出单字节写入,单字节读取,随机不定长写入和随机不定长数据读取。最常用还是最后两个,单字节读取只能读取上一次写入的地址不能指定地址。这里在随机读取写入的时候并没有限制一页多少个,所以在进行长字节的写入和读出的时候需要对这个函数在封装一遍以分配写入读出的页数。最后附上gd32官方提供的iic读写软件流程。
2023-06-28 11:23:53
2669
4
原创 【数据结构笔记备忘】串,数组,广义表
然后是比较重要的两个串匹配算法,分别是暴力匹配和KMP算法。笔记暂时纪录在这,后续如果有改进和修改会同步更新。参考书籍《数据结构第二版——严蔚敏》大部分的说明性语言都在注释中。
2023-04-11 21:33:50
96
原创 【奇思妙想】究极无敌精简操作系统,不到200行代码实现任务调度
基本思路,以前基本都是使用前后台程序,每次都是在主循环判断哪个任务触发了,才回去执行,如果多个任务同时触发,那就只能按照顺序依次执行,经过改进之后可以根据优先级选择任务优先级较高的任务先调用,每次将任务链表中的所有没有被挂起的任务全部都执行一遍之后才能进行第二轮任务调度。可以看到任务一运行两次之后被挂起,之后便没有运行,这个代码初步先这样,后面如果我在使用中有新的功能加入,这里也会更新。可以实现多优先级的任务调度,任务挂起,设定任务运行次数。废话不多说,这个操作系统能干什么。
2023-03-20 15:18:11
197
原创 【数据结构笔记备忘】单链表,双向链表,循环单双链表
单链表,双向链表,循环链表的一些常用的操作函数,这里注释只是简单说明,在具体实现时会有更详细的说明。笔记暂时纪录在这,后续如果有改进和修改会同步更新。以上示例的运行结果如下(输入“斗破苍穹”)参考书籍《数据结构第二版——严蔚敏》大部分的说明性语言都在注释中。以上函数的具体实现方式。以上示例的运行结构如下。两个简单的单链表应用。
2023-02-01 15:16:03
229
原创 【学习记录】一个简易的软件定时器
有时候我们在进行一些操作的时候需要周期性的完成一些操作,操作一定时间或者操作几次后关闭,为了避免在主函数加入延时而影响系统的实时性,这里给出一种简易的软件定时器实现方案首先是定时器初始化的俩结构体,赋值就在实例化的时候进行,免得在写一个Init函数了 例如这样初始化然后就是几个要用到的函数我是将soft_Tim_init放在硬件定时器的1ms中断中的,来提供时基,用户调用的soft_Tim_callback是一个弱定义函数,由用户重新定义。
2023-01-11 18:44:04
262
1
原创 【学习记录】一些时常用到的功能函数和奇特的算法
1 数字转字符串2 字符串的拷贝如果环境支持可以使用string.h 中 strcpy 函数或者他的升级安全版本strcpy_s。strcpy_s 是系统的安全函数,微软在 2005 后建议用一系统所谓安全的函数,这中间就有 strcpy_s 取代了 strcpy;strcpy 函数没有方法来保证有效的缓冲区尺寸,所以它仅仅能假定缓冲足够大来容纳要拷贝的字符串。在程序执行时,这将导致不可预料的行为,容易导致程序崩溃。在一些苛刻的环境中时我们也可以自己弄一个自己的strcpy函数。
2023-01-02 22:55:33
82
原创 基于esp32的物联网设计
本篇是最近在学校做一个物联网温室控制的课题,在此基础上做了一些对物联网的探索物联网物联网(Internet of Things,简称IoT)是指通过各种信息传感器、射频识别技术、全球定位系统、红外感应器、激光扫描器等各种装置与技术,实时采集任何需要监控、 连接、互动的物体或过程,采集其声、光、热、电、力学、化学、生物、位置等各种需要的信息,通过各类可能的网络接入,实现物与物、物与人的泛在连接,实现对物品和过程的智能化感知、识别和管理。物联网是一个基于互联网、传统电信网等的信息承载体,它让所有能够被独
2022-03-11 12:15:56
15407
2
原创 【学习笔记】状态机编程
使用状态机来实现状态切换,备忘。#include <stdio.h>#include <conio.h>#pragma warning(disable:4996)/*四要素state 状态event 事件action 动作transition 变换*/typedef enum{ sta_go = 0, sta_down, sta_right, sta_light, sta_stop}state;state now_
2022-01-19 13:31:35
1364
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人