自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

白日梦患者

阳光下跳一支暗烈的劲舞,黑暗中送一抹甜蜜的香吻

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

原创 I2C总线通信原理

对I2C芯片级通信原理做一个概述

2022-08-08 17:21:27 896 1

原创 I2c驱动与SPI驱动

今天说一下单片机的I2C SPI通信,可能说不清楚,因为这毕竟要做实验才可完全理解。I2C和SPI是两种不同的通信协议。听到协议,似乎高不可攀,其实协议就是人们定义的一个标准而已,我们只要遵照这个标准去做事,就可以。比如公司规定早上9点上班,我们就9点上班,不然就会扣薪水,这就是个协议。用I2C通信的芯片最常用的就是EEPROM芯片,如Atmel的AT24CXX系列,此外,还有一些其它功能的芯片。用SPI通信的芯片有外置FLASH芯片,同样,还有其他功能的一些芯片。I2C通信需要用到两个引脚:SDA SCL

2022-02-17 16:15:50 2000

原创 平衡二叉树详解

AVL树是最先发明的自平衡二叉查找算法,是平衡二叉树的一种。在AVL中任何节点的两个儿子子树的高度最大差别为1,所以它又被成为高度平衡树。查找、插入和删除在平均和最坏情况下都是O(log n)。增加和删除可能需要通过一次或多次树旋转来平衡这棵树。转载链接:手把手教你写平衡二叉树_dreamzuora的博客-CSDN博客_二叉树伪代码假设把AVL树构造过程中需要重新平衡的节点叫做α。由于任意节点最多有两个儿子,因此高度不平衡时,α点的两颗子树的高度差2。这种不平衡可能出现在下面这四种情况:1) .

2022-01-26 13:50:37 411

原创 JZ2440 Bootloader开发

基于JZ2440开发板编写bootloader总结(一)凡走过必留下痕迹,学点什么都会有用的。本系列博文总结了自己在学习嵌入式Linux编程过程中的收获,若有错误,恳请指正,谢谢!——参考教材韦东山系列教材bootloader 是一个用于启动linux内核的C程序,为了达到最终启动内核的目的需要完成以下几个步骤:step1:硬件相关初始化,为启动内核准备硬件平台;step2:将内核从NAND FLASH读取到SDRAM;step3:设置需要传递给内核的启动参数;step4

2021-09-26 14:59:47 156

原创 Linux设备树语法详解

Linux设备树语法详解概念Linux内核从3.x开始引入设备树的概念,用于实现驱动代码与设备信息相分离。在设备树出现以前,所有关于设备的具体信息都要写在驱动里,一旦外围设备变化,驱动代码就要重写。引入了设备树之后,驱动代码只负责处理驱动的逻辑,而关于设备的具体信息存放到设备树文件中,这样,如果只是硬件接口信息的变化而没有驱动逻辑的变化,驱动开发者只需要修改设备树文件信息,不需要改写驱动代码。比如在ARM Linux内,一个.dts(device tree source)文件对应一个ARM的mach

2021-08-19 10:56:21 109

原创 linux内核的物理内存访问误解

为什么把内核虚拟地址放到从0xc000000开始最上面1g空间,原因是把从0开始的低地址留给用户态和设备层会更加方便些,而这个起点设置为0x c000000其实是任意的,主要考虑是那个版本内核内存占用不超过1g,假设你的系统内存占用大概最多不会超过256mb,那么起点设置为0xf000000也是可以的。 内核汇编中寻址指令如何写,很简单,还是按照虚拟地址来写的,即使在汇编中也不是直接访问物理内存地址的还是传入虚拟地址(这句话不完全准确,详细可以查询x86实模式和32bit保护模式),然后硬件通过页表转换得

2021-05-21 17:39:03 322

原创 IO空间映射

登录I/O空间-----I/O端口和I/O内存  首先上图,如下:外设中的寄存器被称为I/O端口,外设中的内存被称为I/O内存。二者合起来统称为I/O空间。 设备驱动程序要直接访问外设或其接口卡上的物理电路,这部分通常都是以寄存器的形式出现。外设寄存器称为I/O端口,通常包括:控制寄存器、状态寄存器和数据寄存器三大类。根据访问外设寄存器的不同方式,可以把 CPU分成两大类。  一类CPU(如M68K,Power PC,A...

2021-05-20 11:45:15 2135

原创 getting content from dynamic inforamtion generated by javascripts

最近,笔者在使用Requests模拟浏览器发送Post请求时,发现程序返回的html与浏览器F12观察到的略有不同,经过观察返回的response.text,cookies确认有效,因为我们可以看到返回的登陆信息。然而部分字段的值依然显示为空。下图是浏览器F12抓包看到的界面:由于笔者在查看第一个接口请求时,观察浏览器捕获到的Response(html文件)跟页面展示的信息一致,就单纯以为只要用requests库构造这个请求即可。然而实际上第一个表单只是返回了前台页面的框架,很多数据都是通过sc

2021-05-14 14:02:45 114

原创 Operating system :mechanism of interupt

说到中断还不得不从现代操作系统的特性说起,无论是桌面PC操作系统还是嵌入式都是多任务的操作系统,而很遗憾,处理器往往是单个的,即使在硬件成本逐渐下降,从而硬件配置直线上升的今天,PC机的核心可能已经达到4核心,8核心,而手机移动设备更不可思议的达到16核心,32核心,处理器的数量依然不可能做到每个任务一个CPU,所以CPU必须作为一种全局的资源让所有任务共享。说到共享,如何共享呢?什么时候给任务A用,什么时候给任务B用......这就是进程调度,具体的安排就由调度算法决定了。进程如何去调度?现代操作系统一般

2021-05-13 09:35:01 195 1

原创 python扩展正则表达式与装饰器以及一些使用细节

# -*- coding: utf-8 -*-import requestsimport time as stimport functoolsimport re'''编写测时装饰器'''def measure_time(func): @functools.wraps(func) def measure(*args, **kwargs): starttime = st.time() result = func(*args, **kwargs) ...

2021-05-13 08:24:18 114

原创 数学归纳法与递归推演

1. 数学归纳法1.1 简介来源百度百科数学归纳法(Mathematical Induction, MI)是一种数学证明方法,通常被用于证明某个给定命题在整个(或者局部)自然数范围内成立。除了自然数以外,广义上的数学归纳法也可以用于证明一般良基结构,例如:集合论中的树。这种广义的数学归纳法应用于数学逻辑和计算机科学领域,称作结构归纳法。在数论中,数学归纳法是以一种不同的方式来证明任意一个给定的情形都是正确的(第一个,第二个,第三个,一直下去概不例外)的数学定理。虽然数学归纳法名字中有“归纳”

2021-05-10 19:41:32 1817

原创 python实现ORM框架(元类的理解与使用)

'''ORM框架实现'''class Field(object): #python中的基类声明所有可能的传参def __init__(self, name,value):self.name = namedef __str__(self): #党类单独存在时,打印的信息return ("%s" % self.__class__.__name__)class IntField(Field):def __init__(self, name):super(IntField..

2021-05-10 19:33:06 185

原创 python中的else 上下文管理以及推导式语法糖

from contextlib import contextmanager'''生成器推导式应用'''in_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 8, 7]print('array before:', in_list)array = (i for i in in_list if i % 2 != 0) # 生成器推导表达式print('array after:', array)num = 3while num > 0: print(next(..

2021-05-10 16:22:00 73

原创 Python语法层面的一些协议

每个编程语言都有自己的最佳实践.通常你不能套用别的语言来写出pythonic的代码.Python是一门初学简单,越学越难的语言.在Python的世界中, 万物皆对象.当我们说某个对象是什么类型时,在根本上其实指的是:这个对象满足了该类型的特定接口规范,可以被当成这个类型来使用.如何定义一个对象的特定接口呢?dunder methods, 即双下划线方法.Python的对象定义了非常多的双下划线方法,比如__init__/__eq__/__hash__等等,接下来进行实战中常见一个...

2021-05-08 16:39:37 69

原创 实现python中的语法糖

1. compose实现compose函数,满足如下操作:f = lambda x: x**2 + 1g = lambda x: 2*x - 1h = lambda x: -2 * x**3 + 3fgh = compose(f, g, h)# equivalent to `f(g(h(n)))`print fgh(5) # 245026我们可以让compose返回一个函数,这个函数倒序遍历compose中的参数,并对输入参数调用该参数。def compose(*args):

2021-05-08 16:15:26 134

原创 python的内存机制

Python内存管理机制Python的内存管理机制:引入计数、垃圾回收、内存池机制一、变量与对象关系图如下:1、变量,通过变量指针引用对象  变量指针指向具体对象的内存空间,取对象的值。2、对象,类型已知,每个对象都包含一个头部信息(头部信息:类型标识符和引用计数器)注意:  变量名没有类型,类型属于对象(因为变量引用对象,所以类型随对象),变量引用什么类型的对象,变量就是什么类型的。In [32]: var1=objectIn [33]: var2=var1

2021-05-08 16:04:37 146

原创 python语法糖

语法糖说明语法糖(Syntactic sugar): 计算机语言中特殊的某种语法 这种语法对语言的功能并没有影响 对于程序员有更好的易用性 能够增加程序的可读性简而言之,语法糖就是程序语言中提供[奇技淫巧]的一种手段和方式而已。 通过这类方式编写出来的代码,即好看又好用,好似糖一般的语法。固美其名曰:语法糖一个简单的例子假设:有2个数字,现需要从中得到最大的那个数字。如何实现?b = 2c = 3if b > c: a = bels...

2021-05-08 16:00:13 238

原创 python设计模式-策略模式

策略模式核心:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。(算法封装类传参)class Strategy(object): def plus(self): pass class NoOneDiscountStrategy(Strategy): def plus(self): super(Strategy, self) print("No .1 Strategy")...

2021-05-06 11:01:09 276

原创 python一些小知识点,比较容易忽略

# -*- coding: utf-8 -*-"""Created on Thu Apr 29 09:10:35 2021@author: yongj"""import sysimport pandas as pdimport numpy as npfrom functools import reduceDigital = {"0":0,"1":1,"2":2,"3":3,"4":4,"5":5,"6":6,"7":7,"8":8,"9":9}#map处理到问题的最小成员...

2021-05-02 19:56:10 93

原创 python中的tuple list dict set一些常見屬性

python中字典遍历四种和方法""" dec = {} dec[1] = "Liu" dec[2] = "op" dec[3] = "ui" for i in dec: print("1 -%d -> %s" % (i, dec[i])) for j in dec.keys(): print("2-%d -> %s" %(j, dec[j])) for k in d...

2021-04-29 19:39:51 48

原创 正则表达式基础用法王牌总结

正则表达式,名字听上去就没有吸引力,我发现很多前端对正则表达式都很难做到如数家珍,每次能够运行全凭运气,更有甚者完全靠复制粘贴,其实这样并不好正则表达式其实并不难,语法就那么多,而且一旦掌握在某些时候能够给解决问题提供捷径,更重要的是面试可能会被问到,要是不会那就尴尬了本文主要介绍正则表达式的语法部分,下面将正则表达式简称为正则正则是啥?同学你可以出门右转了,下面是我自己的理解正则就是用有限的符号,表达无限的序列,殆已!正则表达式的语法一般如下(js),两条斜线中间是正则主体,这部分

2021-04-28 11:54:48 154

原创 python处理excel数据

1.背景1.1 安装模板:到python官网下载http://pypi.python.org/pypi/xlrd模块安装,前提是已经安装了python 环境。 在cmd命令行输入:pip install xlrd1.2 xlrd介绍:xlrd是python环境下对excel中的数据进行读取的一个模板,可以进行的操作有:读取有效单元格的行数、列数 读取指定行(列)的所有单元格的值 读取指定单元格的值 读取指定单元格的数据类型2.常用函数2.1 打开文件(获取一个工作表):im

2021-04-28 11:31:19 231 1

原创 如何写递归程序

教你如何写递归(数学归纳法,干货强推!)引言对于很多程序员来说,写递归程序是比较头疼的一件事,即使是把程序看懂了,轮到自己写的时候也是一脸懵逼,那么到底写递归有没有方法论呢?当然!本文就将从数学归纳法的角度教你如何写递归程序。 数学归纳法与递归的关系有人会疑惑,不是说好写递归嘛,怎么扯到数学归纳法了?别急慢慢往下看你就知道了。 首先我们来温习一下数学归纳法的定义:数学归纳法:用于证明断言对所有自然数成立。证明过程:证明对于N=1成立 证明N>1时:假设...

2021-04-25 11:35:29 1915

原创 交叉编译链制作

一、下载源文件源代码文件及其版本与下载地址:Binutils-2.19.tar.bz2http://ftp.gnu.org/gnu/binutils/gcc-4.4.4.tar.bz2http://mirrors.kernel.org/gnu/gcc/gcc-4.4.4/Glibc-2.11.2.tar.bz2Glibc-ports-2.11.tar.bz2http://ftp.gnu.org/gnu/glibc/Gmp-4.2.tar.bz2http://ftp.g

2021-04-23 11:07:05 500

原创 设计模式:桥接模式

作用:将抽象部份与它的实现部份分离,使它们都可以独立地变化。将抽象(Abstraction)与实现(Implementation)分离,使得二者可以独立地变化。桥接模式号称设计模式中最难理解的模式之一,关键就是这个抽象和实现的分离非常让人奇怪,大部分人刚看到这个定义的时候都会认为实现就是继承自抽象,那怎么可能将他们分离呢。《大话设计模式》中就Bridge模式的解释:手机品牌和软件是两个概念,不同的软件可以在不同的手机上,不同的手机可以有相同的软件,两者都具有很大的变动性。如果我们单独以手机品

2021-04-15 12:44:02 136

原创 ubuntu 16.04搭建python开发环境sublime test3

本来是想用pycharm,但你看它的内存要求,我的虚拟机一共也就1GVim太别扭了,就算有代码颜色,不能自动对齐,不能规范格式,跳转到函数定义,显示文档,要配置起来太费劲,所以就尝试着用sublime text3 来搭建Python IDE安装sublime text3目前最简单的方法是通过ppa安装,打开终端,输入以下命令:sudo add-apt-repository ppa:webupd8team/sublime-text-3sudo apt-get updatesu.

2021-04-08 21:25:58 355

原创 类之间的关系C++

类之间的关系在大体上分为两种,一种是纵向的,另一种是横向的。一、纵向的就是继承,它是OO的三个特征之一。在UNL中称作:泛化(Generalization)表示为:实线+空心三角形实现(Realization)表示为: 虚线+空心三角形u泛化泛化关系:是一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。表示类与类之间的继承关系,接口与接口之间的继承关系。一般化的关系是从子类指向父类的,与继...

2021-04-07 09:20:15 420

原创 C语言细节(1)-------一级指针与二级指针透彻理解

指针参数传递实质及二级指针使用分类: C/C++2017-04-10 11:45:10没做题,真的以为自己对指针算是掌握了,刷面试题时才发现自己对指针参数传递问题并不是真正搞透彻了,所以参考了很多其他博客写一篇指针参数传递的文章,加深一下自己的理解,水平有限,如有错误,欢迎指正,谢谢。大家先看一下经常出现的笔试题:程序1:void myMalloc(char *s) //想在函数中分配内存,再返回{ s=(char *)mallo...

2021-01-21 18:27:39 322

转载 preface of generation

最近学院里的nfc老师要我们做个设备驱动,之前从没接手过这个东西,加上老师给的材料错误也是一大堆,搞了差不多一个星期才搞出来。特此写一个博客,以免后来人和我一样跳坑。总体考虑要去写设备驱动程序,说白了就三大步骤:下载内核源码构建内核源码树(也就是下载你的目的内核源码包并解压就行了)、编译内核(这样才能让操作系统感知自己写的驱动程序)、写代码(编写内核程序并编译测试)。这三步哪一步都很艰难。我是在自己笔记本上用虚拟机VMware装的ubuntu操作系统,相比于装双系统有一大缺点和一大优..

2021-01-06 10:00:32 120

原创 基于双向链表的双向链栈的纯C语言实现

最近重新领悟C语言,为了练习,简单写了一个双向链栈,目的是温习一下基本的数据结构与模型,开发环境选用最原始的linux环境下的vim编辑器,主要涉及一些比较基础的指针的操作与数据的组织,内存上的考虑可能不是特别全面,希望大家多多指正。1. sudo touch biNode.hsudo touch biNode.csudo touch main.c2. 使用vim -O biNode.h biNode.c main.c打开vim 编辑器编写代码如下:biNode.h#inclu.

2020-09-27 18:06:30 962

原创 ubuntu 16.04 使用VS Code开发C/C++

1. Vscode安装Visual studio code是微软发布的一个运行于 Mac OS X、Windows和 Linux 之上的,针对于编写现代 Web 和云应用的跨平台源代码编辑器。安装方式是从VScode官网下载.deb文件,然后双击该文件会打开软件中心进行安装。安装方法.png安装完毕后即可打开VScode,主界面如下:安装完成后主界面.png2. Vscode环境配置 (1)安装c/c++插件 首先通过左边栏的Extension栏目安装...

2020-09-26 16:52:08 374

原创 2020-08-16

我上一篇的帖子写了如何写lcd驱动框架,其实在一开始的时候,我相信有的人也有跟我一样的误区,以为LCD和触摸屏是同种概念的东西,但是并不是这样的,LCD是LCD,触摸屏是触摸屏,触摸屏的结构其实是可以说是两张很薄的肉眼看不见的膜,然后贴附在LCD液晶屏上。本帖以电阻式触摸屏为例来简单总结一下触摸屏驱动程序的框架,触摸屏还有一种比较常见的是电容式触摸屏,我们现在的苹果手机所用的触摸屏就是电容式触摸屏,想要了解的朋友可以自行去网上搜索资料。触摸屏的具体模型如下图:在写触摸屏驱动程序前,我们需要先...

2020-08-16 15:19:34 275

原创 网络知识

阅读目录1. 网络层次划分2. OSI七层网络模型3. IP地址4. 子网掩码及网络划分5. ARP/RARP协议6. 路由选择协议7. TCP/IP协议8. UDP协议 9. DNS协议10. NAT协议11. DHCP协议12. HTTP协议13. 一个举例  计算机网络学习的核心内容就是网络协议的学习。网络协议是为计算机网络中进行数据交换而建立的规则、标准或者说是约定的集合。因为不同用户的数据终端可能采取的字符集是不同的,两者需要进行通信,必须要

2020-07-21 22:03:38 3070 1

原创 python包的制作与模块的封装

环境:ubuntu 16.04 + anaconda python +常见的机器学习框架1.编写测试程序:.py文件,pycharm编译通过注意:if __name__ = '__main__': 主函数引用所要用的方法2.编写__init__.py文件,此文件主要是import 的时候调用的文件__all__ = [".py文件的主文件名"]3.在同一目录下编写setup.py文件from setuptools import setupsetup(name='自己随便起', v

2020-07-17 18:57:32 481

原创 ananconda安装机器学习深度学习框架

安装pytorch:conda install pytorch-cpu torchvision-cpu -c pytorch安装opencv:直接使用conda intall opencv 系统默认3.4.2注:在python文件中import cv2出现无法识别的现象,见下面安装keras与tensorflow:conda activate baseconda install kerasconda install tensorflow安装Caffe与MXNet深度学习框

2020-07-15 18:29:57 267

原创 conda 常见问题总结与常见命令

安装conda后取消命令行前出现的base,取消每次启动自动激活conda的基础环境方法一:每次在命令行通过conda deactivate退出base环境回到系统自动的环境方法二1、通过将auto_activate_base参数设置为false实现:conda config --set auto_activate_base false2、那要进入的话通过conda activate base3、如果反悔了还是希望base一直留着的话通过conda config --set au

2020-07-15 11:16:56 1222

原创 ubuntu下搭建vscode C++开发环境

Visual studio code是微软发布的一个运行于 Mac OS X、Windows和 Linux 之上的,针对于编写现代 Web 和云应用的跨平台源代码编辑器。1. Vscode安装第一种方式是从VScode官网下载.deb文件,然后双击该文件会打开软件中心进行安装。第二种方式是通过Terminal进行安装,首先输入下面三条语句安装umake: 1 2 3 sudo add-apt-repository ppa:ubuntu-desktop

2020-05-14 23:35:26 3039 1

原创 numpy随机数api

在python数据分析的学习和应用过程中,经常需要用到numpy的随机函数,由于随机函数random的功能比较多,经常会混淆或记不住,下面我们一起来汇总学习下。import numpy as np1 numpy.random.rand()numpy.random.rand(d0,d1,…,dn)rand函数根据给定维度生成[0,1)之间的数据,包含0,不包含1 dn表格每个维度 返回值为指定维度的arraynp.random.rand(4,2) array([[ .

2020-05-10 10:51:42 360

原创 pycharm鼠标滑轮调整字体大小

Pycharm用鼠标滚轮控制字体大小一、pycharm字体放大的设置File —> setting —> Keymap —>在搜寻框中输入:increase —> Increase Font Size(双击) —> 在弹出的对话框中选择Add Mouse Shortcut 在弹出的对话框中同时按住ctrl键和鼠标滚轮向上滑。二、Pycharm字体缩小的设置File —> setting —> Keymap —>在搜寻框中输入:de.

2020-05-09 15:19:20 589

原创 Numpy线性代数

NumPy 线性代数NumPy 提供了线性代数函数库 linalg,该库包含了线性代数所需的所有功能,可以看看下面的说明:函数 描述 dot 两个数组的点积,即元素对应相乘。 vdot 两个向量的点积 inner 两个数组的内积 matmul 两个数组的矩阵积 determinant 数组的行列式 solve 求解线性矩阵方...

2020-05-01 12:20:50 250

空空如也

空空如也

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

TA关注的人

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