自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(197)
  • 收藏
  • 关注

原创 【RT Thread】RTT内核对象机制详解

开宗明义,RTT的源码非常的“面向对象”,尽管它是用C写的,但是在具体设计上十分的OOP。

2025-09-21 22:45:39 652

原创 【汇编语言】RISCV汇编语言

上述例子中的mscratch是其中一个CSR寄存器,csrrw 指令的一个特点是读取和写入操作是同时发生的,因为这发生在一个指令周期内,这实际上是利用了指令执行时的寄存器值状态:在指令执行时,读取操作和写入操作同时进行,因此不会出现因为读取操作覆盖了 t6 的值而导致写入操作无法正确执行的问题。mcause(机器器态异常原因寄存器) 是机器态(M 态)下的核心控制与状态寄存器(CSR),用于记录当前发生的异常或中断的具体原因,是异常常处理程序判断异常类型并进行针对性处理的关键依据。

2025-09-05 10:44:57 1360

原创 【RT Thread】使用QEMU模拟器结合GDB调试RT Thread内核

在 RT-Thread 中使用 QEMU 模拟环境并通过 GDB 调试,流程相对简单(无需硬件,纯软件模拟)。核心思路是:让 QEMU 以调试模式启动 RT-Thread 固件,并等待 GDB 连接,然后通过 GDB 进行断点设置、单步执行等操作。建议直接使用RTT官方的ENV工具,集成了QEMU和常见架构的gdb,文档详解。确认你的 RT-Thread 工程已配置为 QEMU 目标平台(如 qemu-vexpress-a9 或 qemu-virt64-aarch64 等)。最后附上GDB调试详解。

2025-08-28 20:23:50 372

原创 【Linux内核】Linux信号机制

Linux 信号机制的底层原理是内核通过中断式通知实现进程间 / 内核与进程间的事件传递,本质是对 “异常事件” 的异步处理机制。其核心流程涉及信号的产生、在内核中的管理、向进程的递送,以及进程对信号的处理四个阶段,底层依赖 CPU 中断、进程上下文切换和内核数据结构的协作。信号可以理解为,信号则是内核或其他进程通过 “软件指令” 通知目标进程 “发生了特定事件”,迫使进程暂停当前操作,优先处理信号。

2025-08-17 15:32:38 857

原创 【RTOS】RT-Thread 进程间通信IPC源码级分析详解

本文会更加聚焦RTT下各种IPC机制的实现方法,各种IPC机制具体是怎么用参见在开始,我们先看看诸多IPC的爹——父类可以看到RT Thread的源码写得相当的面向对象——它使用了类似继承的机制,其中一个是OOP的根类Obejct类rt_object,然后剩下的一个是一个列表,表示的是等待这个IPC资源的threads 组成的队列。

2025-08-15 18:12:22 857

原创 【AutoSar】BSW层详解

AutoSar中的 BSW (Basic Software,基础软件)层是汽车电子控制单元(ECU)软件的核心基础,位于硬件层与 RTE( Runtime Environment,运行时环境)之间,提供底层硬件抽象、系统服务和通信管理等功能,是实现软件模块化、可移植性和复用性的关键。Service层需要使用到部分内存保护和寄存器调用的OS层功能,所以是一个L型的结构。Microcontroller Abstraction Layer层其实已经和硬件息息相关了,一般是硬件厂商提供。

2025-08-12 11:04:32 1213

原创 【Autosar】RTE(Runtime Environment)层详解

在阅读之前请先了解AutoSar的基本层级。

2025-07-22 16:49:47 1302

原创 【链接、装载和库】三、目标文件详解

我们可以将符号看作是链接中的粘合剂,整个链接过程正是基于符号才能够正确完成。链接过程中很关键的一部分就是符号的管理,每一个目标文件都会有一个相应的符号表(SymbolTable),这个表里面记录了目标文件中所用到的所有符号。每个定义的符号有一个对应的值,叫做符号值(SymbolValue),对于变量和函数来说,符号值就是它们的地址。除了函数和变量之外,还存在其他几种不常用到的符号。

2025-06-09 17:31:40 696

原创 【Linux内核】内核中的中断管理和异常处理

Linux内核支持众多处理器架构,它对各种架构都做了相当的适配,Linux内核中的中断管理可以分为以下四层。

2025-04-24 17:31:43 1009

原创 【嵌入式Linux】U-Boot源码分析

编译出来之后的U-Boot的文件结构及其作用如下:主要存放架构相关文件,存储着包括不同架构下不同CPU的内容,包括arm\x86等等。在存放着arm架构相关设置的文件夹arm下,(),包含着各个arm版本的设置文件夹,以及根本的ARM 芯片所使用的 u-boot 链接脚本文件u-boot.ldsboard 文件夹就是和具体的板子有关的,打开此文件夹,里面全是不同的板子,这是对开发板做的适配文件,本文使用的是mx6ullevk这个开发板。

2025-04-02 22:49:19 1031

原创 【Linux内核】Linux内核的同步管理

原子操作是保证指令以原子的方式执行,在执行原子指令的时候不会被打断。比如经典例子,A线程和B线程都尝试对i=1的变量进行+1操作,A进程获取到i=1变量后,被B中断,B获取到i=1后进行+1操作得到i=2然后进行写回,接着A线程从睡眠中恢复,又对i=1进行+1操作,最终得到i=2写回。这很明显和想要的结果不一致针对上述例子,可以使用加锁的方式,例如使用自旋锁来保证i++操作的原子性,但是加锁操作会导致比较大的开销,用在这里有些浪费。Linux内核提供了atomic_t。

2025-03-16 02:12:47 734

原创 【Linux内核】万字解析Linux内核内存管理机制

ARM64架构处理器采用48位物理寻址机制,最多可以寻找256TB的物理地址空间。对于目前的应用来说已经足够了,不需要扩展到64位的物理寻址。虚拟地址同样最多支持48位寻址,所以在处理器架构的设计上,把虚拟地址空间划分为两个空间,每个空间最多支持256TB。Linux内核在大多数架构中把虚拟地址空间划分为用户空间和内核空间。

2025-03-08 15:20:18 1295

原创 【Linux内核】进程管理(下)

站在处理器的角度看进程的行为,你会发现有的进程一直占用处理器,有的进程只需要处理器的一部分计算资源即可。所以进程按照这个标准可以分成两类:一类是CPU消耗型(CPU-Bound),另外一类是IO消耗型(I/O-Bound)CPU消耗型的进程会把大部分时间用在执行代码上,也就是一直占用CPU。一个常见的例子就是执行while循环。实际上,常用的例子就是执行大量数学计算的程序,比如MATLAB等。

2025-02-22 22:50:05 906

原创 【Linux内核】进程管理(上)

关于进程相关内容直接看我的操作系统专栏,在这里不再赘述。我们直接快进到Linux中的进程管理部分。

2025-02-16 23:35:11 899

原创 【Linux内核】系统调用详解

实际上新增系统调用十分容易,但是并不提倡这样子做,这会影响应用程序的可移植性:毕竟在其他的Linux上不存在自定义的系统调用关于Unix的接口设计有一句格言**“提供机制而非策略”**,换句话说,设计系统调用应该是为了完成某种确定目的,而这些系统调用会怎么样去使用则完全不需要内核去关心。此外,系统调用应该被设计得尽可能简单高效。

2025-02-09 02:32:19 1028

原创 【AutoSar】DoIP协议详解

UDS诊断作为汽车ECU里的一个服务功能,位于应用层,它的实现需要有网络的支撑,我们把基于CAN总线实现的UDS诊断称为DoCAN,基于Ethernet实现的UDS诊断称为DoIP。相比DoCAN中CAN网络的封闭性,DoIP由于Ethernet的互联互通,可以实现车与车、车与人的远距离诊断通信,DoIP在传输层以下的规范遵循ISO 13400,而应用层还是遵循ISO 14229不变,这样可以保证UDS诊断在不同车载网络上的可移植性。

2025-02-05 21:04:17 2359

原创 【AutoSar】汽车诊断标准协议UDS详解

Tester端收到这个种子数,根据自己安全算法算出来一个K1发送给ECU,ECU也有自己对应的安全算法,他由这个Seed算出来一个密钥K2,当ECU收到这个K1后和自身计算的K2进行比较,如果两者是一致的,那么ECU发送肯定响应给Tester端,告诉Tester端ECU已经解锁。还有NRC 31,NRC 31常用的用法是请求超出范围,比如说22服务,发送的DID,是ECU不支持的,比如说发送的请求22 01 01 ,因为ECU不支持01 01这个DID,会发送NRC 31的否定响应。

2025-01-29 17:12:39 2664

原创 【嵌入式】STM32中的SPI通信

SPI是由摩托罗拉公司开发的一种通用数据总线,其中由四根通信线,支持总线挂载多设备(一主多从),是一种的协议。主要是实现主控芯片和外挂芯片之间的交流。这样可以使得STM32可以访问并控制各种外部芯片。本文主要是实现STM32连接W25Q64外挂Flash芯片。I2C的优点是,无论外挂多少设备,只需要两根通信线就可以实现连接,但是由于其默认弱上拉的设计,其由低电平变换到高电平的时候会比较慢,这会使得其通讯频率较低,最高位400kHz。SPI传输更快,其通讯频率更高,最高可达80MHz。

2024-11-04 17:01:42 655

原创 【嵌入式】MQTT详解

QoS 1 需要在 PUBLISH 报文中设置 Packet ID,而作为响应的 PUBACK 报文,则会使用与 PUBLISH 报文相同的 Packet ID,以便发送方收到后删除正确的 PUBLISH 报文缓存。在这之后,发送方可以再次使用当前的 Packet ID 发送新的消息,而接收方再次收到使用这个 Packet ID 的 PUBLISH 报文时,也会将它视为一个全新的消息。QoS 2 解决了 QoS 0、1 消息可能丢失或者重复的问题,但相应地,它也带来了最复杂的交互流程和最高的开销。

2024-10-25 13:33:40 1638

原创 【嵌入式Linux】Linux设备树详解

设备树是是Linux中一种用于描述硬件配置的数据结构,它在系统启动时提供给内核,以便内核能够识别和配置硬件资源。设备树在嵌入式Linux系统中尤其重要,因为这些系统通常不具备标准的硬件配置,需要根据实际的硬件配置来动态配置内核。在Linux中,设备树源文件的扩展名为.dts,其二进制编码文件为.dtb,将.dts编译成.dtb需要使用DTC工具,位于Linux内核的文件夹下。

2024-10-23 15:57:23 1660

原创 【ARM】ARM中断系统详解——以Cortex-A7为例

Cortex-A7 也有中断向量表,内核有 8 个异常中断,中断向量表也是在代码的最前面。看起来A7的中断向量表比STM32F103少很多,这是因为STM32F103使用的Cortex-M系列芯片,中断向量表列举出了一款芯片所有的中断向量,包括芯片外设的所有中断。对于 Cotex-A 内核来说并没有这么做 Cortex-A 内核 CPU 的所有外部中断都属于这个 IRQ 中断,当任意一个外部中断发生的时候都会触发 IRQ 中断。

2024-10-20 00:30:35 1828

原创 C++新特性汇总

这样做的好处是,如果使用int a=3.5f进行变量赋值,那么会对变量进行截断,a的值为3;而使用则会直接编译不通过, 直接语法报错,这样做的好处是不会使得数据被误截断,进一步提高代码的健壮性。

2024-10-06 18:37:02 587

原创 【开发杂谈】ESP32的连续ADC的结果转化 和 C语言中的数据类型对齐

在uint32_t中0值应该是00 00 00 00四个全零的字节, 如果ADC读出的值为2006,那么他的16进制为0x7D6,根据上述规则,0-7位写入第一个字节中,8-11位写入第二个字节的低4位,高四位随机填充为0x6,则实际uint32_t的值是0x00 00 67 D6,在内存中uint32_t的存储形式是。可以看到0xD6被写入在了第一个字节中,0x7则被写入第二个字节的低4位中,而第二个字节的高四位则被填充了0x6。首先,ESP32-S3的ADC最大位宽为12位,也就是范围为0~4095。

2024-10-01 15:59:47 839

原创 【C++】智能指针详解

weak_ptr是一个智能指针,这种智能指针指向一个由shared_ptr管理的对象,但是这种指针并不控制所指向对象的生存期,也不会改变shaed_ptr的引用计数。既然weak_ptr所指向的对象有可能不存在,那么waek_ptr是不能直接用于访问对象的,必须要使用一个叫做lock的成员函数,lock的功能是检查weak_ptr所指向的对象是否还存在,如果是,lock能够返回一个指向共享对象的shared_ptr,如果不存在,则返回一个空的shared_ptr常用操作1.use_count成员函数。

2024-08-18 01:49:47 1078

原创 【嵌入式软件开发】ARM64架构基础知识

ARMv8-A是ARM公司发布的第一代支持64位处理器的指令集架构,他在扩充64位寄存器的同时提供对上一代架构指令集的兼容,因而可以同时运行32位和64位应用程序的执行环境。

2024-08-14 15:48:51 3826

原创 【嵌入式】CAN总线详解

CAN总线是一种控制器局域网总线,每一个挂载在CAN局域网的设备,都可以利用CAN去发送信息,也可以接收局域网的各种信息,每个设备都是平等的,共享CAN的资源。广泛应用于汽车、嵌入式和工业控制等领域。CAN总线一共有五种帧。

2024-06-16 19:58:53 5550 2

原创 【Spring源码】1.1 BeanFactory和ApplicationContext

阅读前须知:需要有一定Spring基础和Spring实践经验。

2024-05-05 20:35:37 988

原创 【嵌入式】STM32和I2C通信

I2C(Inter IC Bus)是有飞利浦公司开发的一种通用数据总线,主要通过两个通信线SCL和SDA进行通信,其中SCL(Serial Clock)是时钟线,用于收发双方同步数据,SDA(Serial Data)是数据线,用于传输数据。是一种同步半双工的数据总线,其有数据应答功能,支持在总线上挂载多个设备。不少的设备,比如说常用的0.42寸的OLED显示器,MPU6050加速度传感器,AT24C02存储器模块,DS3231实时时钟模块等,都是用I2C协议。

2024-03-25 20:33:14 1225

原创 【编译原理】第一章 概述

写在开头:本文以及本博客大多数文章都是作者学习之后的笔记,知识点经过提炼,因此缺少生动详细的解释和样例,不适合初学入门者观看,正确使用方法是学习完该门课程后,可以用本博客温故而知新,快速回忆起遗忘的内容,希望可以帮到各位!编译器的核心功能是将翻译为其基本的要求是生成的目标代码的语义要和源代码一致,因此编译器需要进行大量静态计算(也就是在编译过程中不会进行运算)编译器和解释器的区别:编译器输入需要编译的源程序,输出编译完成后的目标程序;

2024-03-18 10:38:33 461

原创 【电路分析】第一章 初识电路分析

电路三要素:电源、负载、导线。

2024-01-07 16:09:59 2493

原创 【神经网络】GAN:生成对抗网络

和传统的神经网络不同,Generator除了接受x的输入之外,还会接受一个简单的分布作为z进行输入,从而使得网络的输出也是一个复杂的分布为什么输出需要时一个分布呢?以视频预测为例,比如说在糖豆人游戏中,我们需要预测视频的接下来的10帧是怎么样的问题是传统的神经网络(NN)训练出来的结果,在拐角处,一个糖豆人会分裂为两个糖豆人,一个向左一个向右,这是因为在普通NN中,糖豆人向左和向右都有可能,是概率不同,因此他将这两个结果都显示了出来。

2023-11-11 19:13:01 2157 2

原创 【Spring】Spring技术栈需掌握技术点

本文旨在总结Spring技术栈需要掌握的一些技术点,面试不一定问,因此本文并非是面试导向,而是实战导向。笔者曾经学习过Spring相关内容,但是由于读研做了一些其他工作,一些关键内容发现已经模糊不清,为了加强记忆,于是决定将相关知识点记录下来。

2023-11-09 18:08:20 185

原创 【算法笔记】LCR 086. 分割回文串

Java中的List变量存储的是List的地址,而非List本身,因此可以构建一个path列表,用于存储当前已经遍历的序列,当dfs向下遍历的时候则将新遍历的字符串加入path中;当向上回溯的时候,可以将path中的最后一个元素remove掉,从而恢复到上一个遍历状态。dfs遍历出来的第一个序列是[a, a, b],显然该序列都是回文子串,接着回溯,遍历下一个序列,为[a, ab],不是回文子串,去除…如此往下遍历,将符合要求的序列加入到结果集res中,直到遍历整个解空间树。

2023-10-11 12:14:28 375

原创 【深度学习】Mini-Batch梯度下降法

反之,较小的子集会导致噪声较大,下降的精度不高,但是单次训练速度快,而且较小的子集也无法充分来自于向量化的训练加速,总训练时间反而不是最快的。在实际中,选择适中的子集大小能够保证一定的精度,也能提高速度,并且利用好向量化带来的加速,在此基础之上,根据自己的目标选择合适的子集大小,平衡好训练速度和精度问题。而在情况2中,因为每个样本都是单独的Mini-Batch,大多数时候会朝着最小值前进,但是有一些样本是噪声样本,因此偶尔会指向错误的方向,因此这会使得其路线十分的九转十八弯(紫线)。原数据集的特征部分为。

2023-09-09 16:59:23 1205

原创 【机器学习】异常检测

假设你是一名飞机涡扇引擎工程师,你在每个引擎出厂之前都需要检测两个指标——启动震动幅度和温度,查看其是否正常。在此之前你已经积累了相当多合格的发动机的出厂检测数据,如下图所示我们把上述的正常启动的数据集总结为DataSetx1x2...xm如果一个新的例子xtest​离点集很远,那可能这个样例是异常的那么如何衡量“很远”呢?一般我们会有一个函数p(x)负责计算,并且有一个阈值ϵ,当pxtest​ϵ的时候,我们认为该样例异常;而当pxtes。

2023-07-24 19:49:55 653

原创 【机器学习】支持向量机SVM入门

相较于之前学习的线性回归和神经网络,支持向量机(Supprot Vector Machine,简称SVM)在拟合复杂的非线性方程的时候拥有更出色的能力,该算法也是十分经典的算法之一。接下来我们需要学习这种算法首先我们回顾逻辑回归中的经典假设函数,如下图:对于任意一个实例xy,当y=1的时候,我们希望hθ​x≈1,也就是θTx>>0;当y=0的时候,我们希望ht​hetax≈0,也就是θTx

2023-07-23 16:09:18 522

原创 【机器学习】正则化对过拟合和欠拟合的影响

接下来我们总结若干应对各种问题的方法:修正过拟合(高方差):增加训练及数量、使用更少的特征、增加正则化参数的值修正欠拟合(高偏差):增加额外的特征、增加假设函数的复杂度和次方数、减小正则化参数的值。

2023-06-26 09:11:54 812

原创 【机器学习】如何选择合适的假设函数

但是这仍不能证明模型的泛化能力,因为上述过程类似于新增了一个参数d之后,再使用测试集进行模型训练选出最优d值,也就是说,这是使用测试集来选择模型,又使用相同的测试集来计算误差,对于模型多项式次数d的选择会存在过拟合的情况。想要了解自己训练出的模型对训练集外的实例的泛化能力,则我们可以将初试的数据集分为两部分:70%为我们的训练集,剩下30%为我们的测试集(当然比例我们可以灵活调整)。值最小的对应的d的取值,假设d=4的时候最佳,那么我们就选择这个多项式次数作为最优假设函数模型。的取值,而不是像之前的求。

2023-06-26 09:08:33 477

原创 神经网络小结:训练的全过程

这一节我们主要是将之前的知识穿起来,形成一个整体。如果之前的没看过可以回翻一下专栏。但是在整体回归之前,我们还需要学习一个小知识点——随机初始化。

2023-06-20 16:29:21 923

原创 【神经网络】梯度检测

的取值是一个可行的方法,但是它很容易出错:因为在这个算法中含有海量的细节,容易产生微小而又难以察觉的bug。的方法赖解决这种问题,只要需要使用类似梯度下降或者反向传播的算法都可以使用这种方法,这种方法能够确保你的前向\反向传播完全正确。还是会照常迭代下降,但是得出来的结果的误差将会比正确的情况高出一个量级。,如果成立的话,则可以认为反向传播是正确的,把DVex用于梯度下降则可以得出较好的结果。是一个很小的数,类似于微积分中的微小增量,一般可以将。,那么我们可以使用相同的办法得出对应偏导数的大约值。

2023-06-16 15:22:05 1224

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除