自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

cswhl的博客

sheng博客

  • 博客(53)
  • 收藏
  • 关注

原创 变频器基础原理

变频器基本概念

2024-04-21 22:07:22 828

原创 工作体验记录

以在midea的首个任务开发生产测试为例的任务产出:需要搭建好一套满足光伏逆变器和储能器的生产测试产线设备,包括FCT测试(单板测试)、半成品/成品测试(整机功能测试)、老化测试三套设备;2.了解自身的惰性贪图享受、短视、贪婪、容易松动的原则是人性远古基因的体现,而这些基因并不适合现代社会;2、明确实现路径(即产能):产生成果的能力,包括时间、精力、资源、能力的投入和配置;将任务分解为大小合适的子任务,提升执行的清晰度,把控项目进度;1.了解人性的追高踩低(有利益、被尊重),才能将事情推动起来;

2024-04-04 11:17:59 1035

原创 硬件原理及常用模块

常用硬件电路模块

2024-03-31 13:49:52 309

原创 浮点数的存储

文章目录1.单精度与双精度区别2.将十进制浮点数转换为二进制浮点数3.IEEE 754 对有效数字M和指数E的规定4.实验参考资料1.单精度与双精度区别1.单精度和双精度精确的范围不一样:单精度,也即float,一般在计算机中存储占用4字节,也32位,有效位数为7位;双精度(double)在计算机中存储占用8字节,64位,有效位数为16位2.在计算机上的存储都遵循IEEE规范,使用二进制科学计数法:IEEE 754规定,对于32位的浮点数,最高的1位是符号位s,接着的8位是指数E,剩下的

2021-11-30 20:48:44 2243

原创 Linux内核移植入门

文章目录基本概念内核源码目录结构内核配置主目录Makefile各子目录Makefile如何配置内核?1. 配置仓库选取2.交叉编译器的修改3.体系结构体的选择4.修改配置文件内核编译编译结果:几种linux内核文件的区别开发板上U-Boot启动linux内核内核Kconfig语法使用1.make menuconfig 是如何找到 Kconfig?2.Makefile 要编译一个 .o 文件是如何在Kconfig中配置的?添加驱动到内核概念添加步骤1.将我们开发的驱动 myleddev.c 放到能自述其意的

2021-11-21 00:01:31 8983 2

原创 如何高效学习linux的总结

学习linux的理想方法:先有对linux内核体系的全局视野,然后将子系统一一攻破,实践验证系统调用,最后上开发板移植内核文章目录1.首先建立起内核的大体框架2. 然后选择一个子系统学习3. 动手写代码4. linux学习的几个阶段阶段1阶段2阶段35.区分共性与平台特性6.书籍7.参考资料1.首先建立起内核的大体框架目的:理解各个子系统的设计理念和构建思想,这些理念和思想会从宏观上呈献给你清晰的脉络,就像一个去除了枝枝叶叶的大树的主干,一目了然初步建立起内核子系统框架和代码实现之间的关联: 看

2021-11-04 19:33:02 494 1

原创 C代码覆盖率测试工具 Gcov及生成报告

文章目录0. 概念1. Gcov使用1. 直接编译2. 数据收集3. 合成最终的gcov文件2. Gcovr生成报告1. 生成代码覆盖率列表报告2. 生成分支覆盖率列表报告3. 生成html形式报告0. 概念代码覆盖率测试反映了测试的广度与深度,量化了测试和开发质量,是十分有必要的。1. Gcov使用示例代码:say.c#include <stdio.h>int say(char* what) { printf("------ %s\n", what); retu

2021-10-29 21:00:53 2870

原创 JAVA动态代理源码分析

文章目录1.Proxy.newProxyInstance源码2.$Proxy0源码3.实验代码4.动态代理流程图1.Proxy.newProxyInstance源码Proxy的部分源码://Proxy类开始有这样的一个定义private final static Class[] constructorParams = { InvocationHandler.class };protected InvocationHandler h;protected Proxy(InvocationHandl

2021-08-08 14:35:50 267

原创 IoC容器初始化过程结构图

2021-07-12 21:40:58 106

原创 IoC循环依赖流程图

1、循环依赖过程图2、循环依赖过程1、使用context.getBean(A.class),旨在获取容器内的单例A(若A不存在,就会走A这个Bean的创建流程),显然初次获取A是不存在的,因此走A的创建之路~2、实例化A(注意此处仅仅是实例化),并将它放进三级缓存(此时A已经实例化完成,已经可以被引用了)3、初始化A:@Autowired依赖注入B(此时需要去容器内获取B)4、为了完成依赖注入B,会通过getBean(B)去容器内找B。但此时B在容器内不存在,就走向B的创建之路~5、实例化B,

2021-07-11 17:34:26 293

原创 ioc容器加载过程

1、ioc容器的初始化过程1、实例化一个ApplicationContext对象2、解析 xml配置文件路径3、创建bean工厂4、创建bean定义,保存到beanDefinitonMap,用于后期的bean实例化5、调用bean工厂的后置处理器,可自定义修改bean定义invokeBeanFactoryPostProcessors(beanFactory)6、判断beanDefiniton是否符合生产标准(是不是抽象的,单例,懒加载)preInstantiateSingletons(

2021-07-09 00:52:22 1236

原创 HashMap使用及完整测试用例

文章目录1.常用方法2.超类Map的方法和属性3.测试用例及输出结果1.常用方法put(key, value))添加元素时,如果key已经存在,则返回旧value,并将新的value存到该key中;如果key不存在,则返回null当key=null时,并不会抛出异常,而是按照一个特殊的方法进行存储putIfAbsent(key,value):与put的区别:如果key存在且value不为null,则不会覆盖原有的valueget(key):key存在时返回对应value

2021-06-12 17:50:46 461 2

原创 JAVA 实例对象创建后的初始化过程

1.结论1.首先实例变量初始化和实例代码块初始化按照编码顺序来执行2.然后调用构造函数初始化实例化一个类的对象的过程是一个典型的递归过程:首先实例化Object类,再依次对以下各类进行实例化,直到完成对目标类的实例化。如果子类重写了父类的方法,父类构造函数中使用的便是子类重写的方法2.实验源码// 父类class Foo { { i = 99; // 代码块可以赋值其后定义的实例变量,但不能访问其后定义的实例变量 } int i = 1; Foo(

2021-06-10 16:02:22 410

原创 JAVA三个默认类加载器及相互关系

文章目录1. 什么是类加载器?2.AppClassLoader系统类加载器3.ExtClassLoader扩展类加载器4. BootstrapClassLoader启动类加载器5.加载器关系总结6.参考资料1. 什么是类加载器?虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”类加载器可以说是Java语言的一项创新,也是Java语言流行的重要原因之一,

2021-06-05 18:40:25 749 1

原创 支付宝签名与验签,return_url和通知页notify_url

1 支付宝签名与验签签名与验签的作用首先了解下使用RSA签名与验签的作用是什么?对数据进行签名后,可以保证数据完整性,机密性和发送方角色的不可抵赖性,可以有效防止请求信息信息被篡改。以商户服务端(A)、支付宝服务端(B)、发送的消息内容(C)、加密后的签名(D)举例如下:• 签名:商户A将需要发给支付宝B的消息内容C利用app私钥进行加密得到签名D。然后A将C和D一起发给B。• 验签:支付宝B接收到内容C和签名D后,使用app公钥进行验证,验证签名D解密后的内容是否与内容C相同,相同返回tr

2021-04-10 13:11:38 8532

原创 python-命名空间和作用域

命名空间(Namespace)是从名称到对象的映射,大部分的命名空间都是通过 Python 字典来实现的。命名空间的作用:程序在 直接访问 变量时,会在当前的命名空间内查找。1.命名空间的定义命名空间通常是一个字典,其中key是对象名,而value是对象。内置命名空间(built-in names)Python 语言内置的名称,比如函数名 abs、char 和异常名称 BaseException、Exception 等等。全局命名空间(global names)模块中定义的名称,记录了模块的

2021-01-05 23:33:45 81

原创 java学习6:方法

重载方法使用同样的命名来定义不同的方法,只要参数不同(即签名不同)。Java编译器根据方法签名决定使用哪个方法:public class Main { public static void main(String[] args) { initData(100, 10); initData(3.14, 2.9); } // 整数类型 public static void initData(int x, int y) {

2021-01-03 22:47:25 88

原创 java学习5:类

1、 stdout、stdin、 stderrSystem.out:代表标准输出设备System.in: 代表标准输入设备Scanner input = new Scanner(System.in); // 创建Scanner类型对象,读取来自System.in的输入1、变量类型public class Variable{ static int allClicks=0; // 类变量 String str="hello world"; // 实例变量

2021-01-03 22:46:16 365

原创 java学习4:控制语句

条件语句if语句(同C/C++一样)有if、if…else…、if…else if…else…几种表达方式,statment只有一条语句时,可以不使用{}包括switch语句使用基本与C/C++一样,switch(表达式)的statment语句块必须用{}包括,表示式的结果必须是char、byte、short、int、String类型之一。和if语句对比1、多分支情况下,switch语句的运行效率比if要高: switch根据表达式值选择分支,只计算一次2、switch的case只能处理

2021-01-03 22:43:33 52

原创 java学习3:基础语法- 数据类型

1、类的定义Java是面向对象的强类型、静态类型语言。对象是由类产生,类使用关键字class定义。最外层公共类名需要与java文件名相同,否者会显示错误。如新建一个Main.java(源程序扩展名必须为.java)文件在其中定义类:public class Main { // 类名必须与Main.java的文件名相同 public static void main(String[] args) { // write your code here System.

2021-01-03 22:42:45 99

原创 Java学习2:创建Java project

创建全新 Java project1、设置Project SDK选择「Java」开发语言,另外预设「Project SDK」,已經自动设置为刚安裝的 Java SDK 1.8,若此处未自动指定,请指定到刚刚安裝 Java SDK 的路径。2、创建工程和文件设置project 名,及存储该project的路径使用java Class创建java文件参考官网创建Java工程史上最简单的 IntelliJ IDEA 教程judasnIntelliJ-IDEA-Tutorial.

2021-01-03 22:41:14 625

原创 Java学习1:基本概念及安装

1. 基本概念JVM, JRE and JDK是平台依赖,因为每个操作系统的都不一样。而Java语言是跨平台运行的,其实就是不同的操作系统,使用不同的JVM映射规则,让其与操作系统无关,完成了跨平台性JDK、JER、JVM关系图:1.1 SDK是什么?SDK全称为Software Dev Kit,即软件开发工具包,包括函数库、编译程序1.2 JDK是什么?JDK(Java Development Kit,Java开发工具包)是Sun Microsystems针对Java开发员的产品。J

2021-01-03 22:39:48 91

原创 socket长连接心跳保活实现

长连接:开启一个socket连接,收发完数据后,不立刻关闭连接(不会调用close()),可以多次收发数据包。心跳:长连接在没有数据通信时,定时发送数据包(心跳),告诉对方自己的状态,以维持连接状态;心跳包不会作为通信内容。查看linux中与keepalive相关的user-driven变量╭─cs at css in ~ using╰─ sudo sysctl -a | grep keepalive[sudo] password for cs:net.ipv4.tcp_keepalive_

2020-12-29 22:23:52 2072

原创 Pexpect模块使用

1 Pexpect的作用pexpect 是 Python 语言的类 Expect 实现,Expect 程序主要用于人机对话的模拟,就是那种系统提问,人来回答 yes/no ,或者账号登录输入用户名和密码等等的情况。Pexpect能够产生子应用程序并控制他们,能够通过期望模式对子应用的输出做出反应。Pexpect允许你的脚本产生子应用、控制他们像一个人类在输入命令一样,Pexcept人机模拟对话的大致过程:1、 运行程序2、 程序要求人的判断和输入3、 Expect 通过关键字匹配4、 根据关

2020-12-29 21:50:44 2971

原创 socktet粘包问题解决

socket粘包问题socket系统调用会将要发送的数据从用户空间copy到内核空间,这样频繁的交换操作会耗费资源,为提高效率,会收集到较多的数据才一起发送。如果数据少的几个包一起发送就会造成粘包。只有tcp可能存在粘包问题:TCP基于字节流,没有消息边界、数据包的概念,应用层协议如果没有使用基于长度或基于终结符的消息边界,就会导致多个消息粘连,接收端无法。udp永远不会粘包:udp保留了消息边界,每次操作发送一个IP数据报,不考虑分片。接收端每次都会收到一个完整的udp数据包,因此不会产生多个

2020-12-28 11:38:14 244

原创 使用Python“http.server”创建Web服务器或提供文件服务

1.目的:创建web服务器用于在windows主机和linux虚拟机之间共享文件,可以直接通过浏览器查看linux虚拟机的文件2.创建文件服务:在linux需要共享的目录下运行命令python2: python -m SimpleHTTPServer 9999 python3: python3 -m http.server 9999 The SimpleHTTPServer module has been merged into http.server in Python..

2020-12-27 13:11:59 740

原创 目录切换pushd和popd

pushd和popd用于在目录之间切换,它们使用栈的方式来管理目录:dirs显示当前目录栈中所有的目录:╭─cs at css in /home using ╰─ dirs/home ~/tt/test/pkg ~ // 其中/home为目录栈顶dirs : 列出目录栈中所有目录dirs -p : 以列表形式显示目录栈中所有目录dirs -v : 以列表形式为显示的目录增加编号dirs -c : 清空目录栈,但位于栈顶的当前目录是不能被pop出的pushd命令

2020-12-27 11:57:22 133

原创 struct模块使用

pyton struct模块struct结构体在c语言中的作用,它定义了一种结构,里面包含不同类型的数据(int,char,bool等等),方便对某一结构对象进行处理。在网络通信当中,大多传递的数据是以二进制流(binarydata)存在的。当传递字节串时,不必担心太多的问题; 传递字符串之前也要使用string.encode(‘utf8’)转为字节串而当传递诸如int、char之类的基本数据的时候,就需要有一种机制将某些特定的结构体类型打包成二进制流的字节串然后再网络传输,而接收端也应该可以通过

2020-12-26 19:59:47 264 1

原创 JSON模块使用

json — JSON encoder and decoderJSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript,

2020-12-26 12:38:14 653

原创 python __import__内置函数使用

__import__函数功能用于动态的导入模块,主要用于反射或者延迟加载模块(满足条件才加载)。实验环境目录结构├── pkg│   ├── __init__.py│   ├── mod2.py│   ├── mod.py│   └── __pycache__│   ├── __init__.cpython-36.pyc│   ├── mod2.cpyth

2020-12-25 21:59:54 2884

原创 subprocess模块使用

subprocess — Subprocess managementsubprocess允许你生成新的processes,并连接到这些processes的input/output/error pipes,从而获取返回值subprocess.run(…)生成一个新的进程,运行args描述的命令,等待命令完成后返回CompletedProcess实例,从该实例中可以获取新进程的运行结果。subprocess.run缺点是不能与子进程进行交互,但是读取执行结果却很方便原型:subprocess.run

2020-12-24 14:43:39 1686

原创 python selectors模块使用

selectors — High-level I/O multiplexingSelectorKeys对象用于关联file object和其底层fd的namedtuple,如:SelectorKey(fileobj=<socket.socket fd=5, family=AddressFamily.AF_INET, type=2049, proto=0, laddr=('192.168.18.129', 35990), raddr=('23.23.154.131', 80)>, fd=5,

2020-12-23 09:48:22 2115

原创 socketserver模块使用

socketserversocketserver在内部使用IO多路复用以及多线程/进程机制,实现了并发处理多个客户端请求的socket服务端。每个客户端请求连接到服务器时,socketserver服务端都会创建一个“线程”或者“进程” 专门负责处理当前客户端的所有请求Request Handler Objects请求处理对象处理器接收数据并决定如何操作。BaseRequestHandler是超类提供所有接口,其派生的子类实现这些接口的具体细节。StreamRequestHandler和Datagra

2020-12-23 09:42:01 716

原创 存储器、cache、cache line解析

存储器理想的存储器:速度与CPU的速度一样,这样CPU执行命名就不会受到存储器速度的限制. 但现代存储器无法同时满足三个条件(速度极快、充分大、非常便宜)。存储器类型:寄存器与CPU相同的材料制成,速度与CPU相同;典型容量32位CPU是32 * 32;64位是64 * 64高速缓存cache:多由硬件控制,主要作用是减少CPU访问内存的次数:cache分成多个组,每个组分成多个cache line,linesize是cache的基本单位,从主存向cache迁移数据都是按照linesiz

2020-12-20 22:29:43 1897

原创 CPU多核同步原语

程序执行顺序在单个core上,program order是必须遵从;但在多个core上,原子操作保证操作的原子性,要么操作了,要么没有操作。缓存体系现代CPU有多层cache缓存体系,用于提升CPU访问内存的数据的性能。4核执行多线程时,每个核心的L1 cache可能保存了同样的数据拷贝,内存操作顺序指从某个角度观察到的对于内存的读和写所发生的顺序,内存操作顺序并不唯一。内存屏障同步原语smp_mb()、smp_wmb()、smp_rmb()、引入Store Buffer为了防止

2020-12-16 16:50:35 600

原创 2.do_select函数分析

do_select函数的运行过程1 先把全部fd扫一遍2 如果发现有可用的fd,跳到53 如果没有,当前进程去睡眠xx秒4 xx秒后自己醒了,或者状态变化的fd唤醒了自己,跳到15 结束循环体,返回核心过程poll_initwait():设置poll_wqueues->poll_table的成员变量poll_queue_proc为__pollwait函数;同时记录当前进程task_struct记在pwq结构体的polling_task。f_op->poll():会调用pol

2020-12-16 11:18:59 1015 1

原创 1.IO multiplexing、select 、core_sys_select

1. 什么是IO multiplexing?IO multiplexing是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。在Linux系统中,常用的IO multiplexing手段有 select、poll 和 epoll。IO multiplexing 主要用于处理网络请求,例如可以把多个请求句柄添加到 select 中进行监听,当有请求可进行IO的时候就会告知进程,并且把就绪的请求句柄保存下来,进程只需要对这些就绪的请求进行IO操作即可。下面通过一幅图来展示 select

2020-12-16 11:17:58 278

原创 0.select 系统调用介绍

select 使用文档在:select(2) - Linux manual pageselect介绍select 接口如下:int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);select函数的作用:等待多个事件中的任何一个的发生,并且仅当其中一个或几个事件发生时,或经过指定的时间后,才唤醒进程。返回值可以是:ready de

2020-12-14 22:54:14 199

原创 linux的signal_pending及signal

signal_pending(3) — The event API1. signal_pending( current )的作用仅检查当前进程是否有信号处理(不会在这里处理信号),返回不为0表示有信号需要处理1.1. 两个信号的概念signal pending:指在信号被处理之前生成信号的状态,是信号生成和信号消除的中间状态signal blocking:指阻塞正在处理的信号,这是一种信号处理方法2. 常规使用场景 if (signal_pending(current)) { ret

2020-12-09 23:17:17 4601

原创 3、系统调用之SYSCALL_DEFINE分析

前言为什么要将系统调用定义成宏SYSCALL_DEFINEx?bug CVE-2009-0029,CVE-2010-3301的存在: Linux 2.6.28及以前版本的内核中,将系统调用中32位参数传入64位的寄存器时无法作符号扩展,可能导致系统崩溃或提权漏洞。内核开发者通过将系统调用的所有输入参数都先转化成long类型(64位),再强制转化到相应的类型来规避这个漏洞。SYSCALL_DEFINEx的宏定义// 定义位置:\include\linux\syscalls.h#define SYSC

2020-12-09 11:42:35 2068

空空如也

空空如也

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

TA关注的人

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