- 博客(232)
- 资源 (1)
- 收藏
- 关注
原创 golang 柯里化(Currying)
使用场景:参数在语义上属于不同组,Go 语法无法在单次调用中声明多组可变参数,通过柯里化可以实现分步接收参数。有的参数是在不同时间段产生,使用Currying可以让函数记住(缓存)参数,避免应用代码去手工管理缓存的参数。
2025-05-28 14:21:33
328
原创 双重检查锁定(Double-Checked Locking)机制
线程 A 释放锁,线程 B 获得锁,进入同步块后发现 instance 已经被创建,不执行实例化操作。线程 A 和 B 都通过了第一次 instance == null 检查,进入同步块前。线程 A 先获得锁,进入同步块,再次检查 instance == null,创建实例。后续所有线程都不会进入同步块,直接返回已创建的实例。
2025-05-24 11:33:13
149
原创 《文件系统设计原理》
3)应用层,与进程结合的文件(每个进程有一个数组,存放打开的文件列表)2)内存里面,与操作系统结合的文件接口vfs、存储驱动接口。1)磁盘里面,带格式的文件。
2025-04-25 14:40:21
241
原创 microPython(合宇ESP32-C3开发板)实现24c02的跨页写入、读取
esp32-c3 使用microPython实现at24c02的单字节写、单字节读、连续写(跨页)、连续读(跨页)
2025-03-25 16:19:05
290
原创 github提交不上去,网络超时问题解决
编辑hosts文件,不存在则创建,不要带任何缀名,文件名就叫hosts,可以用git bash命令创建文件:touch hosts。DNS服务器数据不同步,github的服务器发送迁移,在本地缓存的ip地址现在无效了。按照上述操作之后,git push就正常了。
2024-12-31 17:44:45
687
原创 golang自定义MarshalJSON、UnmarshalJSON 原理和技巧
当一个类型实现了encoding/json包中的json.Marshaler接口的MarshalJSON方法时,json.Marshal函数就会调用这个自定义的MarshalJSON方法来进行 JSON 序列化。好的解决办法是:限定拷贝的数据范围,将需要特殊处理的时间戳,单独封装在一个结构体里面。但是引入了新的问题: 对象多拷贝一次,当数据量比较大,api调用比较频繁的时候,浪费cpu时间。问题出现的原因:在前后端分离的项目中,经常出现的问题是时间戳格式的问题。前端由于各种原因,日期格式不完善。
2024-12-21 15:23:33
721
2
原创 《国产单片机,soc的一些现实问题》
在一堆芯片面前,八九不离十,盯着价格最低的那个芯片就不走了,就像一只饥肠辘辘的狗,看到了一块肉。不是电子信息专业的,去搞嵌入式,就会盯着某个芯片、元器件的价格死磕到底,导致研发失败,或用其他地方十几倍的潜在成本,来弥补老板节省下的那一个物料的成本。做嵌入式,是一个系统性的工作,你的成本构成由:采购、研发、测试、销售、售后、机会成本。很多老板,pm,认知水平之低,目光之肤浅,令人发指难以想象,这些吊毛是怎么混到现在的。当然,stm32也不是完全ok,曾经也出现过iic问题,某款芯片功耗大的问题。
2024-12-17 10:00:40
688
原创 android studio 模拟器不能联网?
在下一次关机之前,android studio里面的模拟器就可以上网了。.关闭所有AVD设备实例。
2024-12-10 14:13:11
1028
1
原创 linux c串口应用编程,参照golang里面的json.Marshal/json.Unmarshal
protocol.c 代码,实现二进制流序列化、反序列化。
2024-11-29 09:39:22
381
1
原创 《设计一款蓝牙热敏打印机》
安卓apk用java + kotlin编写、上位机用Qt编写。主控芯片用易兆威蓝牙ic,通讯接口:蓝牙、串口、usb。
2024-05-06 10:37:06
564
1
原创 Android Studio控制台输出中文乱码问题
1.找到studio的安装目录下的studio64.exe.vmoptions启动配置文件;2.打开文件,最后一行添加 -Dfile.encoding=UTF-8;3.重启android studio;
2024-03-28 21:40:23
3233
2
原创 《一个电子工程师的12年》
redis、mysql、sqlite、kafka、zeromq、mongodb、http/https、rest api、mqtt、thread pool、go routine等等,陷入了复杂重复的循环中,中间,我见过形形色色的人,有的很傻,有的很自私,有的很狭隘,有的很极端,有的很要面子,有的很无耻,有的很卑鄙,有的人能当着你的面出尔反尔,这些人的所作所为有适合能惊掉你的下巴……2012年专科毕业,单片机没有学会,keil也不熟悉,protel 99se不熟悉,烙铁不熟悉,就突然毕业了。
2024-02-29 00:06:40
178
原创 boost正负压电路设计和原理分析
如图所示,为模拟电子电路中的Boost电路,可同时提供正压、负压。虽经打板实测,但不可用于商业目的,否则后果自负。
2024-02-04 14:27:23
1553
原创 从二极管到linux服务器
tcp(单片机信号控制)、udp(游戏)、mqtt(iot物联网传感器)、websocket(游戏、新媒体)、webrtc(用于流媒体、IM聊天软件)需要对寄存器、单片机内部总线、iic、spi、uart、can、modbus、fsmc(8080/8060)协议、sdio协议比较了解。2)模拟电路,LM358运算放大器、电压跟随器、PLL锁相环电路、加法电路、乘法电路、三角波、锯齿波、方波、sin波、恒流/压电路。对os任务切换时寄存器的功能有理解。低功耗蓝牙、wifi、zigbee、2.4G、433等。
2023-11-24 11:39:26
394
原创 qRegisterMetaType 用法
注意:如果自定义类型中包含了指针成员,需要使用qRegisterMetaTypeStreamOperators进行注册。此外,在使用qRegisterMetaType注册类型之前,需要确保类型的定义已经被包含在头文件中。qRegisterMetaType是Qt中用于注册自定义类型的函数。它允许将自定义类型与Qt信号槽系统无缝集成,以便在信号槽传递过程中自动进行类型转换和传递。
2023-11-02 14:54:39
2847
原创 《设计一款2轮车充电桩系统》
以深圳为例,深圳有400万台电动2轮车,以每个月电费20元计算,深圳每个月用在2轮车充电上的费用为8000万左右。1年10个亿的市场规模。前景可观,竞争也非常激烈。本文主要讨论技术实现方案。
2023-10-11 20:32:55
808
1
原创 上N下P三极管推挽电路----》交越失真问题的解决
三极管的导通条件是Vbe > 0.7V,在正弦波驱动波形介于-0.7v ~ +0.7v之间时,上N管子截止、下P管子也截止,此时波形失真。,使其处于微导通状态,一旦正弦波波形值不等于0v时,管子就会导通。通过二极管的钳位能力(1N4148),给上下2个管子加入。(关于三极管的伏安特性曲线、米勒效应,请自行百度)
2023-09-23 00:18:08
1229
原创 开关电源boost升压电路米勒效应
在mos管存在3个寄生电容:Cgs,Cgd,Cds,其中Cds与变压器漏感产生LC振荡,体现在D级脉冲高压和振荡,导致mos管发热,变压器漏电感以热量的形式发散出去。本篇文章只给方案和效果,电路原理不展开还会增大篇幅,关于米勒平台、LC振荡、mos管寄生电容、pcb寄生电感、变压器漏感、rcd吸收电路等细节知识可自行百度。在改进版本中,增加了一个在mos管漏极和vcc直接加入一个tvs管,钳位电压为10v,mos管漏极电压应力为20v。加入rcd吸收电路,将mos管漏极的应力通过电容缓冲,通过电阻消耗。
2023-08-02 09:02:10
1476
1
原创 lvgl 8 多style属性设置
全部修改一个小部件的属性,大概最多需要调用64 *111 次api, 其中111 个api,设置64个不同的参数和值。当时实际开发时很少有人这么干,默认的属性占到一大半,一小半属性才需要额外设置(例如坐标、颜色、图片、透明度、渐变色、边框、轮廓、pad填充等常规属性需要额外修改)。一个object对应的style最多有2^6(64)个,每个style有最多111个属性值。而lvgl 8中,每一个part(一个控件最多8个part)的每一个状态(最多有9个状态)的属性,都需要有一个单独的style 变量。
2022-10-16 18:39:43
1513
原创 《k3s 源码解析7 ---- k3s agent启动流程》
k3s agent 启动流程:1)解析配置文件作为参数、可被cli指定的参数覆盖2)创建tunnel隧道服务(也就是正向代理服务器)(代理服务器除了负载均衡作用,更重要的是提供稳定的网络连接:用长连接保活、用短连接提供业务。这样可以避免网络抖动对业务的干扰/破坏)3)加载linux kernel module,通过exec.Command(),执行命令行:modprobe --overlay|–nf_conntrack|–br_netfilter|–iptable_nat|ip6table_na.
2022-05-29 02:21:16
885
原创 《k8s 源码解析1 ---- 插件机制》
插件定义:用于执行目标明确的独立功能可执行文件,或任务触发。 例如:一个用于压缩日志的shell脚本,其它语言(python、c++、java、golang)可执行文件。插件的实现方式:exec函数组:k8s中插件的实现方式:// 显然,k8s中插件的实现方式有2个接口:查找可执行文件(的绝对路径)、与参数 环境变量一起调用exec函数组// PluginHandler is capable of parsing command line arguments
2022-05-17 15:54:27
484
原创 键盘特殊符号
在代码中写流程图时,需要一些特殊符号,键盘不方便输入,这里用文档记录下来,以方便使用╮╭╯╰►▼▲例如以下代码的注释部分:// Component defines the lifecycle of managed components./// Created ――――――――――――――――――――――►(Stop)―――╮// ╰―(Init)―► Initialized ―――――――►(Stop)――╮│// ╰―(Ru
2022-05-11 15:32:36
856
原创 从零实现文件加密、解密(基础原理演示)
有一个做底端嵌入式的朋友请求帮忙做一个加密、解密的功能。 蓝牙一个广播包是32byte,因此不可能用rsa等加密算法。这里用异或进行加密原理:1 ^ 1 = 01 ^ 0 = 10 ^ 1 = 10 ^ 0 = 0上代码:#include <stdio.h>#include <stdlib.h>#include <string.h>// 密钥const unsigned char PUB[32] = { 0x01, 0.
2022-05-10 10:50:16
1581
原创 《k3s 源码解析6 ---- k3s参数解析》
在使用k8s、k3s的时候没有指定参数,大家注意到除了kubeadm init/join时指定了一些必要的初始化参数(网段、ip、端口等),在运行(kubectl命令)时是不需要指定参数的,当然如果你额外指定参数也是可以的。原因如下:防止记错参数,成熟的组件会帮你把参数写到配置文件中(配置文件往往用json、yaml格式编码,k8s中是用yaml编码)简化使用难度,不可能有人能把几十个参数、参数的顺序记忆在脑海里。配置文件中的参数可以被环境变量、cli输入的参数覆盖掉,保留灵活度 1 配置.
2022-05-03 13:43:10
881
原创 k8s 市场现状闲聊
关于k8s 的运维方式,dashboard与kubectl cli哪个更好:2年前曾经与某做跨境电商的产品经理聊这个问题,我说linux cli是天花板。 而对方用很不屑的语气说你的命令行敲错了怎么办? 说用web界面才是王道。草……昨天,去高新园与一个做游戏的聊天,对方的观点就比较正。 我们一致认为:命令行是运维人员应当追求的,而web界面是给小白鼠用的。不同的人观点不一样,只能选择,不能说服别人去认同你的观点,因为知识体系,工作背景不同。昨天也提到阿里云提供了k8s 一键部署,用起来也很一
2022-04-30 11:42:04
3090
原创 golang slice去重
以前去面试,某个面试题目如下:数据类型如下:type ele struct { id int lastTime time.Time}请编写函数,对Id重复的元素,只保留lastTime最新的元素。分析:先排序后去重速度会比盲目去重要快,按照id排序后需求去重的数据比较集中,比按照时间戳排序要快。 方案如下:按照id排序在排序后的slice上面放置窗口滑动块,窗口的范围是:id连续相同的元素func RemoveDuplicates(islice []ele, dna int) []
2022-04-29 10:12:23
1640
原创 《k3s 源码解析4 ---- k3s重要数据结构》
k3s完全兼容k8s,我解释一下是为什么:因为k3s的底层数据结构(写入etcd/mysql/sqlite/dsqlite数据库的格式),是完全照搬k8s的数据结构。api完全兼容。 对外表现相同,底层数据相同,只是实现方式不同(举个例子: 一个爆炒大虾,一个油焖虾)。我认为 k3s/k8s数据结构的3个用途:缓存从api中解析出来的参数,为了后面的处理逻辑更方便的去引用api的参数。方便响应api时,用marshal() 去生成json/protobuf序列化的数据方便写入数据库(et
2022-04-25 21:53:03
1979
4
原创 《k3s 源码解析3 ---- k3s集群搭建》
一、安装说明:主机名要求主机名不能一样,如果主机名一 样,可以通过参数--with-node-id添加一个随机后缀, 或者通过参数--node-name或者环境变量$K3S_NODE_NAME指定主机名操作系统基本上可以跑在所有的Linux系统上,官方支持并测试的系统包括Ubuntu 16.04 (amd64)Ubuntu 18.04 (amd64)Raspbian Buster*硬件资源CPU:1内存:512MB(建议至少1G)磁盘:K3s性能依赖数据库的性能,建议跑在S.
2022-04-25 01:16:21
2413
原创 《k3s 源码解析2 ----master逻辑源码分析》
一、k3s 源码入口: 二、k3s master入口: 三、配置文件数据结构://pkg/cli/cmds/server.go var ( ServerConfig Server // 从cli、配置文件加载配置参数)type Server struct { ClusterCIDR cli.StringSlice // (networking) IPv4/IPv6 network CIDRs to use for pod IPs (default: 10.42.
2022-04-20 20:05:21
1885
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人