Day1 ARM基础
【ARM课程认知】
1.ARM课程的作用
承上启下
- 基础授课阶段:c语言、数据结构、linux
- 嵌入式应用层课程:IO、进程线程、网络编程
- 嵌入式底层课程:ARM体系结构、系统移植、linux设备驱动
- c++/QT
2.ARM课程需要掌握的内容
- 自己能够实现简单的汇编编程
- 能够看懂常见的电路原理图
- 掌握软件编程控制硬件的思想
- 了解芯片内部常用外设的工作原理:GPIO、UART、TIMER、IIC、SPI、GIC
- 掌握数据手册读写的方法
3.ARM的学习方法
- 上课好好整理明白硬件的工作原理
- 充分利用硬件环境
【计算机相关理论】
1.计算机的组成
输入设备、输出设备、运算器、控制器、存储器
1.输入设备:将编写好的软件代码以及相关的数据输送到计算机中,转换成计算机能够识别、处理和存储的数据形式 键盘、鼠标、手柄、扫描仪、 2.输出设备:将计算机处理好的数据的结果通过输出设备输出到计算机的外部 显示屏、打印机、音响。。 3.存储器:计算机用于存放数据以及指令的部件。也是计算机实现"程序存储控制"的基础 外部存储器、内存、cache、寄存器 4.控制器(CU):计算机的控制中枢,对机器指令进行译码操作,并且按照译码之后的结果进行相关的控制 5.运算器(ALU):算数逻辑运算单元:根据控制器译码之后的指令和数据,进行算数逻辑运算,并且把运算的结果进行输出
2.程序编译的原理
程序编译的步骤:
- 预处理:将程序中所有以#开头的内容展开到当前文件中 gcc -E 1.c -o 1.i
- 编译:检查语法错误,生成汇编程序 gcc -S 1.i -o 1.s
- 汇编:将汇编程序编译为二进制程序 gcc -c 1.s -o 1.o
- 链接:将程序中用到的一些库链接到程序中,生成二进制可执行文件 gcc 1.o -o a.out
程序编译的原理:
CPU能够识别的唯一的语言是机器语言。一个CPU能够识别哪一些机器语言是由CPU的硬件(运算器的类型)决定的。
不同的机器指令代表不同的运算。相同运算在不同的机器上的机器指令不一定一样,不同的机器的机器指令不通用,不可移植。汇编指令就是特定机器指令的标志。汇编指令也是不通用的。我们可以采用不同的编译工具编译程序生成可以被不同架构的机器识别的机器指令文件
3.指令和指令集
- 机器指令(指令的机器码):由二进制的0和1组成的一条机器码。计算机解析这条机器码可以做相应的运算处理
- 汇编指令:一条汇编指令就是一条机器指令的标志。执行汇编指令也可以让机器进行相关的运算处理
- 指令集:指令的集合
4.RISC(精简指令集)和CISC(复杂指令集)
RISC(精简指令集)的架构主要应用于嵌入式的设备上 精简指令集是选取了一些比较简单、使用频率比较高的指令组成的指令集 精简指令集的特点: 1.指令的长度和指令的执行周期固定 指令的长度:一条机器码在计算机中占用的空间 指令的周期:CPU执行一条指令花费的时间(时钟周期) 时钟周期:CPU主频率 2.基于精简指令集设计的CPU核心成本、功耗、体积更低,但是实现的功能也相对简单 CISC(复杂指令集) 基于复杂指令集设计的CPU核心更加注重功能的完善性,复杂指令集内核会集合各自各样的指令。 特点: 1.指令的长度和执行周期不固定 2.复杂指令集设计的CPU核心实现的功能更为复杂,但是功耗、成本都会更高
生成X86架构a.out的反汇编,查看a.out文件中每一条指令的大小和地址
5.目前几种主流的RISC内核
ARM内核:主流的嵌入式内核,需要得到ARM的授权 RISC-V:正在快速发展,未来会成为主流 MIPS:完全闭源,中国龙芯科技直接买断,完全垄断,在它的基础上还进行了一些拓展
【ARM相关内容】
1.ARM的发展历史
ARM发展史 (huawei.com)
ARM :Advanced RISC Machines(最初命名为Acorn RISC Machine)简称ARM。对ARM可以有三种理解:1)ARM公司:Advanced RISC Machines Limited;2)ARM处理器架构;3)一种技术——ARM技术。 ARM 公司是全球领先的半导体知识产权 (IP) 提供商,并因此在数字电子产品的开发中处于核心地位 ARM 的商业模式主要涉及 IP 的设计和许可,而非生产和销售实际的半导体芯片。 里程碑1——ARM成立 ARM前身为艾康电脑(Acorn),于1978年,英国剑桥成立,大学的孵化物。 1980年代晚期,苹果开始与艾康合作,开发新版ARM核心。 1985年,艾康开发出全球第一款商用RISC处理器,即ARM1,针对于PC市场,还没有嵌入式呢!!! 1990年,艾康财务危机,受苹果和VLSI(最早做超大规模集成电路的公司)的投资,成立独立子公司:Advanced RISC Machines(ARM),ARM公司正式成立面世 里 程碑2——嵌入式RSIC处理器 1991年,ARM推出第一款嵌入式RISC处理器,即ARM6。 1993年,发布ARM7。 1997年,发布ARM9TDMI,三星2440基于此内核。 1999年,发布ARM9E,增强型ARM9。 2001年,ARMv6架构。 2002年,发布ARM11微架构。 里程碑3——微控制器 2004年,发布ARMv7架构的Cortex系列处理器,同时推出Cortex-M3。 2005年,发布Cortex-A8处理器。 2007年,发布Cortex-M1和Cortex-A9 2009年,实现Cortex-A9、发布Cortex-M0 2010年,推出Cortex-M4(F)、成立Linaro(ARM公司牵头成立的公共组织,专门做ARM处理器在Linux平台上的一些软件的开发和移植),推出Cortex-A15 MPcore高性能处理器(性能比较高了,但是发热量很大)。 里程碑4——64位处理器时代 2011年,推出32位 Cortex-A7 处理器,ARMv8发布 2012年,开始推出64位处理器。推出 Cortex-M0+、ARM 首款64位处理器架构 Cortex-A53、Cortex-A57 架构。全球第一款64位ARM手机iPhone5s。 2013年,推出32位 Cortex-A12 处理器架构 2014年,推出 Cortex-M7(F) 微控制器架构;32位 Cortex-A17处理器架构。 2015年,推出64位 Cortex-A35、Cortex-A72 处理器架构。 2016年,推出 Cortex-M23 、Cortex-M33(F) 微控制器架构;32位 Cortex-A32 处理器架构;64位 Cortex-A73 处理器架构。 2017年,推出64位 Cortex-A55 、Cortex-A75 处理器架构。 2018年,推出微控制器 Cortex-M35P;64位 Cortex-A76 处理器架构。 2016---ARM被软银收购 2020---英伟达收购ARM未果
2.ARM架构
不同版本的指令集就是不同的架构
ARMV1-ARMV6:已经被淘汰 ARMV7架构:32位架构,支持32位指令集 ARMV8架构:64位架构,支持64位指令集,并且向下兼容32位指令 ARMV9架构:64位架构,支持64位指令集
3.ARM内核
基于不同的ARM架构设计出来的不同的处理器核心叫做不同的ARM内核
arm7/arm9/arm11 cortex-A7 ARMV7 cortex-A53 ARMV8 cortex-A55 ARMV8 cortex-A77 ARMV8 cortex-A78 ARMV8 cortex-x1 ARMV8 cortex-A710 ARMV9 cortex-A510 ARMV9
4.SOC(system on chip)
ARM公司只进行技术授权。将自己的IP授权给各个半导体公司。半导体公司根据ARM的授权,在CPU核心外围设计了一些外围电路和设备,集成在一个芯片上,这个芯片就被成为SOC。
SOC由CPU+外设备+总线组成
MCU(微控制器) MPU(微处理器)
公司 SOC名称 内核 架构 ST STM32MP157A cortex-A7 ARMV7 三星 S5P6818 cortex-A53 ARMV8 海思 麒麟9000 cortex-A77 ARMV8 高通 骁龙888 cortex-x1 ARMV8
5.ARM的产品分步
5.1 Cortex-A系列
Cortex-A系列 的核心是ARM处理器中性能最强的、最完善的处理器。属于高端处理器 在基于Cortex-A处理器为核心的开发板上可以搭载linux/鸿蒙灯标准化操作系统
5.2 Cortex-R系列
Cortex-R系列 处理器追求系统的实时性能。对数阶的实时性要求高的场景下使用Cortex-R系列 处理器 汽车、军工
5.3 Cortex-M系列
属于ARM处理器中比较低端的芯片处理器,工作主频一般在24M-256MHz之间 Cortex-M系列 处理器一般不跑操作系统,主要执行一些裸机程序 Cortex-M系列 处理器可以搭载一些轻量级的实时系统 FreeRtos
5.4 SecurCore系列
用于对安全性能要求比较高的场景
6.ARM数据约定
查询芯片手册时可以看到的一些数据大小的表述
A7采用的是32位架构. ARM 约定 Byte 8 bits. Halfword 16 bits. Word 32 bits. Doubleword 64 bits. 32位指令集:一条指令占据存储空间的大小是32位 32位处理器:处理器一条指令最大能进行32位数据的运算 想要在32位处理器中进行64位数据的运算: 0X 00000001 FFFFFFFE 0x 00000004 00000002 先让低32位进行运算,再让高32位进行运算 大部分ARM core 提供: ARM 指令集(32-bit) Thumb 指令集(16-bit ) Cortex-A处理器 16位和32位Thumb-2指令集 16位和32位ThumbEE指令集
7.ARM的工作模式
ARM处理器在面对不同的情境下需要进入不同的工作模式进行对应模式下的处理
ARM 有7种基本工作模式: User : 非特权模式,大部分任务执行在这种模式 FIQ : 当一个高优先级(fast) 中断产生时将会进入这种模式 IRQ : 当一个低优先级(normal) 中断产生时将会进入这种模式 Supervisor :当复位或软中断指令执行时将会进入这种模式 Abort : 当存取异常时将会进入这种模式 Undef : 当执行未定义指令时会进入这种模式 System : 使用和User模式相同寄存器集的特权模式 Cortex-A特有模式: Monitor : 是为了安全而扩展出的用于执行安全监控代码的模式; 也是一种特权模式 HYP:虚拟化模式,当一个硬件上运行两种OS内核时进入这种模式
8.ARM寄存器组织
8.1 计算机内部存储模块介绍
8.2 寄存器概念
寄存器是集成在CPU内部的存储组织,CPU访问寄存器数据的时候只需要根据寄存器的编号就可以访问到寄存器的数值。访问寄存器的速度块。但是寄存器存在数量限制,保存的数据量也很少
8.3 ARM v7架构下的寄存器组织
ARM 有37个32-Bits长的寄存器: 1 个用作PC( program counter) 1个用作CPSR(current program status register) 5个用作SPSR(saved program status registers) 30 个通用寄存器 Cortex体系结构下有40个32-Bits长的寄存器: Cortex-A多出3个寄存器, Monitor 模式 r13_mon , r14_mon, spsr_mon 当前处理器的模式决定着哪组寄存器可操作. 任何模式都可以存取: 相应的r0-r12子集 相应的 r13 (the stack pointer, sp) and r14 (the link register, lr) 相应的 r15 ( the program counter, pc) 相应的CPSR(current program status register, cpsr) 特权模式 (除system模式) 还可以存取: 相应的 spsr (saved program status register) 每一个寄存器大小都是32位
8.4 ARMV8架构寄存器组织
8.5 ARMV7架构下一些具有特定功能的寄存器
R13寄存器(the stack pointer, sp)
R13寄存器又叫SP(栈指针寄存器),这个寄存器内部保存栈顶的地址 一般在内存中分出一部分内存当作栈来使用,SP寄存器时钟保存栈顶空间的地址 栈一般存放一些临时数据,也可以用于保护现场
r15寄存器(the program counter, pc)
R15寄存器又被称为PC寄存器(程序计数器) 这个寄存器始终保存马上要进行取址的指令的地址,当一条指令执行结束之后PC寄存器的数值会自动向下+4 另外,在特定情况下可以手动修改PC的值进行程序的跳转
R14寄存器(the link register, lr)
R14寄存器又被称为链接寄存器,当程序在实现跳转的时候,LR寄存器中保存当前跳转指令下一条指令的地址。方便 实现程序的返回 程序的跳转实现: PC-》跳转之后指令的地址 程序的返回: PC=LR
CPSR寄存器(current program status register, cpsr)
CPSR:程序状态寄存器 这个寄存器中保存当前程序的运行状态,比如工作模式等信息 SPSR:saved program status register SPSR寄存器可以用于保存程序某一时刻的状态 比如当发生异常之后,处理器的工作模式要切换到对应的异常模式去处理异常,这样CPSR的数值会发生对应的改变 在处理完异常结束后,我们需要将CPSR的值修改为没有发送异常之前的状态,这个时候就可以将SPSR保存的异常发送之前的状态赋值给CPSR
1. N[31] : 指令的运行结果为负数时,N位被自动置1,否则为0. eg : 100 - 200 2. Z[30] : 指令的运行结果为零时,Z位被自动置1,否则为0. 100-100 3. C[29] : 加法:加法运算如果产生进位,C位被自动置1,否则为0. 32位指令:低32位向高32位进位 0XFFFFFFFF+1 减法:减法运算如果产生借位,C位被自动清0,否则位1. 32位指令:低32位向高32位借位 1-0XFFFFFFFE 4. V[28] : 符号位发送变化,V位被自动置1,否则清0. 5. I[7] : IRQ中断屏蔽位 I = 0 : 不屏蔽IRQ中断 I = 1 : 屏蔽IRQ中断 6. F[6] : FIQ中断屏蔽位 F = 0 : 不屏蔽FIQ中断 F = 1 : 屏蔽FIQ中断 7. T[5] : 状态位 T = 0 : 表示ARM状态,执行的是ARM指令集 T = 1 : 表示Thumb状态,执行的是Thumb指令集 ARM指令集 : 一条汇编指令编译生成32位的机器码 thumb指令集:一条汇编指令编译生成16位的机器码 ARM指令集的代码的密度低,而thumb指令记得代码密度高。 ARM指令集的功能性要高于Thumb指令集。 8. M[4:0] : 模式位 10000 User mode; 10001 FIQ mode; 10010 IRQ 10011 SVC mode; 10111 Abort mode; 11011 Undfined mode; 11111 System mode; 10110 Monitor mode; 其他没有使用到的值,保留。
9.ARM的流水线工作
9.1 一条指令的执行过程
取址:CPU将PC寄存器中保持的指令地址通过地址总线传输给存储器,存储器将PC对应的指令通过数据总线传输给CPU。CPU将指令保存在IR(指令暂存寄存器)寄存器中 译码:IR寄存器的指令交给译码器,对指令进行译码 执行:译码器对指令译码之后由运算器对译码之后的指令进行运算
9.2 ARM三级流水线
当一条指令在被取址是,译码模块和执行模块处于空闲状态,这样这两个模块相当于没有得到充分利用。为了充分,利用资源,ARM引入了流水线工作,增加了指令的处理速度
【任务】
1.安装汇编环境:
开发工具-》汇编环境搭建
相关文章:

Day1 ARM基础
【ARM课程认知】 1.ARM课程的作用 承上启下 基础授课阶段:c语言、数据结构、linux嵌入式应用层课程:IO、进程线程、网络编程嵌入式底层课程:ARM体系结构、系统移植、linux设备驱动c/QT 2.ARM课程需要掌握的内容 自己能够实现简单的汇编编…...

ns3入门基础教程
ns3入门基础教程 文章目录 ns3入门基础教程ns环境配置测试ns3环境ns3简单案例 ns环境配置 官方网站:https://www.nsnam.org/releases/ 代码仓库:https://gitlab.com/nsnam/ns-3-dev 如果安装遇到问题,可以参考以下博文: https://…...

计算机视觉
目录 一、图像处理 main denoise 二、Harris角点检测 三、Hough变换直线检测 四、直方图显著性检测 五、人脸识别 六、kmeans import 函数 kmeanstext 七、神经网络 常用函数: imread----------读取图像 imshow---------显示图像 rgb2hsv---------RGB转…...

NSSCTF第10页(3)
[LitCTF 2023]彩蛋 第一题: LitCTF{First_t0_The_k3y! (1/?) 第三题: <?php // 第三个彩蛋!(看过头号玩家么?) // R3ady_Pl4yer_000ne (3/?) ?> 第六题: wow 你找到了第二个彩蛋哦~ _S0_ne3t? (2/?) 第七题…...

MySQL性能分析工具的使用
1. 统计SQL的查询成本:last_query_cost SHOW STATUS LIKE last_query_cost; 使用场景:它对于比较开销是非常有用的,特别是我们有好几种查询方式可选的时候。 SQL 查询是一个动态的过程,从页加载的角度来看,我们可以得到…...

Uniapp使用AES128加解密16进制
在对接低功耗蓝牙时,我们需要对蓝牙传输数据进行加解密,由于我们对接的命令是16进制,如5500020101aa00,每个16进制表示特定的含义,所以直接对16进制加解密 import CryptoJS from crypto-js// AES128 加密函数 functio…...

C++基础——类与对象
1 概述 C是面向对象的语言,面向对象语言三大特性:封装、继承、多态。 C将万事万物抽象为对象,对象上有其属性和行为。 2 封装 2.1 封装的意义 封装是面向对象的三大特性之一,封装将属性和行为作为一个整体,对属性和…...

人工智能-卷积神经网络
从全连接层到卷积 我们之前讨论的多层感知机十分适合处理表格数据,其中行对应样本,列对应特征。 对于表格数据,我们寻找的模式可能涉及特征之间的交互,但是我们不能预先假设任何与特征交互相关的先验结构。 此时,多层感…...

MySQL的event的使用方法
MySQL的event的使用方法 一、事件定时策略 1、查看event事件开启状态 SHOW VARIABLES LIKE event_scheduler;如图,Value值 ON:打开,OFF:关闭。 2、设置event事件打开 SET GLOBAL event_scheduler ON;如果MySQL重启了&#x…...

Leetcode Daily Challenge 1845. Seat Reservation Manager
1845. Seat Reservation Manager 题目要求:初始化一个SeatManager类包括默认构造函数和类函数,所有的seat初始化为true。reverse函数返回最小的true,然后把这个编号的椅子赋值为false。unreverse(seatNumber)函数把编号为seatNumber的椅子恢…...

Blender vs 3ds Max:谁才是3D软件的未来
在不断发展的3D建模和动画领域,两大软件巨头Blender和3ds Max一直在争夺顶级地位。 随着技术的进步和用户需求的演变,一个重要问题逐渐浮出水面:Blender是否最终会取代3ds Max?本文将深入探讨二者各自的优势和劣势、当前状况&…...

MapReduce:大数据处理的范式
一、介绍 在当今的数字时代,生成和收集的数据量正以前所未有的速度增长。这种数据的爆炸式增长催生了大数据领域,传统的数据处理方法往往不足。MapReduce是一个编程模型和相关框架,已成为应对大数据处理挑战的强大解决方案。本文探讨了MapRed…...

【已解决】ModuleNotFoundError: No module named ‘dgl‘
禁止使用下面方法安装DGL,这种方法会更新你的pytorch版本,环境越变越乱 pip install dgl 二是进入DGL官网:Deep Graph Library (dgl.ai),了解自己的配置情况,比如我cuda11.8,ubuntu,当然和linux是一样的 …...

R 复习 菜鸟教程
R语言老师说R好就业,学就完了 基础语法 cat()可以拼接函数: > cat(1, "加", 1, "等于", 2, \n) 1 加 1 等于 2sink():重定向 sink("r_test.txt", splitTRUE) # 控制台同样输出 for (i in 1:5) print(i…...

第十二章《搞懂算法:朴素贝叶斯是怎么回事》笔记
朴素贝叶斯是经典的机器学习算法,也是统计模型中的一个基本方法。它的基本思想是利用统计学中的条件概率来进行分类。它是一种有监督学习算法,其中“朴素”是指该算法基于样本特征之间相互独立这个“朴素”假设。朴素贝叶斯原理简单、容易实现࿰…...

【从0到1开发一个网关】网关Mock功能的实现
文章目录 什么是Mock?如何实现Mock什么是Mock? Mock(模拟)是一种测试技术,用于创建虚拟对象来模拟真实对象的行为。Mock对象模拟了真实对象的行为,但是不依赖于真实对象的实现细节。它们可以在测试中替代真实对象,以便进行独立的单元测试。 需要使用Mock的原因包括以下几…...

前端框架Vue学习 ——(三)Vue生命周期
生命周期:指一个对象从创建到销毁的整个过程。 生命周期的八个阶段:每触发一个生命周期事件,会自动执行一个生命周期方法(钩子) mounted:挂载完成,Vue 初始化成功,HTML 页面渲染成功…...

相机滤镜软件Nevercenter CameraBag Photo mac中文版特点介绍
Nevercenter CameraBag Photo mac是一款相机和滤镜应用程序,它提供了一系列先进的滤镜、调整工具和预设,可以帮助用户快速地优化和编辑照片。 Nevercenter CameraBag Photo mac软件特点介绍 1. 滤镜:Nevercenter CameraBag Photo提供了超过2…...

游戏专用....
游戏专用:星际战甲 APP窗口以及键鼠监控 import tkinter as tk import time,threading from pynput.keyboard import Key,Listener import pynput.keyboard as kbclass myClass:def __init__(self):self.root tk.Tk()self.new_text self.flag threading.Event()…...

第三方登录和第三方支付
第三方登录 在现代Web应用中,提供第三方登录选项已经变得非常普遍。用户可以使用其社交媒体或其他在线帐户(如Google、GitHub或Facebook)来访问您的应用程序,而无需创建新的用户名和密码。这提供了更好的用户体验,减少…...

SpringMvc执行流程(含过滤器Filter+拦截器interceptor)
目录 1.Mvc的概念 2.SpringMvc的概念 3.SpringMvc的核心组件 4.SpringMvc的执行流程 5.SpringMvcFilterInterceptor执行流程 一、Mvc的概念 Mvc(Model View Controller):Mvc是一种设计规范,它将数据、视图、业务逻辑代码进行分离,降低代码…...

【UDS基础】简单介绍“统一诊断服务“
1. 前言 我们将在这个实用教程中介绍UDS的基础知识,重点关注在CAN总线上的UDS(UDSonCAN)和CAN诊断(DoCAN)。此外,我们还会介绍ISO-TP协议,并解释UDS、OBD2、WWH-OBD和OBDonUDS之间的差异。 最后,我们将解释如何请求、记录和解码UDS消息,并提供一些实际示例,例如记录…...

深度学习框架TensorFlow.NET之数据类型及张量2(C#)
环境搭建参考: 深度学习框架TensorFlow.NET环境搭建1(C#)-CSDN博客 由于本文作者水平有限,如有写得不对的地方,往指出 声明变量:tf.Variable 声明常量:tf.constant 下面通过代码的方式进行学…...

Pandas指定多列组合形成新列
目录 1、数据准备2、多列组合 1、数据准备 df pd.DataFrame({first_name: [A, B], last_name: [a, b]}) print(df.to_string()) first_name last_name 0 A a 1 B b 2、多列组合 2.1、方式一:使用cat() df[full_name] df[firs…...

硕鼠——视频下载利器
相信很多做自媒体、剪辑的同志们,经常会遇到一个棘手的问题:剪辑的素材从何而来。诸如很多高燃混剪的视频,往往需要多个影视作品中的原画来进行二次创作,可是这些视频素材从何而来呢? 有小伙伴们提出,通过录…...

Android 13.0 Launcher3 app图标长按去掉应用信息按钮
1.前言 在13.0的rom定制化开发中,在Launcher3定制化开发中,对Launcher3的定制化功能中,在Launcher3的app列表页会在长按时,弹出微件和应用信息两个按钮,点击对应的按钮跳转到相关的功能页面, 现在由于产品需求要求禁用应用信息,不让进入到应用信息页面所以要去掉应用信息…...

10 DETR 论文精读【论文精读】End-to-End Object Detection with Transformers
目录 DETR 这篇论文,大家为什么喜欢它?为什么大家说它是一个目标检测里的里程碑式的工作?而且为什么说它是一个全新的架构? 1 题目 2摘要 2.1新的任务定义:把这个目标检测这个任务直接看成是一个集合预测的问题 2.…...

高数笔记05:不定积分与定积分
图源:文心一言 时间比较紧张,仅导图~~🥝🥝 第1版:查资料、画导图~🧩🧩 参考资料:《高等数学 基础篇》武忠祥 🐳目录 🐳目录 🐳不定积分 &#…...

【代码随想录】算法训练计划13
1、347. 前 K 个高频元素 题目: 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 输入: nums [1,1,1,2,2,3], k 2 输出: [1,2] 思路: sort.Slice学习一下,其实还有so…...

Python图像处理之OpenCV模块
Python图像处理 1、OpenCV模块简介2、OpenCV模块图像常用操作3、PIL与OpenCV图像格式转换4、图像识别应用案例4.1、人脸识别4.2、车牌识别4.3、文本识别1、OpenCV模块简介 OpenCV(Open Source Computer Vision Library)是一个基于BSD许可(开源)发行的跨平台计算机视觉库,主…...