网络开源技术总结及学习路线思考
网络开源技术总结及学习路线思考最近两天又听了一下网络开源技术生态峰会,第二次,相比去年线下了解起来,自己的知识储备和各种认知都有了一定的增长,听起来要容易理解更多了,从芯片到应用场景简单列举总结一下吧。
芯片
操作系统及软件开源的操作系统还是这些(ONIE/ONL/SONIC/SAI),只是社区有的更活跃了,有的不活跃了。都是OCP组织下的内容。
运营商/设备厂商/互联网厂商联通移动电信三大运营商感觉很厉害,但是我感觉太抽象了,或者说我还需要沉淀,但是好像电信还是去年的讲的更有干货。
华为中兴新华三思科很好奇,为啥华为一直都没有出来过,他们才是龙头呢,起家也是靠程控交换机,干掉了思科。思科的芯片Silicon one Q200,我也了解了一下,交换路由融合芯片,感觉架构师蒋星的演讲好像更精彩一点,可能也是最后一个吧。设备厂商,相对更熟悉一下,还是感觉技术创新太少了。
腾讯阿里百度底层基于sonic,上面具体就不清楚了,阿里只看到了他们的太玄编译器,自研的洛神云网络感觉属于很厉害的云网络,后面需要在学习一下。总之互联网厂商的网络,和运营商的是不太一样的,主要是在数据中心用 ...
嵌入式知识图谱
嵌入式知识图谱 嵌入式做为一个软硬件结合的技术,它的知识涵盖面是相当多的,作为一个嵌入式从业者而言,需要的是有一个全局的认识,以及完整的学习路线。
项目描述 作为一个简单的项目需要有需求,开发,测试,运维。如果按照完整的IPD流程来完成一个项目的话,这需要大量的人力和物力,一般只有大一点的公司才会做。
注:集成产品开发(Integrated Product Development,IPD)是一套先进的、成熟的研发管理思想、模式和方法。
简单的项目开发活动有以下内容,这里作为开篇文档不会详细对项目进行描述。
一个开源项目-SONIC 国内互联网企业开发的白盒设备OS系统基本都基于SONiC开发(Software for Open Networking in the Cloud)。SONiC由微软开发并于2016年开放计算组织OCP(Open Compute Project)峰会上发布。SONiC所有功能组件模块均已开源,供OCP成员企业免费使用。
嵌入式核心技能 这里先放一张网上的开发技能图,可能大家觉得很多知识点,但是 ...
学习书籍推荐
学习书籍推荐
1. 0x1-软件开发1.1. 软件工程
《人月神话》
《人件》
《硝烟中的Scrum和XP》
《Scrum敏捷软件开发》
《敏捷软件开发》
1.2. 软件需求
《软件需求》- S4,
《掌握需求过程》- S4,
1.3. 软件设计
《编程的原则:改善代码质量的101个方法》
《架构整洁之道》
《软件架构建模和仿真》
《设计模式》- S2,
《Head First 设计模式》- S2,
《设计原本》- S3,
《恰如其分的软件架构》- S4,
《UML参考手册》- S4,
《UML用户指南》- S3,
《领域驱动设计》- S4,
《编写有效用例》
《面向模式的软件架构》
1.4. 软件编码
《C程序设计语言》- S0,
《C专家编程》- S1,
《C陷阱与缺陷》- S1,
《代码大全》- S1,
《代码整洁之道》- S1,
《算法》- S2,
《编程珠玑》- S2,
《修改代码的艺术》- S2,
《重构》- S2,
《计算机程序的构造和解释》
《数据结构与算法分析 : C语言描述》
1.5. 软件测试
《软件测试的艺术》- S3,
《完美软件:对软件测试的各种幻想 ...
嵌入式编程问题总结
嵌入式编程问题总结
嵌入式编程问题总结前言在嵌入式编程中,我们经常会遇到许多问题,应该及时总结和思考,尽量在编写代码的时候注意避免。因为很多问题可能造成难以复现,定位的BUG,对项目和后期维护都会花费很大的精力。
代码运算符优先级同一行代码(将过长的代码分成不同物理行也算作一行)中,如果有多个运算符,建议按照预想的运算符执行顺序,将运算符加()。尤其是!、&、^、|、&&、||、<<、>>、+、-,这些运算符的优先级容易搞混。比如之前优化代码的时候就发现 a = b << 8 + c这种代码,但实际上 + 比 << 优先级高,结果将是错误的。从上下文分析,实际代码应该是 a = (b << 8) + c。
++、–运算符如果不是必须的,不要作为宏的参数的一部分。比如ip_ntohl宏,它展开后将是((((xx) << 24) & 0xff000000U) | (((xx) << 8) & 0x00ff0000U) | (((xx) >> 8) & ...
ZBar源码分析——多线程部分代码分析
[TOC]
一、ZBar中的多线程在ZBar中,需要进行大量的数据提取和数据获取,若仅仅进行串行处理,往往会出现运行时间过长等问题。因此ZBar中有许许多多的地方都使用了多线程的处理方式,这在前面对各个模块的解析中有所提及。
在引入多线程后,又有许多问题需要注意,例如线程安全的保证、线程同步的实现方式等等。
下面首先对多线程操作时的几个概念以及ZBar中使用多线程的几个地方进行举例说明。
线程:cpu调度的最小单位线程共享进程的资源,多个线程可以共享同一地址空间和其他资源,比如共享全局变量。线程作为进程的一部分,扮演的角色就是怎么利用中央处理器去运行代码。线程关注的是中央处理器的运行,而不是内存等资源的管理。同一时刻只有一个线程占用cpu,但高速切换给人带来并行的假象。
为什么多线程?
线程比进程更加轻量级,线程更容易、快捷的创建和销毁。
多CPU系统中,使用线程提高CPU利用率。
耗时的操作使用线程,提高应用程序响应。拥有多个线程允许活动彼此重叠进行,从而会加快应用程序执行速度。
并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求。
改善程序结构。一个既长又复杂的进 ...
ZBar源码分析——Window模块解析_1
[TOC]
一、Window模块
要使用ZBar进行条码识别的时候,输入的可以是视频流也可以是图像流。
在采用视频流进行输入的情况下,我们往往采取的方式是打开摄像头窗口进行扫码识别。在摄像头捕获到的视频信息中,ZBar需要对视频信息进行一系列的采集和处理,如逐帧捕获等等。Window模块会将处理后的信息交给其他模块进行解码等处理。
采用图像输入时,也需要Window模块的参与,这会在后续代码分析中提到。
这部分功能的实现并不是由Video模块实现,而是在ZBar打开窗口时,由Window模块进行实现的。这样的模块分离,使得整个项目的结构更加清晰,各模块之间的分工更加明确。
除此之外,根据ZBar的项目流程,可以看到,Window模块还有一个核心功能为将图像显示到用户指定的特定于平台的输出窗口。
ZBar项目的核心代码大部分都在zbar文件夹下,而zbar文件夹下的window.h和window.c则负责了这一模块的核心功能实现,而具体的调用实现则是在Processor处理模块以及其他api中完成。
本次代码分析将从window.h和window.c中展开。
二、代码分析wi ...
ZBar源码分析——Window模块解析_2
一、Window模块
要使用ZBar进行条码识别的时候,输入的可以是视频流也可以是图像流。
在采用视频流进行输入的情况下,我们往往采取的方式是打开摄像头窗口进行扫码识别。在摄像头捕获到的视频信息中,ZBar需要对视频信息进行一系列的采集和处理,如逐帧捕获等等。Window模块会将处理后的信息交给其他模块进行解码等处理。
采用图像输入时,也需要Window模块的参与,这会在后续代码分析中提到。
这部分功能的实现并不是由Video模块实现,而是在ZBar打开窗口时,由Window模块进行实现的。这样的模块分离,使得整个项目的结构更加清晰,各模块之间的分工更加明确。
除此之外,根据ZBar的项目流程,可以看到,Window模块还有一个核心功能为将图像显示到用户指定的特定于平台的输出窗口。
ZBar项目的核心代码大部分都在zbar文件夹下,而zbar文件夹下的window.h和window.c则负责了这一模块的核心功能实现,而具体的调用实现则是在Processor处理模块以及其他api中完成。
本次代码分析将继上次代码分析展开window.c的解析。
二、代码分析zbar_windo ...
ZBar源码分析——video.c_1
[TOC]
一、Video模块我们知道,扫描时提供给ZBar的不都是静态的图片,也有可能是动态的视频。例如我们日常生活中调用的微信扫码,所提供的也是视频video,这时便需要Zbar对视频进行分析,动态扫码。
Video模块是ZBar实现对读入视频进行扫描分析的功能模块。核心代码由video.h和video.c组成,video.h包括对一些关键变量的声明和结构体的定义,同时也是其他部件对Video模块的调用接口(头文件),而具体功能代码则是在video.c中实现。
二、代码分析在ZBar项目,每一个功能部件的实现通常都会有对这个部件的初始化、增加、释放内存等函数,这与Java中的new一个对象以及set(),get()函数有异曲同工之妙。
12345678910111213141516171819202122232425262728291. static void _zbar_video_recycle_image (zbar_image_t *img) 2. { 3. zbar_video_t *vdo = img->src; 4. ...
ZBar源码分析——video.c_2
[TOC]
一、Video模块我们知道,扫描时提供给ZBar的不都是静态的图片,也有可能是动态的视频。例如我们日常生活中调用的微信扫码,所提供的也是视频video,这时便需要Zbar对视频进行分析,动态扫码。
Video模块是ZBar实现对读入视频进行扫描分析的功能模块。核心代码由video.h和video.c组成,video.h包括对一些关键变量的声明和结构体的定义,同时也是其他部件对Video模块的调用接口(头文件),而具体功能代码则是在video.c中实现。
二、代码分析上篇博客对ZBar关于图像和视频之间的转换和处理部分的代码进行了简要分析,这篇博客将继上篇博客往下分析。
ZBar对视频流的创建和销毁12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970`1. zbar_video_t *zbar_video_create () 2. { 3. ...
ZBar源码分析——scanner.c_1
ZBar源码分析——scanner.c(一)[TOC]
一、Image ScannerImage Scanner是ZBar实现对读入图像进行扫描的功能模块。Image Scanner的核心主要由img_scanner.c和scanner.c两个文件组成。
其中,img_scanner.c中的核心函数是zbar_scan_image(),而scanner.c中的核心函数是zbar_scan_y()。经过简单分析得到,zbar_scan_image主要负责ZBar对读入图像的扫描工作,函数主要根据设定的扫描密度(density)控制像素点读取(按Z字形读取,这也是ZBar名称的由来),scanner.c文件内的zbar_scan_y()来完成滤波,阈值,确定边缘,转化成宽度流。
上次博客分析了img_scanner.c的主要代码,这次博客则主要分析scanner.c的主要代码。
二、scanner.c扫描器结构体组成zbar_scanner_s1234567891011 struct zbar_scanner_s { zbar_decoder_t *decoder; / ...