python_parser
argparse介绍
argparse 模块是 Python 内置的一个用于==命令项选项与参数解析==的模块,argparse 模块可以让人轻松编写用户友好的命令行接口。通过在程序中定义好我们需要的参数,然后 argparse 将会从 sys.argv 解析出这些参数。argparse 模块还会自动生成帮助和使用手册,并在用户给程序传入无效参数时报出错误信息。
官方地址:https://docs.python.org/zh-cn/3/library/argparse.html#argumentparser-objects
使用介绍
1 | import argparse |
add_argument()
其中,这个方法定义了如何解析命令行参数。
1 | ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest]) |
命令行下单点调试的方式,python -m pdb xxx.py
补充串口库
pyserical库可以非常方便和串口的通讯
官方文档
https://pyserial.readthedocs.io/en/latest/pyserial.html
1 | import serial.tools.list_ports |
打开串口,参数说明
1 | __init__(port=None, baudrate=9600, bytesize=EIGHTBITS, parity=PARITY_NONE, stopbits=STOPBITS_ONE, timeout=None, xonxoff=False, rtscts=False, write_timeout=None, dsrdtr=False, inter_byte_timeout=None, exclusive=None) |
bytesize : 数据位,可取值five six seven eight等等
parity : 校验位,可取值none,even,odd,mask,spcae等等。
stop:停止位,one,two,five等等
timeout:超时时间,读超时时间,可取值为 None, 0 或者其他具体数值(支持小数)。当设置为 None 时,表示阻塞式读取,一直读到期望的所有数据才返回;当设置为 0 时,表示非阻塞式读取,无论读取到多少数据都立即返回;当设置为其他数值时,表示设置具体的超时时间(以秒为单位),如果在该时间内没有读取到所有数据,则直接返回
xonxoff:软件流控。
1 | #举例 |
Photographic_learning
摄影参数介绍
白平衡:通过调整色温尽量保持白色为原本的白色,即平衡白色的颜色。(本质是通过调整色温来调整蓝色/红色的互补色 )(90%的场景可以使用自动白平衡)
- 白色优先/氛围优先
- 环境中光源很多的时候,自动白平衡可能效果不好,手动不知道设置什么的时候,设置一下白卡校准。延时拍摄需要手动设置,不然会收到忽然出现物体的影响。RAW格式后期可以无损更改白平衡
色温:颜色的温度,色温越高 颜色越偏蓝,色温约低,颜色越偏红。
色相:后期修改偏色,颜色发绿等等。
对焦:主要依靠镜头来完成。镜头外圈单位为m,内圈单位为inch,AF自动对焦,MF手动对焦 (当环境较暗,色彩很多的时候,自动对焦可能会不准。镜头有最小对焦距离,不得小于此,否则会无法对焦。)
AF-S:单次对焦,移动相机对焦距离也不会改变。
AF-A:自动检测物体是否移动。
AF-C:连续对焦模式。(80%)
DMF:自动对焦后,可手动精细对焦调节
广域对焦:屏幕范围内任何都可以对焦
点对焦SML,小中大。自由选择对焦点。
扩展点:点无法对焦的时候在附近找扩展点进行对焦
跟踪对焦:选择对焦区域。对焦点会一直跟着指定物体。
AF过渡速度:从一个对焦点移动到另一个对焦点的速度
AF转移灵敏度:如果焦点前有物体掠过的时候,是否会快速对焦到物体身上。
测光模式
- 全局测光:分割画面,单独测光,提高焦点附近权重,计算均值。(90%)
- 中心测光:对画面中央物体进行测光,比如拍人的时候。
- 点测光;顾名思义。
曝光补偿:白+黑-,拍摄人物可以适当增加一点曝光补偿。因为人体反射率25%左右。相机自动曝光会拉低曝光值,导致人物偏暗。打开直方图也可以。
光圈:F值。数字越大,光圈越小。
- 光圈越大,进光亮越多。
- 光圈越大,虚化越明显,景深越浅。拍摄人物的时候放大光圈,拍摄风景的时候缩小光圈。
快门:单位:s 1/100秒。会计算0.01s的进光量到传感器。
- 快门速度越慢,进光量越多。
- 快门速度还会影响拖影。 运动速度较快的设备使用较快的快门速度。轨迹则用慢速快门。
- 一般可以设置快门速度值比焦段数值更高。
- 果冻效应:物体运动过快导致每一行图像数据有时间差。导致图片会倾斜。用全域快门来解决。因为全域快门一次读取的是所有的数据。
- 电子快门,不用机械快门。但是画质会减少,因为cpu还要处理电子快门逻辑。
- 电子前lian快门。
- 拍摄视频的时候的快门。和帧数相关。快门速度越快,每一帧记录物体移动时间越少。动态模糊越少。
- 设置相机的快门速度一般为帧数的2倍数。
ISO:ISO越高,画面越亮,噪点越多。增加增益,通电量。一般情况通过光圈和快门来控制曝光,实在没办法了,才会通过ISO提高。增加ISO的时候信噪比会提高。会放大本底噪声。主要是由于进光量不足,被迫只能放大信号,导致噪点被放大变得可见了。
挡位介绍
- auto:全自动
- P:程序自动曝光+手动曝光补偿
- A:光圈优先,相机自动调整快门和ISO。 拍摄人像的时候,大光圈优先
- S:快门优先挡位,相机自动调整光圈ISO。拍摄运动物体的时候。
- C1:C2 C3,自定义挡位。
Bloom_filter
布隆过滤器介绍
基本概念:它实质上是一个很长的二进制向量和一系列随机映射函数 (Hash函数)。
作用:它是一个空间效率高的概率型数据结构,用来告诉你:一个元素一定不存在或者可能存在。
优点:
在存储空间和时间都是常数,即hash函数的个数
Hash 函数相互之间没有关系,方便由硬件并行实现。
布隆过滤器不需要存储元素本身,在某些对保密要求非常严格的场合有优势。
布隆过滤器可以表示全集,其它任何数据结构都不能。
缺点:
- 有误判率存在
- 不支持删除
适用场景:
- 预防缓存穿透:布隆过滤器快速判断数据是否存在,避免通过查询数据库来判断数据是否存在。
- 网络爬虫:布隆过滤器可以用来去重已经爬取过的URL。
- 邮箱的垃圾邮件过滤。
- 黑白名单。
原理
结构
布隆过滤器实现原理就是一个超大位数的数组(BitMap)和多个不同Hash算法函数。与寻常数组不同的是,BitMap一个数组元素占一个bit,这一特性决定了BitMap能够极大地节省空间。
添加元素
将要添加的元素分别通过k个哈希函数计算得到k个哈希值,这k个hash值对应位数组上的k个位置,然后将这k个位置设置为1。
当不同元素在计算到相同的值后,依旧保持这一位为1即可。
查询元素
将要查询的元素分别通过k个哈希函数计算得到k个哈希值,这k个hash值对应位数组上的k个位置。如果这k个位置中有一个位置为0,则此元素一定不存在集合中。如果这k个位置全部为1,则这个元素可能存在。
误判
需要注意的是,布隆过滤器无法确定元素存在,只能确定元素不存在。出现的原因是多个输入经过哈希之后在相同的bit位置1了,这样就无法判断究竟是哪个输入产生的,因此误判的根源在于相同的 bit 位被多次映射且置 1。
这种情况也造成了布隆过滤器的删除问题,即布隆过滤器不存在删除操作。因为布隆过滤器的每一个 bit 并不是独占的,很有可能多个元素共享了某一位。如果我们直接删除这一位的话,会影响其他的元素。
应用场景
防止缓存穿透。缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。使用布隆过滤器能够避免频繁查询不存在的数据,减轻数据库的压力。
业务场景中判断用户是否阅读过某视频或文章,比如抖音或头条,当然会导致一定的误判,但不会让用户看到重复的内容。
gun hash表, 主要是利用 Bloom Filter
, 在常量时间内判断, 字符是否存在, 以及对应 .dynsym
的位置. 使用 gcc -g -o hello -Wl,--hash-style=sysv(gnu) hello.c
可以产生旧版本的 hash
表.
mcu-voltage
名词解释
(1)VCC:C=circuit 表示电路的意思, 即接入电路的电压
(2)VDD:D=device 表示器件的意思, 即器件内部的工作电压;
(3)VSS:S=series 表示公共连接的意思,通常指电路公共接地端电压
(4)VEE:负电压供电;场效应管的源极(S)
(5)VBAT:当使用电池或其他电源连接到VBAT脚上时,当VDD 断电时,可以保存备份寄存器的内容和维持RTC的功能。如果应用中没有使用外部电池,VBAT引脚应接到VDD引脚上。
(6)VPP:编程/擦除电压。
(7)GND:在电路里常被定为电压参考基点。
(8)CC与DD的区别是:供电电压与工作电压的区别(通常VCC>VDD)
(9)V与VA的区别是:数字与模拟的区别
1
2
3
4 - 数字电路供电VCC
- 模拟电路供电VCCA
- VDD是指数字工作电压,就是供电进芯片的
- VDDA是模拟电压或者叫模拟正电源,是从芯片向外供电的
应用解释
1、对于数字电路来说,VCC是电路的供电电压,VDD是芯片的工作电压(通常Vcc>Vdd),VSS是接地点。例如,对于ARM单片机来说,其供电电压VCC一般为5V,一般经过稳压模块将其转换为单片机工作电压VDD = 3.3V
2、有些IC既带VDD引脚又有VCC引脚,说明这种器件自身带有电压转换功能。
3、在场效应管(或COMS器件)中,VDD为漏极,VSS为源极,VDD和VSS指的是元件引脚,而不表示供电电压。
4、一般来说VCC=模拟电源,VDD=数字电源,VSS=数字地,VEE=负电源
5、从电气意义上说,GND分为电源地和信号地。PG是 Power Ground(电源地)的缩写。另一个是 Signal Ground(信号地)。实际上它们可能是连在一起的(不一定是混在一起哦!)。两个名称主要是便于对电路进行分析。
进一步说,还有因电路形式不同而必须区分的两种“地”:数字地,模拟地。
数字地和模拟地都有信号地、电源地两种情况。数字地和模拟地之间,某些电路可以直接连接,有些电路要用电抗器连接,有些电路不可连接。
mcu_reset
单片机复位介绍
经典的STM32内部复位电路如下
可以看到复位分为两大类:内部复位和外部复位
内部复位源通过脉冲发生器在 NRST 引脚产生延时至少 20μs 的脉冲,引起 NRST 保持电平产生复位;
外部复位源则直接将 NRST 引脚电平拉低产生复 位。
外部复位
NRST 引脚上的低电平。
软件复位
将 Arm® Cortex®-M3 中断应用和复位控制寄存器中的 SYSRESETREQ 置“1” 时,可实现软件复位。JLINK对设备的复位就是控制的这一位。Reset: Reset device via AIRCR.SYSRESETREQ.
内核复位
在Cortex-M内核文档中大概有这样的描述:通过设置 NVIC 中应用程序中断与复位控制寄存器(AIRCR)的VECTRESET 位,可只复位处理器内核而不复位其它片上设施。
也就是说,这样操作只复位Cortex-M内核,不会复位UART这些片内外设。
1 | void NVIC_CoreReset(void) |
系统复位
软件复位中的系统复位操作的寄存器位(SYSRESETREQ)不同,复位的对象为整个芯片(除后备区域)。
系统复位函数:
1 | void NVIC_SysReset(void) |
电源复位
分为上电复位(POR 复位),掉电复位(PDR 复位),从待机模式唤醒。
依靠单片机内部的电源监控电路,在供电电压达不到设定值时自动进行复位。当检测到 VDD/VDDA低于阈值电压 VPOR和 VPDR 时,芯片将会自动保持为复位状 态,上电复位和掉电复位的波形图如下。
低功耗复位
低功耗管理复位的产生有两种情况,一种是进入待机模式时,另一种是进入停止 模式时。在这两种情况下,如果把用户选择字节中的 RSTSTDB 位(待机模式 时)或 RSTSTOP 位(停止模式时)清零,系统将被复位而不是进入待机模式或 停止模式。
复位源查看
可以通过查看 RCM_CSTS(控制/状态寄存器)中的复位标志位识别复位事件来源,也可以相应清除标志位。
pll
PLL原理
由一个基准频率振荡器(晶体振荡器),相位频率比较器,VCO(电压控制振荡器),回路滤波器组成。晶振产生频率为fr的时钟,与VCO产生的fo的时钟同时传入相位频率比较器中进行比较,产生比较结果以脉冲波的形式传入回路滤波器,回路滤波器通过低频将脉冲波转变为直流低压VR,传入VCO对fo进行控制,形成反馈控制电路。
当fr>fo时产生PD为正脉冲,VR变大,当fr<fo时,PD产生负脉冲波,VR减小,形成对fo的闭环控制,最终目的,是fo==fr。
倍频器
PLL的主要功能还是倍频。倍频的实现其实很简单,只要在VCO的后面加一个分频器,时参与比较的Fvco=(1/n)fo,fo’是VCO产生的。这样就实现了Fvco=n*fr。
分频器原理
分频器原理就是之前上的简单的数电知识,在这就一块说了。
主要就说一个偶数分频。
偶数分频器的实现简单,用计数器在上升沿或者下降沿计数,当计数器的值等于分频系数的一半或等于分频系数时,信号翻转。
电路原理是用一个上升沿计数的计数器,每次计数到2时输出信号clkout翻转一次,每次计数到4时clkout再翻转一次,一直周期重复下去。其他的偶数分频器原理也是一样。