自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

昆仑山上一棵草

软件系统设计

  • 博客(65)
  • 资源 (1)
  • 收藏
  • 关注

原创 使用AT命令控制2G/4G模块注意事项

在开发一产品过程中,使用了2G/4G无线模块,将踩过的雷总结下,分享出来。1、AT命令规则AT命令应答一对一实现,命令不允许交叉使用;回应0x0d 0x0a结束,进行AT回应的结束;代码设计中一定要进行保护;2、2G/4G模块注册上网AT+CGREG AT命令是检查是否注册上GPRS或4G网络,需要检查返回的状态,而且一定要检查是否正常,+CGREG: 0,1或+CGREG:0,5...

2018-07-06 10:41:14 12780

原创 【数据库设计】向量搜索HNSW算法优化

数据库向量存储,向量搜索HNSW算法优化

2023-09-09 14:58:11 378 1

原创 开源的正反面

一些商业公司或组织被迫做开源,一开始可以白嫖,谁不心动,又可以满足业务,有可以少花钱,多美的事情,只是其也知道自己也要开源,你不开源别人会告你,大公司树大招风,不开源不行;一类是官媒,开源是为国家建立基础,防止被掐脖子,提高技术能力,政治正确是唯一的支持,有什么实际的经济支持,对软件开发人员的好处,对企业使用开源提供产品倒是有政策倾斜,如政府采购有优先权等等。从开源的时间上看,特别是软件,大量的是已经在实践中获得验证后,提高了效率后,推广到整个业务领域的方式比较常见,这个是主流的开源实施的方式。...

2022-07-31 14:05:22 359 1

原创 EPOLL 非阻塞SOCKET READ 函数写法总结

【EPOLL 非阻塞SOCKET READ 函数写法】使用EPOLL进行SOCKET通讯的代码,网上资料写的不明确,专门写了测试代码进行测试,对READ中注意事项进行了总结。一、LT模式下的READREAD()返回值:大于0,正常接收的数据等于0, SOCKET关闭等于-1 ,ERRNO == EINTR 重新调用READ( 可以立即调用,也可以退出等下一个LT的触发);ERRNO == EAGAIN 稍后调用(退出等下一个LT的触发,立即调用有可能空转);ERRNO == EWO.

2022-05-23 13:02:19 473 1

原创 RAFT系统设计(LOG传递)

在进行发送到其他节点的过程中,RAFT协议中CURINDEX就转换为FILEID + PAGEID, 从一个变量变成两个变量;同理 LAST INDEX 也是一样的。比较关系要发生变化,从单值比较变化为多值比较,比较的规则也有变化。其他NODE的进行同步的过程,需要特定的NODEID +FILEID+PAGEID, 也是通过 LOGSVR SERVICE 发消息给 KV TASK, 然后获得FIFO对应的BUFFER数据。此时RAFT TASK需要记录需要节点的路径信息,也是对应关系,有两种处理方式,一

2022-04-26 16:37:39 255

原创 RAFT系统设计(LOG传递)

设计中存在两个PAGE空间,一个是RAFTID 本身对应的空间,一个是进程间通讯的共享空间,目前没有找到统一的办法来处理,感觉还是需要两个,在KV进程执行慢的情况下,有两级的缓存设计。对应关系是RAFTID – LOGID – FD + SHAREMEM,如果操作进程间的FIFO, 必须任何时刻都是同一任务,不能多个,目前的FIFO设计是一对一无锁设计模式。通过对应关系来保证是同一个任务。也就是说RAFTSVR任务可以操作FIFO, 设计中LOGSVR的任务主要是SOCKET通讯和消息转发(...

2022-04-26 16:34:20 254 1

原创 RAFT系统设计(发送数据)

RAFT系统设计

2022-04-21 00:48:30 191

原创 RAFT 设计实现(日志文件同步)

数据库LOG进程中设计RAFTSVR模块,专门进行LOG的复制。RAFTSVR中设置一个任务,用于进行与RAFT进程的通讯,包含连接,传递共享内存句柄,传递消息。同时提供进行共享内存写入接口,读取接口。运行过程如下:LOG的RAFTSVR模块初始化后,通过SOCKET通讯连接 RAFT进程,成功连接后,传输共享内存句柄。传递当前FILEID + PAGEID给RAFT进程。如此时RAFT进程为LEADER的情况下,LOG进程就是主LOG,有LOGSVR模块输出PAGE内容到共享区,并记录最新发出的FI.

2022-03-17 17:58:01 614

原创 网络报文粘包处理实用方法

对应网络数据报文粘包的处理,一个PACKET处理到后面,发现数据报文不完整,需要和后面的数据报文进行合并处理,如果没有数据报文的缓存的话,简单的做法就是将此PACKET的剩余数据拷贝到要接收新报文的缓存中,接收的指针向后调,相当于新接收的报文追加到新开始的完整报文中,此种办法处理比较简单。如果数据报文有多个缓存的情况下,更是简单,判断结尾是否需要跨数据包,直接进行跳到对应的下一个数据包操作。...

2022-03-12 10:18:28 205

原创 大数据量传递PIPELINE设计

多路处理程序中,数据处理需要分到不同的任务中进行,有四种模式,一对一的情况,一对多的情况,多对多的情况,多对一的情况。比如网络通讯模块设计有多个任务,业务模块也设计多个任务,从网络过来的数据从任何SOCKET都可以进入的不同的SOCKET TASK中,数据要发给不同的业务模块,一个SOCKET的数据要发给不同的业务模块,一个SOCKET TASK有多个SOCKET处理,这就是典型的多对多的情况。大数据处理的过程中,这是常有的使用场景。通过设计PIPELINE,将数据的对应关系单独处理。可以进行分解和合并

2022-02-27 13:24:11 292

原创 大量数据流传递的流控方式

对应中间的数据链路如没有办法知道有多少空间可以发送的情况,需要建立发送缓存区和接收缓存区,发送方都有可能PUSH不进数据到其中,所以要进行发送缓存区的设置,同时进行水线控制,过水线通过其他可靠链路发消息给对方,要求加快处理。发送方缓存满,停止操作。接收方接收数据采用定时+消息触发的方式,这里为何不说轮询+中断的方式,应为描述更接近实现方式,轮询方式在多任务情况下,需要让渡处理时间给其他任务,不能一直循环POLL的数据,即使没有数据可POLL的情况下,任务可以让渡处理时间。这有一个极限的情况,如果发送方高

2022-02-26 15:55:14 303

原创 RAFT实现(RAFTID对应关系)

Raft group 包含多个RAFT ID, 在协议中应该定义GROUP ID 和RAFT ID,以便进行区别。每一个RAFT ID 包含多个NODE ID, NODE ID对应一个IP +PORT。数据结构是一对多的关系。每一个NODE都需要一个唯一的ID号,如何在开机时确定这个ID号?节点ID号,可以通过将IP ADDRESS转换为整数,此整数作为节点ID号,IP地址相同的情况下,可以通过增加PORT号,IPADDRESS +PORT 64位代表一个节点ID号。RAFT GROUP的数据进行组

2022-01-30 10:24:37 499

原创 高并发场景下,SOCKET 应用缓存模型

高并发,大数据量的SOCKET架构模型,对应数据空间锁的问题,可以使用拉的方式来处理,如发送数据,发送方提供数据的缓存空间,SOCKET 任务来取,发送完释放标记,这样就是一写多读的模型。SOCKET 发送缓存的模型,应用任务将数据写入BUFFER中,设置标记,SOCKET任务进行发送,发送完成后,释放标记,不需要进行加锁,写任务和BUFFER 是一一对应,操作写BUFFER没有任务竞争。SOCKET任务读取,不存在锁的情况。写BUFFER时需要进行判断标记是否释放。SOCKET接收的缓存模型要复杂

2021-12-17 18:47:11 331

原创 程序员帮小区办实事

深圳市区是高楼林立的地方,所在小区高空抛物现象比较严重,小区志愿者主动承担项目,免费为业主进行服务,甘当小区业主,住建局,施工单位工作的协调员,借用业界项目管理模式,成功运用到小区公益项目中,实现小区防高空抛物监控项目落地,获得小区住户业主的一致好评。

2021-11-23 11:28:35 20272

原创 使用EPOLL 进行CONNECT实现

while(1) { connect_fd = accept(listen_fd, (struct sockaddr *)&clt_addr, (socklen_t *)&len); if ( connect_fd >0) { printf("...

2021-09-09 12:42:22 1074

原创 数据库系统实现(关机过程)

从整个数据流的处理过程看,在关机的过程中,需要处理以下几个步骤,首先是网络传输过程中的数据需要处理,将已接收到网络缓存中的数据,向后级的数据处理和索引处理模块进行传递,该发回网络的数据发回到网络,此时就可以对网络模块进行关闭。数据处理模块中的缓存数据需要建立索引和形成PAGE,形成PAGE后就可以进行写盘操作。形成索引后,也需要进行写盘操作。缓存的数据只保存相对热点数据,进行写盘操作,可以丢弃部分缓存数据。缓存数据的主要作用是为了读操作使用的,写操作的数据缓存都是尽量按系...

2021-09-09 12:31:41 241

原创 数据库系统实现(开机过程)

数据库开机流程,有三个大的流程,一个是模块的加载,一个是数据的加载,一个是业务的加载,三个加载过程依次进行,直到对外提供数据库服务。模块的加载过程相当处理简单,就是对所有使用的基础部件进行系统初始后,读取配置信息,空间分配,任务划分的工作。数据加载的过程,索引组织数据的加载,一般是TREE的数据结构加载,节点数据的加载。第二个需要加载的是热点数据,包含热点数据的索引加载,以及部分热点数据的PAGE页进行加载,索引的数据量,也就是KEY的数量可以多进行加...

2021-09-09 12:29:00 131

原创 数据库系统实现(索引读场景)

在进行读的过程中,没有写操作的情况下,进行TREE NODEID查找,检查是否KEY 超过MAX, TREENODEID 文件中没有满的情况下,需要MAX值不一定是最大的,所以要进行MSGBUFFERLIST的查找,其中有可能有大于MAX的情况;当TREENODEID文件中满的情况下,MAX是最大的,加入KEY大于MAX的一定放在下一级。 有写操作的情况下,处理复杂,修改的数据有MSGBUFFERLIST, COUNTER, MAX, 上一级CALLBACKLIST, TREE...

2021-07-31 13:26:15 145

原创 数据库系统实现(数据文件完整性检查和恢复)

LOG文件的完整性检查,通过在每次追加页的末尾增加写入检查点,通过检查文件最后的页是否是完整的,达到检查文件的完整性。 另外一种思路是文件头充当,由于LOG文件时追加方式,可以将PAGE页头作为此页的结束,下一页要写的时,可以直接跳过。直接追加纯数据。此种方式比较简单,属于标记法检查文件大小。 文件内容的检查,可以检查最后几页数据的校验值,再进行长度的检查后,分别取最后每一页进行CRC32校验, 或者是MD5 128校验 。通过检查,最后确定LOG文件的完整...

2021-07-27 15:49:11 658

原创 数据库系统实现(缓存失效)

缓存失效的问题,数据直接请求到文件系统,对IO的影响巨大。1、大量的不存在的KV进行查询,导致CACHE失效,请求直接到文件IO操作上。增加NULL的记录,需要开辟新的空间保存NULL的情况,同时又更新的策略和淘汰的策略。2、CACHE不存在,文件中有,多个请求在IO数据没有进入到CACHE中,需要增加数据相同的判断,可以通过检查CACAE ID是否存在,PAGEID+FILEID+CACHEID+FLAG的唯一性进行判断是否需要读盘,同样有更新和淘汰的策略。对于INDEX的情况,在BUFFERLI

2021-07-27 11:37:05 278

原创 数据库系统实现(数据LOAD)

配置的导入,文件路径,任务数量(特别是有多少HASH INDEX的任务,数据定位的变化,目前的设计不支持动态的变化,会导致数据的迁移,如果设计上增加这样的功能,如何去实现?),数据结构的配置,空间大小的分配(NET PAGEBUFFER, HOT HASHMAP BUFFER, HOT HASH INDEX BUFFER, HOT DATACACHE BUFFER, TREE BUFFER); TREENODE的数量由LEVEL和BUFFERNODE的数据来定。 HOTKEY数...

2021-07-19 10:44:54 231

原创 数据库系统设计(数据读写时序设计)

数据库系统中,抛开内存型数据库的形式,多数系统在操作数据过程中都存在IO的设计,特别是对存储硬盘的IO设计,如何解决读写过程中的数据保护和读写竞争问题是比较棘手的问题,既然问题不可避免,减少问题的发生几率,降低数据竞争可以有效缓解对数据库性能带来的影响,本文就读写时序的设计中如何去处理此类问题给出一些方法。 通常的IO设计中,都会将IO的操作单独放到一个任务中,将索引的处理和数据处理放在另外的任务中,IO操作中总体分为读操作和写操作,读操作对数据保护的影响较小,而写操作对数据...

2021-07-11 19:22:35 177

原创 数据库系统实现(CACHE)

通过索引模块获得的KEY对应的文件定位,FILEID和PAGEID,OFFSET三个数据后,数据是发送到INDEXTASK中,需要进行以下的处理:1、通过PAGEID和FILEID在CACHE中进行查找,看是否在缓存中,如果有的话,直接将数据发给NETTASK进行通讯回复,同时进行LFU的计数;2、如果在CACHE中没有的话,需要进行ALLOC一个新的缓存页,通过消息循环的方式检查是否有,获得后,设置PAGEID, FILEID值到 CACHE的参数中,此时CACHEINDEX, P...

2021-06-27 16:33:10 306

原创 数据库系统实现(下推缓存数据)

在调试过程中,由于设计中CALLBACK_BUFFER LIST只设置了一个空间,在多个LEVEL进行更新的过程中,都会有持久化挤出的数据存入到CALLBACK_BUFFER LIST中,允许多个LEVEL进行更新(向波浪一样,多个层次),此资源就变成为竞争资源,加LOCK又会影响效率,所以将CALLBACK_BUFFER LIST设置为每一LEVEL都有空间,拿空间换效率,并且不需要加锁的操作。 ROOT BUFFER采用乒乓BUFFER的操作来进行,保证数据不竞争,同时在进行数据ADD的...

2021-06-19 16:07:40 108

原创 数据库系统实现(BUFFER数据下推算法)

使用BUFFER CACHE进行数据的处理,KEY进行INSERT的过程中,首先进行PAGE算法,对应到TREENODE上,进行比较,如果大于TREENODE 对应的MAX(TREENODE 的FILE中SEGMENT的数据没有满的情况下,不进行MAX的比较,都可以进行INSERT本LEVEL 的MSGBUFFERLIST 中),继续下一LEVEL的TREENODE的判断,过程进行重复即可。 某Level 的MSGBUFFER的数量超过阀值,需要进行数据的下推,会触发本LEVE...

2021-06-13 16:38:38 283

原创 数据库系统实现(BUFFER CACHE)

当一个HASHKEY 追加到TREE中,需要进行自顶向下的数据流动,先进入到ROOT MESSAGE BUFFER中,不进行向下流动,到阀值时,进行数据的下推。批量下推,每一个HASHKEY要进行范围定位,看是属于哪个节点的。判断的条件是:当TREENODE对应的BUFFER数据没有满的情况下,追加到此TREENODE中,修改MAX值和COUNTER;如果TREENODE对应的数据满的情况下,增加MAX值的对应判断,如果大于MAX,需要向下一级的MSGBUFFER中追加。 HA...

2021-06-13 11:36:08 110

原创 数据库系统实现(数据脏读)

对于数据的脏读的处理方式,在设计过程中,CACHE中的数据因为淘汰算法,有可能进行了更新,但是还有其他的TASK进行读写,一般的方式是使用串行化或读写锁的方式进行,对于高并发的系统来讲,性能会打折扣,为了更好地平衡性能和正确性的问题,可以采用少加锁的方式和允许脏读的操作,只是需要进行脏读的数据判断。 标记法,通过修改计数器,或者关键数据修改的方式,在读实际数据前,读取标记,并记录下来,读数据放入新的缓存区,然后再读取标记,和前一次的数据记录进行比较,如果有变化,则可以判断数据...

2021-06-06 12:28:23 420

原创 数据库系统实现(PAGE填充)

进行PAGE的数据填写的过程中,有空洞的存在,最大限度利用空间,如何减少空洞?解决的方式,使用多个PAGE进行最优匹配,当数据页到数据水线的情况下,将剩余空间最小的释放;具体的流程:1、在正在填充的PAGE中,比较空间减掉目前数据长度后,剩余空间最小的,定位其序号,然后将数据填充到里面;2、然后判断是否有到水线,没有到,继续等下一个数据的填充;3、到水线的情况,将PAGE ID向后级处理发送;4、极端的情况:有的PAGE有可能永远都没有机会到最小的空间,别的PAGEBUFFER始终有

2021-06-02 18:22:03 281

原创 数据库系统实现(CHECKPOINT)

CHECKPOINT的建立需要进行脏页的刷新,因为是IO操作,常用的做法是建立FIFO刷写队列,刷新到一定程度,需要建立CHECKPOINT用于进行恢复和快速开机检查数据使用。在刷写的过程中,需要对数据进行锁定,来进行写文件和写盘,在写完后需要释放数据块的锁定标记。目前的系统设计中个,需要在INDEX中生成CHECKPOINT,以及在LOGDATA中生成CHECKJPOINT,INDEX中生成CHECKPOINT复杂,有较多的限制条件:1、内存中大量的缓存,没有固化2、数据更新频繁3、关联多

2021-06-02 18:00:56 333

原创 数据库系统实现(TREE PAGE处理)

在实现TREE PAGE的过程中,涉及到多个页进行数据更新的过程,实现过程中发现的问题有数据更新页的次序问题,新页生成的问题,缓存不够页置换的问题,数据重新LOAD的问题,写盘时机点的问题。数据更新次序问题,可以使用一FIFO,将要处理的数据记入到FIFO中,先进先出,保证处理的次序问题,次序是后处理的PAGE的数据依赖前面数据处理的结果。这里是否可以有更快的处理速度?可以将同一个UP LEVEL PAGE中多个下一级PAGE先预先MEMPAGE ALLOC后,一次循环将数据推到下一级。然后此级就可以接

2021-05-27 18:38:16 99

原创 数据库索引随笔

大家都知道数据的查找中索引技术是很关键的,快速定位数据使用,目前关系型数据库中使用最多的是B树和B+树,NOSQL的数据库使用最多的是LSM 日志合并树,两者强调的使用场景不同,B树B+树长处是快速查找,索引结构是强调开始定位数据,建立索引的目的是快速读,代价就是建立索引费事,LSM目的是为了快速写,建立索引不能太费事,简单建立,代价就是读取数据费事。如果数据都在内存中,没有这样的问题,如果是数据在外存上,这才是问题,核心是减少IO的调用。减少IO的调用,随机写改为追加写,延迟写(加大BUFFER,BU

2021-03-19 14:12:40 108

原创 终端产品升级软件通用设计方法

一、概述1、功能描述本文描述终端机软件版本升级相关的系统设计。2、功能规格软件版本规则定义软件版本检查规则软件升级方式二、版本命名规则1、内容 版本命名包含三个版本,产品名称+硬件版本信息+软件版本信息,产品名称为一字符串硬件版本号规则硬件版本为: XX. XXXX XX两为大版本号, XXXX四位为小版本号,都为字符串,00或0000为起始版本号,依次递增;数字使用完可以使用字母软件版本号规则软件版本为: XX. XXXX XX两位为大版本号,...

2020-12-17 15:17:42 442

原创 EPOLL使用注意事项

EPOLL使用注意事项:1、没有监控事件变化,切记不要使用epoll_ctl 中 MOD方式修改,即使设置相同的监控事件;2、使用READ 和WRITE的进行数据的接收和发送,对于SOCKET 是NOBLOCK方式的情况下,一定读写到错误出现,然后进行错误判断,并检测对端CLOSE SOCKET的情况;3、网络异常中断的情况,SOCKET READ, WRITE的异常处理是判断不出来的,只用通过上层的应用协议进行判断,同时增加SOCKET 超时的判断,通过设置超时时间,结合应用协议,将长时间无数

2020-12-12 15:26:31 248

原创 数字电视运行系统业务分析

在嵌入式机顶盒,数字电视应用系统中,主要有四大应用业务,第一个是播放节目(包含直播和点播),第二个是获取节目(DVB系统和IP系统),第三个是PVR业务,第四个是应用设置业务。播放节目在STB业务中是最主要的业务,使用最多,播放的来源可以是卫星信号,也可以是有线信号,也可以是地面信号,互联网络视频内容也是重要的来源。其中都涉及到首先连接到信号上,卫星STB是使用卫星天线,CABLE使用时有线电视网,网络使用INTERNET,信号获取后数据才会进入到DEMUX 解复用的环节,通过过滤获取AUDIO, VI

2020-09-03 10:00:10 182

原创 系统功能设计举例——库存管理系统

通常在进行系统设计过程中,需要对系统的功能规格进行描述,针对应用需要从应用的场景进行功能的描述,对应到使用的相关场景上,容易将功能描述清楚,现举例如下:描述一库存管理系统的功能定义。一、库存系统维护功能仓库代码|——仓库代码维护|——仓库区域代码维护|——仓库货位代码维护|——库存操作原因维护|——领料原因代码维护|——部门操作权限维护|——仓库操作权限维护物品代码|——物品代码维护|——物品库存类别维护|——财务类别维护|——物品销售类别维护.

2020-08-25 10:30:57 1798

原创 什么是架构代码

一、架构的不同理解计算机软件工程中,对于架构的理解,可以说是各有说辞,有的认为就是软件层次,有的认为是模块划分,有的认为是消息通讯方式,有的认为就是代码目录文件。我们从人体本身结构来解释下,有人说人的骨架就是人体的架构,可以这样理解,但不全面,骨架人体的支撑作用。肌肉附着在骨骼上,肌肉运动需要神经来控制,所以人体的神经系统也是系统架构,各种组织干活,需要吃饭,血液循环系统也是系统架构,消化系统提供各种养分。产生的废物需要排除体外,需要排泄系统。所以软件的系统架构也是同样的道理,需要从不同的视角进

2020-08-05 17:38:19 1498

原创 程序员的另面爱好(四)

完成了萨普神山的朝拜,原计划的目标已经完成,假期时间还有,去哪里呢,驴友此时电话说还可以去下布加雪山,冰川风景特别好,而且容易接近。在警务室等车辅警和正式警察的区别,从工作到岗的时间就可以看出来,先到的都是辅警,最后到的是正式工,有铁饭碗,有高人一等的感觉。基层很多工作都是辅警做的,所以在政府部门有很多这样的协作工种,无形中也养了一些懒惰的正式工。警察帮我找了一辆越野车子,车子上买了好多食品和蔬菜路过松多或扎拉乡翻过康庆拉山5300 的海拔到索县,吃了个面条.

2020-07-22 17:14:48 422

原创 程序员的另面爱好(三)

到拉萨已经晚上11点钟了,车站在拉萨市区的东边,火车站在市区的西边,查了下地图十几公里,走吧,3,4个小时应该可以走到,背着背包就开始走,来过很多次拉萨,但还是头一次徒步穿过市区,快一点的时候就已经走到北京路,还有零星的店铺开着,看到一家陕西面馆,走进去问还有没有吃的,一个中学生大小的伙计说有,要了一碗鸡蛋西红柿面,然后就是等,期间这个小伙计和另外一个女孩聊天,大概听了一下,这是一家亲戚开的,小伙只有18岁,跟着他叔一家来拉萨开了这间陕西面馆,女孩是他叔的女儿,小伙还是有些口才,很了解历史,特别是陕西西安的

2020-07-21 14:29:25 440

原创 程序员的另面爱好(二)

今天天气出奇的好,从桑巴村到索松村其实这一段是最适合徒步的,一个是风景比较独特,车辆很少,沿途都有村庄,各种景色都用,不仅仅有桃花可以拍。江边的高台上风景如画,碧绿的江水,远处的雪山,蓝天白云,拍了几张主动停车的小车司机,他以为我要到派镇,价格是50块钱,我知道路程还有多远,而且我已经都看到大桥了,大桥过去就是派镇,所以没有直接回答,我说我不到派镇,我到吞白村,司机一踩油门走了。藏民中有经济头脑的人不在少数,淳朴会打折扣,以后更是如此。湖边的沙地,政府组织的植树防沙下到江

2020-07-19 16:51:12 255

原创 程序员的另面爱好(一)

程序员给人的感觉经常是木讷,有些怪癖的习惯,本人作为多年的程序员也同样有着这样那样的怪癖爱好,其中一项就是自虐徒步,下面讲一将去年自虐徒步加搭车的故事,这些路中的故事比过程本身更有趣,现分享给大家,希望每个程序员都能抽空去看看外面的风景,体验途中各自的经历和故事。过完年,没有太多的事情,爱人还有年假期没有用完,打算去藏东玩一下,计划时间有些长,我只有一段时间来陪,后面的行程各自安排。我们在林芝分开,花开加入到一个队伍中,我独自安排,计划是玩两个地方,一个是雅鲁藏布江峡谷玩一个星期,另外一个地方就是萨

2020-07-19 16:26:36 400

2g/4g/5g 通讯模块处理源代码

代码使用移远通讯模块进行测试,使用LINUX操作环境,可以直接使用测试,对不同的硬件,执行修改相关的硬件接口代码,GPIO的使用代码和上电时序的修改。

2020-10-18

空空如也

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

TA关注的人

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