工程算法的知识与拓展
1 一阶低通滤波(IIR)$$Y(n) = \alpha X(n)+(1-\alpha)Y(n-1)$$其中 $Y(n)$ 表示当前系统的输出,$X(n)$ 则为系统当前的输入;$\alpha\in(0,1)$ 为滤波系数,而 $Y(n-1)$ 为前一次的输出。 12345int filter_out; static int filter_prev; float filter_coeff = 0.7; filter_out = (filter_coeff * filter_prev) + ((1-filter_coeff) * val); filter_prev = filter_out; 其中 filter_prev 对应前一次执行时的输出项,static 修饰保证了其能够继承 filter_prev = filter_out 的效果,进行下一轮运算。 filter_coeff 即滤波系数,假设系统输入为 val ,那么 filter_out ,即当前系统输出的计算形式就对应上文中的公式。最后只需要更新 filter_prev 就可以了。 2 卡尔曼滤波总体来说...
协议知识的补充与拓展
1. CANCAN - Controller Area Network 即控制器局域网协议 1.1 差分信号与电平逻辑CAN 依赖专门的收发器芯片来与单片机进行通讯。普通的电平信号经过其转化变成差分信号,具体的逻辑根据两条线的压差来决定,而差分信号也可以通过该芯片转化为普通的电平信号。 Recessive - 隐形电平,表示逻辑1 Dominamt - 显性电平,表示逻辑0 差分信号由于受到干扰双绞线共同受到干扰,其压差变化幅度基本与未受干扰前相差不大,因此差分信号抗干扰能力强,这也使得 CAN 的通讯距离较长。 1.2 数据帧结构 SOF 显性电平 仲裁段包括 ID(Identifier) 与 RTR: ID 为 11 字节,由于区分总线上挂载的设备 RTR 为 1 字节,表示帧是数据帧 (0) 还是遥控帧 (1) 控制段包括 IDE(Identifier Extension) 与 r0, DLC(Data Length Code) IDE 用于区分这一帧是拓展帧还是标准帧,0 为标准。 r0 为保留位 DLC 表示数据部分的长度,4 字节,表示数据...
C与C++的内存布局
$fix: .data\ first,\ then\ .bss$ 1 编译时间确定这些段的大小与位置在运行之前就会被编译器与链接器确定。 1.1 代码(文本)段 .text 文本段存放程序经过编译 - 汇编 - 链接后生成的机器码。 1234graph LRA[Code]-->|Compilation|B[ASM]B-->|Assembly|C[Binary]C-->|Linker|D[.text] 1.2 静态数据段1.2.1 只读数据段该段落存放常量,包括字符串常量,const 修饰的全局变量以及硬编码数据等。 1.2.2 数据段该段落存放具有初值的全局或者局部变量。 1.2.3 BSS段.bss 段也就是 Blocked Start By Symbol ,存放未初始化或者初始化为 0 的变量。 2 运行时间确定这些内存空间在程序运行时动态进行分配。 2.1 堆堆是一个用于动态分配的内存区。这片区域的内存由程序员手动申请与管理。 C C++ malloc new free delete 忘记释放内存将会导致内存泄漏 在操作系统...
HAL-DDC | LVGL_UI 核心类 (v8.4) | 2026-2-v1
Last Edited: 2026/2/26 20:47 123456#pragma once/* Series Control */#include "SERIES.hpp"/* Third Party */#include "src/core/lv_obj.h"#include "src/hal/lv_hal_disp.h" 需要引两个 LVGL 头文件支持类型的使用。 1. 类型定义1234567class LVGL_UI{ public: /* * TypeDefs */ using flush_cb = void (*)( lv_disp_drv_t* disp_drv, const lv_area_t* area, lv_color_t* color_p); 首先,flush 回调函数的逻辑是需要由用户提供的,这里...
排序算法 I : 插入/快速/归并/堆
A. 直接插入排序12345678910111213141516#include <vector>void Insertion_Sort(std::vector<int>& arr){ for(auto i{1};i<arr.size();i++) { int key{arr[i]}; int j{i-1}; while(j>=0 && arr[j]>key) { arr[j+1] = arr[j]; j--; } arr[j+1] = key; }} 默认数组的第一个元素 arr[0] 已经进行了排序,从 arr[1] 开始遍历数组,第 i 个元素 arr[i] 存储为 key;从这个元素的前一个元素 arr[j] 开始向数组首部前进(...
在 GitBash 中使用独立 MSYS2 工具
我的 VSCode 终端使用的是 Git Bash, 而我自己同时有一个单独安装的 MSYS2 环境. 假如我需要在Git Bash中使用 MSYS2 下的 tree 工具, 首先在 MSYS2 中安装 tree: 1234567891011121314151617181920NEO@i4N-H4CKD3CK UCRT64 ~$ pacman -S treeresolving dependencies...looking for conflicting packages...Packages (1) tree-2.2.1-1Total Download Size: 0.04 MiBTotal Installed Size: 0.08 MiB:: Proceed with installation? [Y/n]:: Retrieving packages... tree-2.2.1-1-x86_64 39.7 KiB 15.1 KiB/s 00:03 [###############################] 100%(1/1) chec...
在我的新电脑上重新使用 Hexo 建站
[!warning] ImportantThis post in currently in progress 1. 安装 Node.JSnode-v24.11.1-x64.msi: Node.js 24.11.1 123NEO@i4N-H4CKD3CK MINGW64 /d/Project.i4N/Blog$ node -vv24.11.1 123NEO@i4N-H4CKD3CK MINGW64 /d/Project.i4N/Blog$ which node/d/Dev.i4N/NodeJS/node 12345678NEO@i4N-H4CKD3CK MINGW64 /d/Project.i4N/Blog$ npm -v11.6.2NEO@i4N-H4CKD3CK MINGW64 /d/Project.i4N/Blog$ where npmD:\Dev.i4N\NodeJS\npmD:\Dev.i4N\NodeJS\npm.cmd Node.js 本质上是一个 JavaScript 运行时环境。更准确地说,它把 JavaScript 引擎(V8) 从浏览器中独立出来...
Trouble Shooting : 迁移 STM32 开发环境到我的新电脑
[!warning] ImportantThis is an out-dated content 将原电脑的开发环境迁移到新电脑,记录一下过程。 1. 安装 VSCodeAdminstartor 组内的用户默认具有管理员权限,所以必须用 System Installer 进行安装,而非网站默认提供的 User Installer 。 2. 安装 MSYS2 与工具链启动 MSYS2 UCRT64,安装工具链。 2.1 Clangd12NEO@i4N-H4CKD3CK UCRT64 ~pacman -S mingw-w64-ucrt-x86_64-clang-tools-extra 安装完成后,键入 123NEO@i4N-H4CKD3CK UCRT64 ~$ where clangdD:\Dev.i4N\MSYS2\ucrt64\bin\clangd.exe 2.2 CMake & Ninja1$ pacman -S mingw-w64-ucrt-x86_64-cmake 123NEO@i4N-H4CKD3CK UCRT64 ~$ where cmakeD:\D...
串口环形缓冲区FIFO的设计模式
[!warning] ImportantThis post is currently in progress. 1. 理论对于一个线性缓冲区 Buffer,假设往其中不断地填入数据包,那么很快就会发生数据溢出。 然而,如果在存入的同时对前面的一帧数据进行处理后释放其占用的空间,这样缓冲区就出现了富余,此时就可以将原本塞不下的数据存到前面,比如说这里数据包 A 已经完成解析,就可以将其推出缓冲区,而数据包 C 的溢出部分就可以存入前面这一块空出来的位置。 这实际上就形成了一种遵循 FIFO ( First In First Out ) 的环形数据结构: 在上面的例子中也就是: 其中: Head 为数据包往缓冲区中开始写入的位置 Tail 为数据包从缓冲区中开始读出的位置 由图可以看出 Head 并不总是领先于 Tail ,比如说写入的数据包溢出,一处部分就将回到开头。上图中新数据会从 Package C remains 末尾开始写入,而从 Tail 开始 Package B 将会被弹出。 随着数据的不断写入,Head Index 增加,一旦 Head index...
