LTDC硬件配置时一定要配置stm32 复用功能能吗?

FPGA中SPI复用配置的编程方法_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
FPGA中SPI复用配置的编程方法
&&FPGA中SPI复用配置的编程方法
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩4页未读,
定制HR最喜欢的简历
你可能喜欢设计神经网络硬件架构时,我们在思考些什么?(下)有问题,上知乎。知乎作为中文互联网最大的知识分享平台,以「知识连接一切」为愿景,致力于构建一个人人都可以便捷接入的知识分享网络,让人们便捷地与世界分享知识、经验和见解,发现更大的世界。基于神经网络的人工智能近年取得了突破性进展,正在深刻改变人类的生产和生活方式,是世界各国争相发展的战略制高点。神经网络作为实现人工智能任务的有效算法之一,已经在各种应用场景获得广泛的应用。从云端到移动端,不同应用场景也对神经网络的计算能力提出了不同的需求。神经网络的广泛应用离不开核心计算芯片。目前的主流通用计算平台包括 CPU 和 GPU,存在着能效较低的问题(能效即能量效率,是性能与功耗的比值)。为了获得更高的能效,我们需要设计一种专用的神经网络计算芯片来满足要求。国际IT巨头,如英特尔、谷歌、IBM,都在竞相研发神经网络计算芯片。然而,神经网络的结构多样、数据量大、计算量大的特点,给硬件设计带来了巨大挑战。因此,在设计面向神经网络的高性能、高能效硬件架构时,我们需要思考清楚以下三个问题:好的计算模式应该是怎样的?为了支持这样的计算模式,架构应该怎样设计?已经实现的硬件架构,针对具体算法和应用需求,如何配置成最优的计算模式?雷锋网(公众号:雷锋网)本期公开课特邀请到清华大学微纳电子系四年级博士生涂锋斌,为我们分享神经网络硬件架构的设计经验。他将通过介绍其设计的可重构神经网络计算架构 DNA (Deep Neural Architecture),与大家分享在设计神经网络硬件架构时需要思考的问题。他在完成设计的同时,解决了这些问题,并对现有的硬件优化技术做出了总结。本文根据雷锋网硬创公开课演讲原文整理,并邀请了涂锋斌进行确认,在此感谢。由于全文篇幅过长,分(上)(下)两部分。上篇传送门:公开课视频:
三、架构设计讲完了计算模式的优化,我们接下来针对硬件架构设计给大家做一些分享。我们研究工作的核心主要集中在计算模式的优化上面,而硬件架构本身其实更多的是如何去配合好的计算模式。如图所示,这是 DNA 架构的一个整体的框架图。DNA 的全称是 「Deep Neural Architecture」,它的整体架构和我们之前提到的硬件架构模型是类似的,当然在具体的细节上就是会有一些参数,还有一些数据、通路上会做一些细致的一些策划。值得一提的就是说我们的计算核心内部有两个计算引擎,共享同一个同一块局部输入寄存器,但有各自的输出寄存器,而架构主要有三个特点:针对网络各层的配置信息架构在片上会存储一些针对网络各层的配置信息(Configuration Context),存储在控制器内部(蓝色虚框)可重构的数据通路即从 Output Buffer 反馈回 Output REGs 的通路(红线)是可重构的。此外,整体的输入数据通路也是可重构的形态。另外在 CE 内部,它也会有一些可重构的数据通路,我们之后会展开。「Ping-Pong」缓存设计我们的设计中必须要考虑的一点,在于我们必须承认,对现有的这些深度神经网络而言,它的计算量数据量非常大,以致无法在片上完整地存储整个网络的数据和权重,所以在计算过程中,我们不得不与外部的存储进行频繁地访问。为了在计算过程中对存储器的访问不影响这些计算的性能,使得计算单元一直处于工作状态,我们需要对于每一块的这些存储进行一个「Ping-Pong」Buffer 的缓存设计,意思就是说在当前 Buffer 在工作的时候,它的另一块 Buffer 在外面保留数据,使得我当前 Buffer 用完的时候,下一次需要用到的数据也准备好了。此外,我们对 CE 内部(Convolution Engine)内部做了一些额外的设计——4 级 CE 结构,这里提一些主要的概念。我做了一个空间上的展开图。它主要有四个级别:第一个层次叫做输入寄存器级(Input REG Level),对应的是 CE 内部的局部输入寄存器;第二个级别叫数据传输级别,或称数据共享级(Data Sharing Level)。它主要是进行数据通路的重构,以支持我们刚刚提到的并行卷积映射方法,是很重要的一个部分。第三部分就是最核心的计算机,即 MAC 级(MAC Level),MAC 就是乘加单元的意思,就是最核心计算以一个 16×16 的阵列实现。第四级就是和输入级对应的输出寄存器级。而我们前面也提到,CE 是由很多个 PE 构成的,那么此处 CE 的第二至第四层这三个级别,他们对应的是 PE 的三个级别,实际上 PE 也是一个三级的结构,和 CE 结构是对应的,比如对于一个 CE 来说,总共有 16 个 PE,所对应的就是 16 个 Map 和 16 个数据传输级的寄存器,从数值上我们也可以看到它的对应,具体就不多展开了。数据传输网络采用了并行卷积映射方法的时候,如何共享所使用的输入数据呢?我们设计了一个数据传输网络(Data Sharing Network,DSN)。这三个图分别对应的是 16×16、8×8 和 4×4 的网络,以不同的块和尺寸来进行数据的传输,传输的方向主要有三个,包括从左往右的横向、从上往下的纵向、以及斜 45 度角的从左上往右下的斜向,以相邻的数据块进行数据的传递。我们这里以步长为 2 且使用 DSN0 的一个案例简单看一看。我们之前说到,对于步长为 2 的情况,并行计算四张 Map,而每张 Map 的数据其实是复用的。具体来说,红色小块代表的是 Map0 的第一个点,它所收集到的输入数据是可以直接共享给它相邻的三个(绿色、紫色和蓝色)的三张 map 上面的,而它们只需要直接从红色小块上的 PE 上获取各自所需要的数据,并不需要从外部导进来。这样的话,其实从一定程度上减少了访存的次数。工作流程与调度框架有了一个架构之后,我们需要有一套的工作流程去指导怎么使用它。我们的主要工作流程主要分为两个阶段,一个是编译阶段,第二个是执行阶段。阶段 1:编译我们需要输入神经网络的一些参数,以及硬件的约束,比如 Buffer 的容量,还有计算资源的个数等描述硬件架构的一个参数,一旦硬件架构设计好后,这些参数是可以提出来的;在我们的编译框架里面,需要对网络的每一层逐一地进行调度,并执行一个调度框架,它内部其实是在解决一个优化问题,优化问题是什么?用户可以设定是要优先优化性能还是优先优化能效,或者优化两个目标,而它的约束条件就是我们硬件上的一些参数,比如说我缓存的需求不能超过片上的缓存大小等,这些都可以通过一个约束条件进行约束。通过执行一个调度框架,我们可以得到每一层的调度结果,分别由数据复用模式和卷积映射方式构成,并用一些参数化形式表达。对神经网络的每一层进行这样调度,我们就得到每层的一个调度表,从而生成目标神经网络的配置信息,这时候我们就可以进入执行阶段,配置信息会放入到主处理器里。阶段 2:执行在执行过程当中,大家看左边大的矩形就是我们的 DNA 架构,它会不断地从处理中读取配置信息,随后会根据需求从片外的 DRAM 里读取数据和权重,在片上进行神经网络的计算,在计算过程中因为片上存储有限,它会将数据再写出到片外的 DRAM,这个过程是不断的迭代,就以图中 1234 的次序进行迭代,以完成整个神经网络一个计算,这是我们所说的逐层加速的一个策略。我们在这里简单地展示了 AlexNet 的网络在 DNA 架构上的一个调度结果。图上呈现的是神经网络的每一个层,这里其实既包括卷积层,也包括全连接层;采用了数据复用模式与卷积映射方法。从参数中我们可以看到,对 AlexNet 的不同的层,它有不同的调度结果,这其实也是符合我们预期的。四、实验结果到目前为止,我们已经讲完了基本的计算模式和架构设计,接下来我们就看一看一些实验结果。这是 DNA 架构的实现结果图,图上每个模块也标出了对应的区域,右边是主要的一些参数,我们使用的是 TSMC 65nm LP,面积是 4.0×4.0 平方毫米,片上的 Buffer 容量是 280KB,在 220MHz 的工作频率下,控制性能达到了 204.8 GOPS,而平均的性能是 194.4 GOPS,平均功耗是 479mW,需要注意的是,这里的功耗指的只是架构芯片设计的功耗;架构内部的数据宽度(Precision),它是 16 Bit 的定点宽度。我们直接看一下结果。我们使用的是 AlexNet、VGG、GoogLeNet 与 ResNet 这四个非常经典的卷积神经网络,这两个图分别展示了总能耗降低及 PE 利用率提升的情况:片上缓存访问的降低达到 1.4 到 2.2 倍,主要是与 Input Reuse、Output Reuse 与 Weight Reuse 来相比。片外 DRAM 访问降低了 7.6 到 11.4 倍;总能耗的降低达到了 5.9 到 8.4 倍,这是一个比较大的一个提升,计算资源利用率平均提升了 3.4 倍。而平均的利用率是达到 93%,这是非常高的一个值。与顶尖工作比较(AlexNet)除了方法上的比较,我们还和目前顶尖的这些工作进行了一些比较,这主要和英伟达的 K40,还有 FPGA'15、ISSCC'16 等非常经典的神经网络架构的文章进行一些比较,具体的话不进行过多展开。这张表展现的是 AlexNet 上的一些具体分析结果,大家主要看一些参数。第一个是计算资源利用率,我们评估了一下,在 FPGA'15、ISSCC'16 的工作上,计算资源利用率大约只有 68%,而用 DNA 架构,可以获得 88% 的一个计算资源利用率,达到 1.3 倍的提升,还是个比较大的一个提升。另外值得提的一点是,我们的能效是 FPGA'15 的 44.6 倍,是 ISSCC'16 的 1.8 倍。大家看名字也能知道,前者是在 FPGA 上实现的,而后者是在 ASIC 上实现的。特别强调一点,我们这里比较的能效是系统能效。大家通常喜欢比较的是纯芯片的内部能效,不考虑片外存储,其实并不是特别公平。我们在评估芯片本身的能耗以外,还评估了片外 DRAM 的能耗,综合起来我们称之为系统能效,我们认为这样的比较是相对合理的。在这种比较下,我们获得的能效提升也是非常好的。最后,我们与更多的一些工作进行比较。这一张表格里有展现出来,我们直接看结论。我们的 DNA 架构,它的系统级能效比 CPU 提高了三个数量级,比 GPU 高两个数量级,比 FPGA 高一个数量级,基本上达到我们的设计需求。基于 DNA 架构,我们完成了一款 Thinker 芯片,这是一款可重构的神经网络计算芯片。左边是芯片的照片,右边是我们搭的芯片 demo 演示图,相关的成果已经发表了数篇的顶级会议文章和权威期刊文章。值得一提的是,我们在今年 ISSCC(该领域的顶级会议)上作了 poster 的展示。此外,这款芯片作为清华的杰出的代表性工作,参加了 2016 年的全国双创周展览,获得李克强总理的高度赞许。李总理表示,希望 Thinker 芯片尽快拓展应用领域,实现规模化生产,实现芯片行业的自主创新。这是一个非常高的评价,我们会继续努力,实现总理对我们的期望。五、总结思考首先回到最开始提出的三个问题,我们对这三个问题都做了非常好的解决。好的计算模式是怎么样的?首先它需要具备一个混合的数据复用模式,另外还需要一个并行的卷积映射方法降低总能耗,以提升计算资源利用率。为了支持这样的计算模式,架构应该怎么设计?我们设计了一款可重构的神经网络计算架构 DNA,它具有可重复的数据传输通路和计算引擎。我们对针对计算模式做了一个很好的架构设计,相比 CPU、GPU 和 FPGA 都有多个数量级的系统级能效提升。已经实现的架构,针对具体算法和应用需求,如何配置成最优的计算模式?我们设计了一个基于网络层的调度框架,配合架构的使用,将调度问题转化成一个优化问题。这样一来,针对任意的网络,其他的架构也可以使用我们的调度框架,将调度问题转换成优化问题,配置成用户想要的最优计算模式。这些所有的相关成果已经发表在今年的 IEEE Transactions on Very Large Scale Integration System(TVLSI)上。最后我们对现有的优化技术做一些思考。最开始我们在分析的时候提出了两个主要公式,分别对能耗和性能进行评估。这两个公式其实是一个非常好的一个描述,或者说建模的分析方法。我们也对近几年出现在顶级会议和权威期刊上,针对神经网络硬件架构所使用的硬件优化技术以及算法优化技术进行了整理。计算模式优化第一类就是其实是和我们这份工作很相关的,就是计算模式方面的优化。它主要优化的是什么?它通过降低访存次数来以及提高计算资源的利用率来实现能效、能耗和性能的优化。模型压缩、降低数据精度及二值化这些技术主要能够降低单位 DRAM 和 Buffer 访问的能耗以及单位计算的能耗。非易失存储器第三类是在学术界非常流行的非易失存储器,简称 NVRAM,将这种新型的存储器应用到我们的架构设计当中。NVRAM 具有一个非易失的特点,然后它的通常它的功耗是很低的,可以降低单位存储访问的能耗;有的工作,比如说使用 NVRAM 进行乘加计算阵列的构建,甚至可以降低单位计算能耗。稀疏化无论是算法还是硬件,稀疏化是大家目前都非常关注的一个特点。不管是数据还是权重,神经网络其实有大量的零以及接近零的数值,我们通过人为的一些控制,使得数据里面出现更多的零,这样我们可以减少从存储器中访问数据的次数,甚至可以降低操作数,因为如果是零的话,我可以不做计算,因为零乘以任何数都是零。神经网络的基本计算就是零,所以稀疏化的好处就是可以降低访问次数和操作次数,对于能效的好处是非常明显的。动态电压频率调节动态电压频率调节简称 DVFS,它是一个非常经典的、大家很常用的电路技术。我们可以通过降低电压和频率,来降低单位访存和计算能耗。如果我希望获得很高的性能,我可以通过提升电压以提升频率,来获得更好的性能。我们可以发现,目前现有的这些优化技术,其实都对应我们对性能或者能效的设计或优化的需求。通过对现有这些技术的分析,也可以启发我们所做的事情。比如说,我们如果想用新的技术,可以回顾一下这两个公式,是否真的有效,是否解决了关键的问题?这其实是我很想分享给大家的观点。这里有我的一些联系方式,包括个人主页、知乎专栏,电子邮箱等,欢迎大家与我联系。我在维护的 GitHub 项目名为「Neural Networks on Silicon」,因为我们领域近几年呈现爆发式的发展,有大量新的工作出现,我在 GitHub 上做了一个小小的项目,整理了一下近两年出现在这个领域顶级会议上的一些论文,也会对部分有意思的工作做一些评论。大家有兴趣的话可以看一看。其实这也是一个蛮好的整理,但因为现在的工作实在太多了,大家也可以帮助我一起整理。这页 PPT 上呈现了刚刚涉及到的一些重要参考文献。提问环节好,谢谢大家,现在进入提问环节。1. 你们的工作和国内外神经形态芯片相比(非加速器),有哪些优势?我简单介绍一下,我们的神经网络硬件芯片这一块主要有两个流派,一块是神经网络加速器范畴,另外一个是神经形态芯片,英文叫做 neuromorphic chip. 而我们的工作属于神经网络加速器的范畴,而题主提到的神经形态芯片属于另外一类芯片,以 IBM 的 TrueNorth 为代表。那么二者的主要区别是什么?它们主要是算法原型不一样。前者或者说我们的工作主要针对的是人工神经网络,特别是强调就是当前非常流行的,以深度学习为代表的神经网络,而后者的算法模型是我们称之为叫脉冲神经网络,英文叫做 spiking neural network。在脉冲神经网络的网络里面,数据以脉冲信号的形式进行信号信息的传输,这样一种网络,或者说这样的计算方法,其实更接近我们最开始提到的生物上的什么样的模型,首先,二者因为目标算法不一样,所以不好直接比较性能和功耗,如果你看到一些直接比较功耗的工作话,我觉得并不是特别公平,因为连目标算法都不一样,设计的目的也不一样。我们做科研非常讲究公平比较,为了更公平的比较,其实硬件层面其实并不是很好的一个比较方式,比如从算法层面来比较深入学习和脉冲神经网络。当前的主流观点是前者的精度更高(识别人脸),而后者因为更具备生物上的一些特点,在能效上更有优势。我个人的观点是:就目前而言,深度学习几乎统治了模式识别的各个应用领域,是当下更好的一种选择,但是科学是螺旋式发展的,深度学习不可能永远地统治下去,我觉得也应该不会是人工智能的最终形态。脉冲神经网络,其实代表的是科学探索的一个方向,但我觉得也并不是唯一的方向。如果关注人工智能这块的话,我们其实会看到有很多其他的方向也在展开,比如说量子计算。人工智能的最终形态并不一定是制造一个人的大脑,或者人脑。关键在于是否能够解决问题,比如说我们要识别人脸,什么样的算法才是好的算法,那么怎样的算法才能解决问题,这才是关键。而它具体的形态并不是我们特别关心的,这里有个比较恰当的例子分享给大家,好比人要飞翔,其实并不需要有一个鸟一样的心态,历史上已经证明过,很多人制造了翅膀也飞不上去,其实我们只要造一架飞机就够了,甚至我们还能飞上天空甚至飞出银河系。我们不在乎形态是怎样,关键是要能够解决问题。2. 你们在第二代架构在设计上有哪些构想?这位同学应该是看了我知乎专栏上的一些文章。其实刚刚有提到,现在有一些比较大家常用的一些技术,就像稀疏化等,其实在我们的二代架构设计当中已经有一些考虑。基本上不能说有多大创新,但我们都会考虑进来。这是我们现在在做的一些工作,主要想解决大家真正在用神经网络硬件架构的时候会遇到的一些实际的问题,如果有新的成果发表出来,也会及时地分享给大家。3. 芯片只针对推断进行优化吗?推断其实就是前向计算的过程,没有包括训练的过程吗?在第一代神经网络芯片 Thinker 上,我们主要只针对正向计算做了优化,如果大家对训练过程比较了解的话,其实训练的过程当中有大量的正向计算的过程,当然它还包含了一个反向的误差传播的过程,在我们第一代芯片当中没有考虑误差传播的过程,我们已经在做一些相关的工作,如果做出来之后会及时地和大家分享一下我们的一些想法。4. 如何看待「芯片+人工智能」这样一种模式?我简单讲讲吧,大家从新闻上已经能看到很多报道,说人工智能时代到来了,其实人工智能或者这个概念,我觉得更多是媒体在为了宣传的方便,所以靠一个很好的帽子,也更方便大家理解。其实我们刚才也提到,大家经常说到人工智能,其实它背后有更多的内容,比如深度学习、机器学习等,深度学习本质上就是神经网络,只是经过很多年的扩展之后或者说发展之后,成为现在的样子。那么人工智能硬件或者说芯片,简单来说叫做智能硬件。它在未来就是一定会代替人做很多事情,这是未来的一个发展趋势。随着生活智能化,未来的智能硬件会越来越多,会代替人做很多事情。比方工厂里使用一些机械臂,或者说一些生产线上的工具,可以代替人做体力劳动。智能硬件在未来,肯定会代替人去做一些稍微低级点的智力劳动。人的伟大,其实是在于创造工具、使用工具,我们会制造越来越多的智能工具,替代我们做很多我们不想做的事情或者说反复的事情,让我们用有限的精力去做更多的、更高层次的一些智能任务吧。所以我觉得「人工智能+芯片」或者说智能硬件的一个模式在未来肯定是会一直发展下去的,是不会变的。5. 如何看待 GPU、FPGA、ASIC 的未来?我谈一点自己的见解,GPU、FPGA、ASIC 是当下智能硬件,或者说人工智能芯片的三个极点。GPU 可以认为是偏向通用的一类硬件,然后 ASIC 是相对专用的一种硬件,而 ASIC 是介于二者之间的一种硬件,它们各有千秋,然后各有所长。当前 GPU 广泛地应用于训练过程或者说大量数据的训练。FPGA 可以根据应用的需求非常适应性的去改变配置,把不同的算法烧进去,完成不同的功能。狭义上的 ASIC,可以具体的某一种应用,或者说比方说做一款芯片来专门实现人脸识别。大家可以看到,我们刚刚介绍的基于 DNA 架构的 Thinker 芯片,其实是一种可重构的 ASIC,这种结构叫做 CGRA(Coarse Grained Reconfigurable Architecture),它其实有点像 FPGA,它可以重构配置来支持不同的算法。我们可以支持任意网络规模、任意参数的神经网络,它的好处是我们采用大量粗粒度的 PE 形式的计算资源,使之能够快速地、高效地、在线地配置计算资源的形态来支持不同算法。其实我个人觉得,针对未来可能会发展成一种融合的形态,不知道大家有没有注意到,英伟达最新发布的 V100 其实是有 Tensor Core 的,因此我觉得未来的通用计算可以处理很多复杂的控制或者逻辑等。而一些很关键的计算,比方说神经网络里面的神经元计算,或者说一些核心的计算,会做成一些专用的 ASIC、可配置的核,放入通用的一个处理器如 CPU 和 GPU,甚至是 FPGA 里面。其实这就是融合的一种思想。此外 CPU 通常用于训练一个过程,有很多实际的应用场景,或者说我们刚才提到云端与移动端,移动端的话有大量的低功耗的需求,此时用 CPU 平台就显得不是那么合适,所以说其实我外部的控制逻辑可以稍微简单一点,像我们用到的我们设计的这款可重构的芯片就可以直接运用到其中。对于神经网络的应用来说,它其实是有一定通用性的,所以在移动端,它其实有很大的潜力,作为一个处理的核心来做神经网络计算,来实现如图像识别或者语音识别的任务。今天的公开课就到此结束了,非常感谢大家来收听和观看雷锋网的硬创公开课。我和我们组也会继续做神经网络硬件架构的一些研究,刚刚跟大家分享的也是我们过去一些研究的成果和思考。我们现在也在做一些非常有意思的研究,也欢迎大家跟我们交流,如果有一些新的成果,我也会及时和大家分享,今天的公开课就到此结束,谢谢大家,再见。雷锋网原创文章,未经授权禁止转载。详情见。4添加评论分享收藏文章被以下专栏收录查看: 505|回复: 4
STM32F767 LTDC cubemx配置
主题帖子精华
中级会员, 积分 259, 距离下一级还需 241 积分
在线时间54 小时
0.jpg (2.56 MB, 下载次数: 57)
09:19 上传
自己配置的cubemx&&生成的工程,屏幕颜色刷的不对(与我设置的颜色不一样),而且屏幕闪烁很厉害,cpu也会微微的发烫
求一个cubemx的配置工程或者配置教程
我找到问题了,开发板上ltdc的io口都是复用的,我刚刚拿到开发板也没注意。
刚刚每个io口都对了一下,重新改了一下就正常了
主题帖子精华
中级会员, 积分 259, 距离下一级还需 241 积分
在线时间54 小时
还有一个原因就是液晶屏的排线没插好,也会颜色不对的,你重新插拔一下试试。
我找到问题了,开发板上ltdc的io口都是复用的,我刚刚拿到开发板也没注意。
刚刚每个io口都对了一下,重新改了一下就正常了
主题帖子精华
中级会员, 积分 224, 距离下一级还需 276 积分
在线时间24 小时
本帖最后由 juky2008 于
15:12 编辑
闪烁的厉害是由于你的像素时钟可能慢了。颜色不对的话,可能是由于你的RGB格式不对,比如RGB565,RGB888等。我用的芯片是STM32F429,配置之前你要看一下TFT液晶屏的数据手册,主要是像素时钟,像素时钟极性,水平同步宽度,水平后沿,水平前沿,水平有效宽度,垂直同步高度,垂直后沿,垂直前沿,垂直有效宽度
还有DMA配置,如果以上配置正确的话,应该没有问题的。
(84.97 KB, 下载次数: 1)
15:03 上传
(207.23 KB, 下载次数: 1)
15:03 上传
(178.26 KB, 下载次数: 1)
14:58 上传
(193.83 KB, 下载次数: 1)
14:57 上传
主题帖子精华
中级会员, 积分 259, 距离下一级还需 241 积分
在线时间54 小时
闪烁的厉害是由于你的像素时钟可能慢了。颜色不对的话,可能是由于你的RGB格式不对,比如RGB565,RGB888等 ...
不好意思&&这几天有其他事没回复。
我用的是液晶是原子的7寸的屏幕,按照你的配置方法也是一样的现象。我之前的配置参数都是与原子例程里的参数一样的,背景色就是不正常。
主题帖子精华
中级会员, 积分 224, 距离下一级还需 276 积分
在线时间24 小时
还有一个原因就是液晶屏的排线没插好,也会颜色不对的,你重新插拔一下试试。
Powered by&p&日本综艺节目《噂の東京マガジン》中有个环节&/p&&p&随机要在路上找普通人现场做饭&/p&&p&然后节目组找到了一位&/p&&p&马上将要入职做幼儿园老师的女孩&/p&&p&节目效果堪称播出事故&/p&&p&在看这个视频之前&br&&/p&我以为要展现的是温柔贤惠能干勤劳的幼师形象&br&&figure&&img data-rawheight=&240& src=&https://pic4.zhimg.com/50/v2-c659c068bff46f842f5be_b.jpg& data-rawwidth=&240& class=&content_image& width=&240&&&/figure&&br&结果盖子掀起来的那一刻&br&&p&哈哈哈哈哈哈哈哈&/p&&a class=&video-box& href=&//link.zhihu.com/?target=https%3A//www.zhihu.com/video/101248& target=&_blank& data-video-id=&& data-video-playable=&& data-name=&& data-poster=&https://pic1.zhimg.com/v2-944a5f024f942df8a479.jpg& data-lens-id=&101248&&
&img class=&thumbnail& src=&https://pic1.zhimg.com/v2-944a5f024f942df8a479.jpg&&&span class=&content&&
&span class=&title&&&span class=&z-ico-extern-gray&&&/span&&span class=&z-ico-extern-blue&&&/span&&/span&
&span class=&url&&&span class=&z-ico-video&&&/span&https://www.zhihu.com/video/101248&/span&
&/a&冯巩在谁说我不在乎这部电影饰演神经病院长&br&&p&和病人交流的片段...&/p&&figure&&img data-rawheight=&165& src=&https://pic4.zhimg.com/50/v2-e4dedbcc4eefdfc_b.jpg& data-rawwidth=&172& class=&content_image& width=&172&&&/figure&&a class=&video-box& href=&//link.zhihu.com/?target=https%3A//www.zhihu.com/video/967808& target=&_blank& data-video-id=&& data-video-playable=&& data-name=&& data-poster=&https://pic2.zhimg.com/v2-576d43eabae0.jpg& data-lens-id=&967808&&
&img class=&thumbnail& src=&https://pic2.zhimg.com/v2-576d43eabae0.jpg&&&span class=&content&&
&span class=&title&&&span class=&z-ico-extern-gray&&&/span&&span class=&z-ico-extern-blue&&&/span&&/span&
&span class=&url&&&span class=&z-ico-video&&&/span&https://www.zhihu.com/video/967808&/span&
&/a&日本有毒的撕撕软糖广告全集版,结尾神反转&br&&br&看完之后你的脑子里&br&&br&萦绕的是风骚的背景配乐“浪啊浪啊浪啊浪啊浪~”&br&&figure&&img data-rawheight=&80& src=&https://pic2.zhimg.com/50/v2-f5bf55dd457ae3b3d6d356f_b.jpg& data-rawwidth=&80& class=&content_image& width=&80&&&/figure&&br&&a class=&video-box& href=&//link.zhihu.com/?target=https%3A//www.zhihu.com/video/884224& target=&_blank& data-video-id=&& data-video-playable=&& data-name=&& data-poster=&https://pic1.zhimg.com/v2-1195ffdfa187277eaf11e3d71ef84b4e.jpg& data-lens-id=&884224&&
&img class=&thumbnail& src=&https://pic1.zhimg.com/v2-1195ffdfa187277eaf11e3d71ef84b4e.jpg&&&span class=&content&&
&span class=&title&&&span class=&z-ico-extern-gray&&&/span&&span class=&z-ico-extern-blue&&&/span&&/span&
&span class=&url&&&span class=&z-ico-video&&&/span&https://www.zhihu.com/video/884224&/span&
&/a&&br&哪个国家拍的广告反转最神?&br&&br&首当其冲当然是泰国啦&br&&br&每次看泰国广告就当一部完整的小电影来看&br&&figure&&img data-rawheight=&156& src=&https://pic1.zhimg.com/50/v2-8a90e1703c4caae936f0fb_b.jpg& data-rawwidth=&185& class=&content_image& width=&185&&&/figure&&br&&br&这个广告的反转,男性会感痛身受&br&&br&话说答主要被主题歌洗脑了~&br&&br&莫名觉得吼好听是怎么回事!&a class=&video-box& href=&//link.zhihu.com/?target=https%3A//www.zhihu.com/video/011264& target=&_blank& data-video-id=&& data-video-playable=&& data-name=&& data-poster=&https://pic3.zhimg.com/v2-5bbabb9ab550a1f7a9f08.jpg& data-lens-id=&011264&&
&img class=&thumbnail& src=&https://pic3.zhimg.com/v2-5bbabb9ab550a1f7a9f08.jpg&&&span class=&content&&
&span class=&title&&&span class=&z-ico-extern-gray&&&/span&&span class=&z-ico-extern-blue&&&/span&&/span&
&span class=&url&&&span class=&z-ico-video&&&/span&https://www.zhihu.com/video/011264&/span&
&/a&嘻嘻,看的开心的话&br&&br&可以点个赞哦~&figure&&img data-rawheight=&517& src=&https://pic3.zhimg.com/50/v2-a935bebffea_b.jpg& data-rawwidth=&517& class=&origin_image zh-lightbox-thumb& width=&517& data-original=&https://pic3.zhimg.com/50/v2-a935bebffea_r.jpg&&&/figure&
日本综艺节目《噂の東京マガジン》中有个环节随机要在路上找普通人现场做饭然后节目组找到了一位马上将要入职做幼儿园老师的女孩节目效果堪称播出事故在看这个视频之前 我以为要展现的是温柔贤惠能干勤劳的幼师形象 结果盖子掀起来的那一刻 哈哈哈哈哈哈哈…
&p&谢邀。&/p&&p&个人觉得现在单片机这块或许是arm一家独大了,就从我接触过、听说过的arm单片机开始聊起吧。。&/p&&p&stm32应该是现在用得最广泛的arm单片机了吧,资料铺天盖地,各种东西都有,比方说刷卡机,电子签名器,飞控,各种小玩具,各种大小开发板,各种开源硬件。很多模块出评估板都带个stm32,比方说wiced无线开发板。国产的gd32、mm32、blm32芯片都可以说是以软硬件兼容stm32为荣的。又比方说看看nuttx源码的commit,可以说相当数量的都是关于stm32的。&/p&&p&恩智浦的东西是行业应用吧,汽车电子,工业控制等等。lpc系列据说稳定性要强于stm32,k60能轻松超频到两百兆,stm32不敢超太多。比方说我楼下自动售货机里面就用的lpc系列片子。现在恩智浦是当年nxp和飞思卡尔的合体,技术水平要高于意法半导体,我还是比较喜欢imxrt的。高通都准备收购恩智浦了。&/p&&p&nuvoton也有极其便宜的cortex m单片机。另外牛蜗塘的片子貌似都特便宜,比方说它的mpu:n329xx系列的arm9,附带几十兆字节的sdram,也就二三十块钱,比stm32便宜多了;也有工业级的n97x,稍贵。&/p&&p&德仪的430主打低功耗,前几年也特别火,不过现在德仪貌似收缩了,专心弄模电去了。dsp也有点被arm cortex m4、7抢占的态势。另外之前出的狗骨头开发板真是万能的板子,很赞。&/p&&p&Atmel的avr现在也销声匿迹了,当年可是有气吞山河的架势。&/p&&p&cypress出的片子都特别讲究,比方说当年在一些论坛里推的所谓psoc,FPGA加单片机内核。不过貌似并没有像stm32之类的那么火过。cypress也收了博通的物联网部分,也推出了一些无线单片机。论坛维护的不错,看样子在行业内活的很滋润。&/p&&p&乐鑫有esp32这个双核200兆的WIFI蓝牙单片机,做物联网设备挺好的。其实有相当多的国产也有很多很优秀的片子,有些还有点奇葩,比方说迪文的那些多核高频51内核的片子。。。另外以后或许国内会出一批riscv内核的单片机,比方说pulpino都流片成功了。还有,我老师就干这个。。。&/p&&p&不过说实话,我个人觉得现在底层外设驱动已经非常成熟了,成熟的产品都有简单可用的IDE让你可以点点鼠标就能搞出事情来,什么文件系统、usb、协议栈等等工作几乎都可以完成。无论搞哪款片子,重要的是工程习惯,写代码要至少都有一点觉悟,考虑一下架构,考虑一下可移植性的问题,毕竟终端工程师能做的优化比较有限,榨干性能这活现在非得交给原厂工程师干不可。&/p&&p&个人不才之见,供参考。。&/p&
谢邀。个人觉得现在单片机这块或许是arm一家独大了,就从我接触过、听说过的arm单片机开始聊起吧。。stm32应该是现在用得最广泛的arm单片机了吧,资料铺天盖地,各种东西都有,比方说刷卡机,电子签名器,飞控,各种小玩具,各种大小开发板,各种开源硬件。…
&p&自己从电路开始做一块跑Linux的小“电脑”orz&/p&&p&我是个闲的蛋疼的大学僧,在高中和大学的社团、工作室中长期搞单片机和嵌入式系统开发。刚接触树莓派时候是惊叹不已的,然后眼看香蕉派杨梅派橙子派荔枝派醋鳖派等等等等的“开源硬件”相继登场,也是一阵的兴奋,还有那些安卓电视棒路由器之类的乱七八糟的东西,也入手了不少板子来吃灰。&/p&&p&当然本业还是搞单片机,之前也跑过st官方给103评估板的uclinux BSP包,可惜uclinux太大了,只能跑外扩flash上,fsmc的带宽太低,一个ls就要等几秒。不过当时觉得能跑Linux是单片机的最大荣誉,也相当乐在其中。&/p&&p&两年前偶然看到某博客,说Linux内核支持stm32云云,Emcraft也猛然放出支持4.2内核的它自己的STM32 SOM的BSP。随后翻了一下当时的主流内核发现,stm32_defconfig赫然在列,设备树啥的都有模有样。想必里面大有文章可做。&/p&&p&但是社区的玩法就不像基于BSP的二次开发那么工具齐全了,东拼西凑起来的东西要不断地试探,有时候人品不好,bug死活调不出来。大二时候好不容易将uboot在103的板子上跑通,加了nand flash之类的驱动,然后将uclinux 2.6的内核往死里裁剪,网络、模块、sysfs、proc啥都不要了,裁到400k,并且将data段丢到外部flash中,内核总算塞进了内部flash。busybox也基本裁剪到只剩下hush,用romfs跑起来了。&/p&&p&在片内flash里面xip,性能远胜于fsmc挂的nor、sram,shell基本感觉不到延迟。。&/p&&figure&&img src=&https://pic3.zhimg.com/50/v2-ac4a51e2b89_b.jpg& data-size=&normal& data-rawwidth=&720& data-rawheight=&1280& class=&origin_image zh-lightbox-thumb& width=&720& data-original=&https://pic3.zhimg.com/50/v2-ac4a51e2b89_r.jpg&&&figcaption&stm32f103zet6上跑emcraft的uclinux 2.6.33&/figcaption&&/figure&&p&&br&&/p&&p&后来就是考试、面试、比赛、实习,终于决定不浪费读研资格,前些日子就到实验室搬砖去了。不过我一直仍想弄出个像样子的Linux电脑来,毕竟离它只有一步之遥了,也算是大学期间最有成就感的作品了。&/p&&p&等我真正开始弄的时候,最新的Linux内核是4.13,在对stm32的支持中,stm32f429是最为完整的,基本上啥都有了,USB、网卡、dcmi、ltdc都有了。值得一提的是,ltdc和dma2d的驱动在源码driver/gpu/drm/stm目录下面是单独的目录,st真是志不在小。。。&/p&&p&stm32429-eval板子的配置是一个很好的例子,网卡、显示屏、摄像头、USB都写了。stm32f429-disc1的支持也不错。利用最新的arm-none-eabi工具链,默认配置下,编译出来内核大小1.2MB左右,可以塞进I系列的片子里。&/p&&p&按照defconfig的配置,内核起始地址0x,前面还有32k的大小放bootloader。afboot是在github上开源的专门为stm32各种板子写的Linux的bootloader,编译出来的bin文件只有2k左右。加上十几kb的设备树,恰好放得下。&/p&&p&利用手上的discovery板,用elinux现成的rootfs,作为initramfs编译进内核,进入hush可以执行一些指令,不过并没有framebuffer,点点灯还是可以的。。。&/p&&p&&a href=&//link.zhihu.com/?target=https%3A//elinux.org/STM32& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&stm32跑起基本Linux&/a&&/p&&figure&&img src=&https://pic4.zhimg.com/50/v2-036aecdf8d5_b.jpg& data-size=&normal& data-rawwidth=&810& data-rawheight=&699& class=&origin_image zh-lightbox-thumb& width=&810& data-original=&https://pic4.zhimg.com/50/v2-036aecdf8d5_r.jpg&&&figcaption&放了7MB的内存出来&/figcaption&&/figure&&p&emcraft只为discovery提供了uclinux的BSP,至于它的4.x系列的BSP,都只能用它那一套编译系统,内核抽出来编译是不行的。他们用的arm-uclinuxeabi工具链,gcc 4.4,也弄不了新版本的内核。&/p&&p&我开始构思自己的板子,stm32f429iit6芯片,带上尽可能多的外设。用cubemx来帮忙安排引脚,主芯片,加上64MB的SDRAM、128MB的nand flash、rmii接口的网卡、两个全速USB、ltdc显示器接口、摄像头、sdio,剩下的就当GPIO,接几个led灯吧。&/p&&p&内存和flash都放主芯片背面,没地方走等长线,不过线长也只有两三厘米,时钟也只有84MHz,不等长不做阻抗也罢orz&/p&&p&既然是“电脑”,就应该有个显示器接口,之前玩FPGA时候有用电阻网络搭成简易dac来做vga的例子,而ltdc就是并口rgb加上同步、使能信号。dac加上同步信号,这样就可以伪装成正经的vga了。&/p&&p&画板子用的kicad。记住快捷键,原理图封装布线都挺顺手。布线时候在OpenGL模式下面横行,比ad流畅多了。&/p&&figure&&img src=&https://pic3.zhimg.com/50/v2-3de1baed1050_b.jpg& data-size=&normal& data-rawwidth=&453& data-rawheight=&512& class=&origin_image zh-lightbox-thumb& width=&453& data-original=&https://pic3.zhimg.com/50/v2-3de1baed1050_r.jpg&&&figcaption&四层板&/figcaption&&/figure&&figure&&img src=&https://pic3.zhimg.com/50/v2-8e02d908004bec326e7e_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&793& data-rawheight=&676& class=&origin_image zh-lightbox-thumb& width=&793& data-original=&https://pic3.zhimg.com/50/v2-8e02d908004bec326e7e_r.jpg&&&/figure&&p&板子到手,焊接、测试。。值得一提的是电源引脚附近的104电容、vcap的2.2u电容一个也不能少,刚焊好主芯片、电源,就可以用jlink识别了,但是烧不了程序,电容焊齐了,就可以了。。。&/p&&figure&&img src=&https://pic2.zhimg.com/50/v2-1f942ffe41a87d45bd4ac0_b.jpg& data-size=&normal& data-rawwidth=&552& data-rawheight=&418& class=&origin_image zh-lightbox-thumb& width=&552& data-original=&https://pic2.zhimg.com/50/v2-1f942ffe41a87d45bd4ac0_r.jpg&&&figcaption&企鹅丝印的不好。。&/figcaption&&/figure&&figure&&img src=&https://pic1.zhimg.com/50/v2-a85e5e368b1c67ed800e4_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&703& data-rawheight=&646& class=&origin_image zh-lightbox-thumb& width=&703& data-original=&https://pic1.zhimg.com/50/v2-a85e5e368b1c67ed800e4_r.jpg&&&/figure&&figure&&img src=&https://pic1.zhimg.com/50/v2-5bddb5ec0f16_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&661& data-rawheight=&475& class=&origin_image zh-lightbox-thumb& width=&661& data-original=&https://pic1.zhimg.com/50/v2-5bddb5ec0f16_r.jpg&&&/figure&&figure&&img src=&https://pic3.zhimg.com/50/v2-bcdabe0f7cf1e_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&882& data-rawheight=&649& class=&origin_image zh-lightbox-thumb& width=&882& data-original=&https://pic3.zhimg.com/50/v2-bcdabe0f7cf1e_r.jpg&&&/figure&&figure&&img src=&https://pic2.zhimg.com/50/v2-60ab9bef911dd6c6dba3fa62e503b5b9_b.jpg& data-size=&normal& data-rawwidth=&796& data-rawheight=&513& class=&origin_image zh-lightbox-thumb& width=&796& data-original=&https://pic2.zhimg.com/50/v2-60ab9bef911dd6c6dba3fa62e503b5b9_r.jpg&&&figcaption&RJ45和VGA&/figcaption&&/figure&&figure&&img src=&https://pic1.zhimg.com/50/v2-b3f5ce886b9e8697a84f_b.jpg& data-size=&normal& data-rawwidth=&949& data-rawheight=&532& class=&origin_image zh-lightbox-thumb& width=&949& data-original=&https://pic1.zhimg.com/50/v2-b3f5ce886b9e8697a84f_r.jpg&&&figcaption&3.5mm音频口、USB和SD卡&/figcaption&&/figure&&p&然后就开始了漫长的裁剪和驱动搬砖了。。。&/p&&p&刚开始时,先移植一个能跑的uboot去测试内存、flash和网络。主频设为168MHz。之所以不将主频拉到180MHz,就是因为USB需要48M的时钟,不能整除180。在84MHz的时钟频率下,cas设为2,内存顺序读写速度大约能到70MB每秒。nand flash读写就有点慢了。至于网卡,焊好了,而且主机不用WiFi的话,tftp是又快又准的。&/p&&p&刚加上网络,内核就猛增到2MB。。。为了测通内核的驱动,内核只能先放在SDRAM上跑吧,到时候弄内核模块再说。奇怪的是,uboot的tftp好好的,内核的网卡初始化就死了。单步调、看寄存器,折腾了许久,发现源码里一个寄存器写错了,以至于mii接口的没问题,rmii的就不行,怪不得eval板子上能用网卡。。&/p&&p&网卡初始化时候没有使能phy芯片。。。&/p&&p&默认配置是tickless内核,这会导致网卡初始化时候卡死。。。&/p&&p&yaffs的补丁打进去之后编译不过,后来发现是新版内核为解决y2038千年虫问题而去掉了一些接口。。。&/p&&p&USB寄存器配置顺序不对,导致初始化失败。。。&/p&&p&因为在SDRAM上跑的内核性能太低了,USB外接的设备都跑的比stm32快,以至于u盘键盘什么的几乎总是枚举失败。。。&/p&&p&ltdc驱动忘了注册时钟,导致内核最后将ltdc关掉,以至于没有显示。。。&/p&&p&sdio驱动更新了,数据结构变了,然后用不了了。。。&/p&&p&摄像头初始化时候没有使能。。。&/p&&p&。。。&/p&&p&驱动搬好了,内核就爆到快5MB了,然后要想办法裁剪到2MB以下,而且内核的网络是不能模块化的。。。&/p&&p&内核加载模块失败,后来发现是gcc的参数没用长跳转,无法从0x的片内flash跳到0x的SDRAM那里。。。&/p&&p&还有&b&日常hardfault&/b&:内存没调好,hardfault;设备树写错了,hardfault;还没进start_kernel(),hardfault。。。&/p&&p&我记得的最吊诡的hardfault是,自己编译的gcc6.4的arm-uclinuxeabi工具链,短跳转的地址算错了,翻了binutils的源码发现新版的as为了支持armv8-m的cpu改了一些东西,导致往前跳的地址多了1,导致PC值为偶数就进入arm模式,然后报用法错误,上访hardfault。。。&/p&&p&也碰到过几次imprecise的bus fault,有的是因为写访问了片内flash,有的是外设寄存器没设好,有的发生在初始化中断向量表时候。。。&/p&&p&这一堆乱七八糟的问题解决了,终于,Linux跑起来了。。。&/p&&p&之前在SDRAM里跑,BogoMIPS是9;在片内flash里跑,BogoMIPS暴涨到110。。。&/p&&figure&&img src=&https://pic2.zhimg.com/50/v2-cbed04a73e0dad0cd86cb43d55bcdd15_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&863& data-rawheight=&539& class=&origin_image zh-lightbox-thumb& width=&863& data-original=&https://pic2.zhimg.com/50/v2-cbed04a73e0dad0cd86cb43d55bcdd15_r.jpg&&&/figure&&p&&a href=&//link.zhihu.com/?target=https%3A//www.bilibili.com/video/avFfrom%3Dsearch%26seid%3D& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&板子接家里老掉牙的显示器&/a&&/p&&p&不过回味起来,这只能说业余时间弄的玩具。可以说如今搞自动化的都搞slam,搞计算机的都搞ai,搞系统开发这玩意的早就不那么吃香了罢。&/p&
自己从电路开始做一块跑Linux的小“电脑”orz我是个闲的蛋疼的大学僧,在高中和大学的社团、工作室中长期搞单片机和嵌入式系统开发。刚接触树莓派时候是惊叹不已的,然后眼看香蕉派杨梅派橙子派荔枝派醋鳖派等等等等的“开源硬件”相继登场,也是一阵的兴奋…
&figure&&img src=&https://pic3.zhimg.com/678d17964cdc8abb6ecfba_b.jpg& data-rawwidth=&1920& data-rawheight=&1079& class=&origin_image zh-lightbox-thumb& width=&1920& data-original=&https://pic3.zhimg.com/678d17964cdc8abb6ecfba_r.jpg&&&/figure&&p&也许有很多同学上过 C/C++ 的课后,可以完成一些简单的编程练习,又能在一些网站刷题,但对于如何开发有实际用途的程序可能感到束手无策。本教程希望能以一个简单的项目开发形式,让同学能逐步理解如何从无到有去开发软件。&/p&&p&为什么选择 JSON?因为它足够简单,除基本编程外不需大量技术背景知识。JSON 有标准,可按照标准逐步实现。JSON 也是实际在许多应用上会使用的格式,所以才会有大量的开源库。&/p&&p&这是一个免费、&a href=&https://link.zhihu.com/?target=https%3A//github.com/miloyip/json-tutorial& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&开源的教程&/a&,如果你喜欢,也可以打赏鼓励。因为工作及家庭因素,不能保证每篇文章的首发时间,请各位见谅。&/p&&p&(题图 &a href=&https://link.zhihu.com/?target=https%3A//unsplash.com/photos/nyghAPuJQC8& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Photo by Carl Cerstrand&/a&)&/p&&hr&&h2&对象与目标&/h2&&p&教程对象:学习过基本 C/C++ 编程的同学。&/p&&p&通过这个教程,同学可以了解如何从零开始写一个 JSON 库,其特性如下:&/p&&ul&&li&符合标准的 JSON 解析器和生成器&/li&&li&手写的递归下降解析器(recursive descent parser)&/li&&li&使用标准 C 语言(C89)&/li&&li&跨平台/编译器(如 Windows/Linux/OS X,vc/gcc/clang)&/li&&li&仅支持 UTF-8 JSON 文本&/li&&li&仅支持以 double 存储 JSON number 类型&/li&&li&解析器和生成器的代码合共少于 500 行&/li&&/ul&&p&除了围绕 JSON 作为例子,希望能在教程中讲述一些课题:&/p&&ul&&li&测试驱动开发(test driven development, TDD)&/li&&li&C 语言编程风格&/li&&li&数据结构&/li&&li&API 设计&/li&&li&断言&/li&&li&Unicode&/li&&li&浮点数&/li&&li&Github、CMake、valgrind、Doxygen 等工具&/li&&/ul&&hr&&h2&教程大纲&/h2&&p&本教程预计分为 9 个单元,第 1-8 个单元附带练习和解答。&/p&&ol&&li&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&启程&/a&( 完成):编译环境、JSON 简介、测试驱动开发、解析器主要函数及各数据结构。练习 JSON 布尔类型的解析。&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&启程解答篇&/a&( 完成)。&/li&&li&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&解析数字&/a&( 完成):JSON number 的语法。练习 JSON number 类型的校验。&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&解析数字解答篇&/a&( 完成)&/li&&li&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&解析字符串&/a&( 完成):使用 union 存储 variant、自动扩展的堆栈、JSON string 的语法、valgrind。练习最基本的 JSON string 类型的解析、内存释放。&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&解析字符串解答篇 &/a&( 完成)&/li&&li&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Unicode&/a&( 完成):Unicode 和 UTF-8 的基本知识、JSON string 的 unicode 处理。练习完成 JSON string 类型的解析。&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Unicode 解答篇&/a&( 完成)&/li&&li&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&解析数组&/a&( 完成):JSON array 的语法。练习完成 JSON array 类型的解析、相关内存释放。&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&解析数组解答篇&/a&( 完成)&/li&&li&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&解析对象&/a&( 完成):JSON object 的语法、重构 string 解析函数。练习完成 JSON object 的解析、相关内存释放。&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&解析对象解答篇&/a&( 完成)&/li&&li&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&生成器&/a&( 完成):JSON 生成过程、注意事项。练习完成 JSON 生成器。&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&生成器解答篇&/a&( 完成)&/li&&li&访问:JSON array/object 的访问及修改。练习完成相关功能。&/li&&li&终点及新开始:加入 nativejson-benchmark 测试,与 RapidJSON 对比及展望。&br&&/li&&/ol&&hr&&h2&关于作者&/h2&&p&叶劲峰(Milo Yip)现任腾讯 T4 专家、互动娱乐事业群魔方工作室群前台技术总监。他获得香港大学认知科学学士(BCogSc)、香港中文大学系统工程及工程管理哲学硕士(MPhil)。他是《游戏引擎架构》译者、《C++ Primer 中文版(第五版)》审校。他曾参与《天涯明月刀》、《斗战神》、《爱丽丝:疯狂回归》、《美食从天降》、《王子传奇》等游戏项目,以及多个游戏引擎及中间件的研发。他是开源项目 &a href=&https://link.zhihu.com/?target=https%3A//github.com/miloyip/rapidjson& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&RapidJSON&/a& 的作者,开发 &a href=&https://link.zhihu.com/?target=https%3A//github.com/miloyip/nativejson-benchmark& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&nativejson-benchmark&/a& 比较 41 个开源原生 JSON 库的标准符合程度及性能。他在 1990 年学习 C 语言,1995 年开始使用 C++ 于各种项目。&/p&
也许有很多同学上过 C/C++ 的课后,可以完成一些简单的编程练习,又能在一些网站刷题,但对于如何开发有实际用途的程序可能感到束手无策。本教程希望能以一个简单的项目开发形式,让同学能逐步理解如何从无到有去开发软件。为什么选择 JSON?因为它足够简单…
&figure&&img src=&https://pic4.zhimg.com/v2-32da89e94d463ea354dd9_b.jpg& data-rawwidth=&3315& data-rawheight=&1526& class=&origin_image zh-lightbox-thumb& width=&3315& data-original=&https://pic4.zhimg.com/v2-32da89e94d463ea354dd9_r.jpg&&&/figure&&h2&前言&/h2&&blockquote&只有光头才能变强&/blockquote&&p&这个学期开了Linux的课程了,授课的老师也是比较负责任的一位。总的来说也算是比较系统地学习了一下Linux了~~~&/p&&p&本文章主要是&b&总结Linux的基础操作以及一些简单的概念&/b&~如果不熟悉的同学可下个Linux来玩玩(或者去买一个服务器玩玩【学生版的不是很贵】),对于开发者来说,能使用Linux做一些基本的操作是必要的!&/p&&p&那么接下来就开始吧,当然了&b&我的Linux仅仅是入门水平&/b&,如果有错的地方还需请大家多多包涵,并不吝在评论区指出错误~&/p&&h2&一、为什么我们要学习Linux&/h2&&p&相信&b&大部分人&/b&的PC端都是用Windows系统的,那我们为什么要学习Linux这个操作系统呢???Windows图形化界面做得这么好,日常基本使用的话,学习成本几乎为零。&/p&&p&而Linux不一样,&b&可能&/b&刚接触Linux的人会认为:Linux好麻烦哦,不好玩,都是字符界面。不直观、这个破系统是用来干嘛的~~&/p&&p&日常用的话Windows是比较顺手的,但是我们要知道的是:我们开发出来的程序&b&一般都是放在Linux下运行&/b&的。&/p&&p&那可能就会有人提出疑问了:Windows同样是操作系统,&b&为啥要放在Linux下,而不放在Windows下呢&/b&??相信Windows也是可以运行我们写出来的程序的。&/p&&p&我总结了Linux的&b&几个优点&/b&:&/p&&ol&&li&免费&/li&&li&很多软件原生是在Linux下运行的,庞大的社区支持,&b&生态环境好&/b&。&/li&&li&&b&开源&/b&,可被定制,开放,&b&多用户的网络操作系统&/b&。&/li&&li&&b&相对安全稳定&/b&&/li&&/ol&&p&参考资料:&/p&&ul&&li&&a href=&https://link.zhihu.com/?target=https%3A//link.juejin.im/%3Ftarget%3Dhttps%253A%252F%252Fwww.zhihu.com%252Fquestion%252F& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&www.zhihu.com/question/19…&/a&&/li&&/ul&&p&所以开发者&b&选择了Linux&/b&来跑我们自己写出来的程序。&/p&&h2&二、Linux的基础知识&/h2&&p&&b&Linux系统的组成&/b&:&/p&&ol&&li&&b&linux内核&/b&(linus 团队管理)&/li&&li&&b&shell&/b&:用户与内核交互的接口&/li&&li&&b&文件系统&/b&:ext3、ext4等。windows 有 fat32 、ntfs&/li&&li&&b&第三方应用软件&/b&&/li&&/ol&&h2&2.1Shell的基本知识&/h2&&p&除了Shell、其他的都应该挺好懂的,那么&b&Shell是什么东西呢&/b&???&/p&&blockquote&Shell是系统的用户界面,提供了&b&用户与内核进行交互操作的一种接口&/b&(命令解释器)&/blockquote&&p&Shell可以执行:&/p&&ul&&li&&b&内部命令&/b&&/li&&li&&b&应用程序&/b&&/li&&li&&b&shell脚本&/b&&/li&&/ul&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-4fcdebfb031a06d9fe1252_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&507& data-rawheight=&469& class=&origin_image zh-lightbox-thumb& width=&507& data-original=&https://pic1.zhimg.com/v2-4fcdebfb031a06d9fe1252_r.jpg&&&/figure&&p&&br&&/p&&p&使用&code&type&/code&命令可以&b&区分&/b&内部命令和外部命令&/p&&p&于是乎,我们利用Shell就可以干下面这些事了:&/p&&ul&&li&&b&命令行解释(这是用得最多的!)&/b&&/li&&li&命令的多种执行顺序&/li&&li&通配符( wild-card characters )&/li&&li&命令补全、别名机制、命令历史&/li&&li&I/O重定向( Input/output redirection )&/li&&li&管道( pipes )&/li&&li&命令替换( 或$( ) )&/li&&li&Shell编程语言( Shell Script )&/li&&/ul&&p&Shell的主要版本有以下这么多:&/p&&ul&&li&我们&b&常用(默认)的就是bash&/b&(bourne again shell)&/li&&/ul&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-cd92e075aa350c884f1e6_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&999& data-rawheight=&537& class=&origin_image zh-lightbox-thumb& width=&999& data-original=&https://pic4.zhimg.com/v2-cd92e075aa350c884f1e6_r.jpg&&&/figure&&p&&br&&/p&&p&使用&code&ps&/code&命令观察正在执行的shell&/p&&figure&&img src=&https://pic3.zhimg.com/v2-ec001bdeaef382_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&276& data-rawheight=&88& class=&content_image& width=&276&&&/figure&&p&&br&&/p&&h2&2.2Linux基本目录结构&/h2&&p&在Windows下,会有&b&基本的目录结构&/b&的:&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-a91b527cb3ab3dd2315810_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1280& data-rawheight=&663& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic1.zhimg.com/v2-a91b527cb3ab3dd2315810_r.jpg&&&/figure&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-e7a0ce13f1b5fe0eac2cc2c_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1123& data-rawheight=&549& class=&origin_image zh-lightbox-thumb& width=&1123& data-original=&https://pic3.zhimg.com/v2-e7a0ce13f1b5fe0eac2cc2c_r.jpg&&&/figure&&p&&br&&/p&&p&Linux下也不例外了,也是有基本的目录结构的:&/p&&p&&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-1f6cdbc3e4eaa2a08ab9_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&651& data-rawheight=&125& class=&origin_image zh-lightbox-thumb& width=&651& data-original=&https://pic2.zhimg.com/v2-1f6cdbc3e4eaa2a08ab9_r.jpg&&&/figure&&p&&br&&/p&&p&Linux 文件系统是一个&b&目录树的结构&/b&,文件系统结构从一个根目录开始,根目录下可以有任意多个文件和子目录,子目录中又可以有任意多个文件和子目录&/p&&ul&&li&&b&bin 存放二进制可执行文件(ls,cat,mkdir等)&/b&&/li&&li&boot 存放用于系统引导时使用的各种文件&/li&&li&dev 用于存放设备文件&/li&&li&&b&etc 存放系统配置文件&/b&&/li&&li&home 存放所有用户文件的根目录&/li&&li&lib 存放跟文件系统中的程序运行所需要的共享库及内核模块&/li&&li&mnt 系统管理员安装临时文件系统的安装点&/li&&li&&b&opt 额外安装的可选应用程序包所放置的位置&/b&&/li&&li&proc 虚拟文件系统,存放当前内存的映射&/li&&li&&b&root 超级用户目录&/b&&/li&&li&sbin 存放二进制可执行文件,只有root才能访问&/li&&li&tmp 用于存放各种临时文件&/li&&li&usr 用于存放系统应用程序,比较重要的目录/usr/local 本地管理员软件安装目录&/li&&li&var 用于存放运行时需要改变数据的文件&/li&&/ul&&h2&2.3命令基本格式&/h2&&p&&code&cmd [options] [arguments]&/code&,options称为选项,arguments称为参数&/p&&p&选项和参数都作为Shell命令执行时的输入,它们&b&之间用空格分隔开&/b&。&/p&&ul&&li&Linux是&b&区分大小&/b&写的&/li&&/ul&&p&&b&一般来说&/b&,后面跟的选项如果&b&单字符&/b&选项前使用&b&一个&/b&&code&减号-&/code&。&b&单词选项&/b&前使用两个&code&减号--&/code&&/p&&ul&&li&这是一般的情况,有些命令还是不归属这种规律的(相对较少)~~~&/li&&li&例子:&code&ls -a&/code&和&code&ls -all&/code&,&code&a&/code& 单个字符使用一个&code&-&/code&,一个单词&code&all&/code& 使用两个&code&--&/code&&/li&&/ul&&p&在Linux中,&b&可执行的文件&/b&也进行了分类:&/p&&ul&&li&&b&内置命令&/b&:出于效率的考虑,将一些常用命令的解释程序&b&构造在Shell内部&/b&。&/li&&li&&b&外置命令&/b&:存放在/bin、/sbin目录下的命令&/li&&li&&b&实用程序&/b&:存放在/usr/bin、/usr/sbin、/usr/share、/usr/local/bin等目录下的实用程序&/li&&li&&b&用户程序&/b&:用户程序经过编译生成可执行文件后,可作为Shell命令运行&/li&&li&&b&Shell脚本&/b&:由Shell语言编写的批处理文件,可作为Shell命令运行&/li&&/ul&&h2&2.4通配符&/h2&&p&学过一些正则表达式的或者有点基础的同学对通配符应该就不陌生的了,在Linux也有通配符(在搜索的时候挺有用的)&/p&&ul&&li&*:匹配任何字符和任何数目的字符&/li&&li&?:匹配单一数目的任何字符&/li&&li&[ ]:匹配[ ]之内的任意一个字符&/li&&li&[! ]:匹配除了[! ]之外的任意一个字符,!表示非的意思&/li&&/ul&&h2&2.5文件的类型&/h2&&p&在Linux下文件的类型有这么多:&/p&&ul&&li&&b&普通文件&/b&&code&-&/code&&/li&&li&&b&目录&/b&&code&d&/code&&/li&&li&&b&符号链接&/b& &code&l&/code&&/li&&ul&&li&硬链接: 与普通文件没什么不同,inode 都指向同一个文件在硬盘中的区块&/li&&li&软链接: 保存了其代表的文件的绝对路径,是另外一种文件,在硬盘上有独立的区块,访问时替换自身路径(简单地理解为 Windows 中常见的快捷方式)。&/li&&/ul&&li&字符设备文件 &code&c&/code&&/li&&li&块设备文件&code&b&/code&&/li&&li&套接字&code&s&/code&&/li&&li&命名管道&code&p&/code&&/li&&/ul&&p&我们常见的就是普通文件,目录和符号链接。其他的了解一下即可~&/p&&p&符号链接参考资料:&/p&&ul&&li&&a href=&https://link.zhihu.com/?target=https%3A//link.juejin.im/%3Ftarget%3Dhttps%253A%252F%252Fwww.jianshu.com%252Fp%252Fdde6a01c4094& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&www.jianshu.com/p/dde6a01c4…&/a&&/li&&/ul&&h2&2.5.1用户主目录&/h2&&p&可能在网上查阅资料的时候会出现&b&用户主目录&/b&这么一个名词,那他是什么呢???&/p&&p&前面已经说了,我们的Linux是&b&多用户的网络系统&/b&!所以,我们可以在Linux下创建多个用户,&b&每个用户都会有自己专属的空间&/b&。&/p&&ul&&li&所以,在创建用户时,系统管理员&b&会给每个用户建立一个主目录&/b&,通常在&code&/home/&/code&目录下&/li&&li&比如:用户osmond的主目录为:&code&/home/osmond&/code&&/li&&/ul&&p&用户&b&对自己主目录的文件拥有所有权&/b&,可以在自己的主目录下进行相关操作。&/p&&h2&三、常用的命令&/h2&&p&上面说了一堆的基础概念,这是给我们敲命令之前打了一点基础,在敲命令的同时也会遇到一些比较重要的知识点的。那就到时候再说说了~~~&/p&&h2&3.1常用的文件、目录操作命令&/h2&&p&这是我们&b&使用得最多&/b&的命令了,&b&Linux最基础的命令&/b&!&/p&&ul&&li&可用 &code&pwd&/code&命令查看用户的当前目录&/li&&li&可用 &code&cd&/code& 命令来切换目录&/li&&li&&code&.&/code&表示当前目录&/li&&li&&code&..&/code& 表示当前目录的上一级目录(父目录)&/li&&li&&code&-&/code&表示用 cd 命令切换目录&b&前&/b&所在的目录&/li&&li&&code&~&/code& 表示&b&用户主目录&/b&的绝对路径名&/li&&/ul&&p&&b&绝对路径:&/b&&/p&&ul&&li&以斜线(/)开头 ,描述到文件位置的&b&完整说明&/b& ,任何时候你想指定文件名的时候都可以使用&/li&&/ul&&p&&b&相对路径 :&/b&&/p&&ul&&li&不以斜线(/)开头 ,指定&b&相对于你的当前工作目录而言的位置&/b& ,可以被用作指定文件名的简捷方式&/li&&/ul&&p&tips:&b&输入命令的时候要常用tab键来补全&/b&&/p&&ul&&li&&code&ls&/code&:显示文件或目录信息&/li&&li&&code&mkdir&/code&:当前目录下创建一个空目录&/li&&li&&code&rmdir&/code&:要求目录为空&/li&&li&&code&touch&/code&:生成一个空文件或更改文件的时间&/li&&li&&code&cp&/code&:复制文件或目录&/li&&li&&code&mv&/code&:移动文件或目录、文件或目录改名&/li&&li&&code&rm&/code&:删除文件或目录&/li&&li&&code&ln&/code&:建立链接文件&/li&&li&&code&find&/code&:查找文件&/li&&li&&code&file/stat&/code&:查看文件类型或文件属性信息&/li&&li&&code&cat:&/code&查看文本文件内容&/li&&li&&code&more:&/code&可以分页看&/li&&li&&code&less:&/code&不仅可以分页,还可以方便地搜索,回翻等操作&/li&&li&&code&tail -10&/code&: 查看文件的尾部的10行&/li&&li&&code&head -20&/code&:查看文件的头部20行&/li&&li&&code&echo&/code&:把内容重定向到指定的文件中 ,有则打开,无则创建&/li&&li&&code&管道命令 |&/code& :将前面的结果给后面的命令,例如:&code&ls -la | wc&/code&,将ls的结果加油wc命令来统计字数&/li&&li&&code&重定向 & 是覆盖模式,&& 是追加模式&/code&,例如:&code&echo &Java3y,zhen de hen xihuan ni& & qingshu.txt&/code&把左边的输出放到右边的文件里去&/li&&/ul&&p&学了这些命令我们能干嘛?&b&其实就是在Windows下复制文件、粘贴文件、创建文件、查看文件这几种&/b&~~~&/p&&h2&3.1.1常用的文件、目录操作练习题&/h2&&p&巩固一下基础,&b&来做做题目:&/b&&/p&&ul&&li&(1)Linux的shell程序默认是&code&bash 程序&/code&;&/li&&li&(2)Linux命令格式包含三个部分,分别是: &code&命令&/code& 、 &code&选项&/code& 、 &code&参数&/code& ;&/li&&li&(3)Linux命令选项前为单个减号(-),后面一般为 &code&单字符&/code& ,选项前为双减号(--),后面一般为 &code&单词&/code&;&/li&&li&(4)Linux命令中使用的通配符有 &code&? * []&/code& ;&/li&&li&(5)命令 ls /usr/bin/w* 的效果是 &code&列出指定目录下的所有以w开头的文件或目录&/code& ;&/li&&li&(6)命令 ls /usr/bin/w?? 的效果是 &code&列出指定目录下的以w开头名称长度为3的所有文件或目录&/code& ;&/li&&li&(7)命令 ls /usr/bin/[xyz]* 的效果是 &code&列出指定目录下的文件名以x或y或z开头的所有文件或目录&/code& ;&/li&&li&(8)命令 ls /usr/bin/[!a-h]* 的效果是 &code&列出指定目录下的文件名不以a到h区间字母开头的所有文件或目录&/code& ;&/li&&li&(9)目录操作时,“.” 表示 &code&当前目录&/code& ;&/li&&li&(10)目录操作时,“..” 表示 &code&上一级目录&/code& ;&/li&&li&(11)目录操作时,“-” 表示 &code&上一次工作目录&/code& ;&/li&&li&(12)目录操作时,“~” 表示 &code&用户主目录&/code& ;&/li&&li&(13)命令ln可以建立文件链接,这种链接分为: &code&硬链接&/code& 和 &code&软链接&/code& ;&/li&&li&(14)命令touch可以改变文件的三种时间,分别是: &code&access time&/code& 、 &code&modify time&/code& 、 &code&change time&/code& ;&/li&&/ul&&blockquote&进入/tmp目录,建立一个文件,goldXX(XX为学号的末两位),查看文件的时间&/blockquote&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-083bb4763c61bbc_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&535& data-rawheight=&210& class=&origin_image zh-lightbox-thumb& width=&535& data-original=&https://pic4.zhimg.com/v2-083bb4763c61bbc_r.jpg&&&/figure&&p&&br&&/p&&blockquote&在账户的主目录中,建立一个dog目录,进入dog目录后,建立一个catXX(XX为学号的末两位)目录,进入catXX目录,显示当前目录;然后返回上一级目录,删除catXX目录;&/blockquote&&figure&&img src=&https://pic2.zhimg.com/v2-8a1edbd23d7c2e60a215_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&325& data-rawheight=&188& class=&content_image& width=&325&&&/figure&&p&&br&&/p&&blockquote&复制/etc/passwd文件到账户主目录,修改账户主目录下passwd为passwdXX(XX为学号的末两位)&/blockquote&&figure&&img src=&https://pic2.zhimg.com/v2-6ea2d285ad3ed1d22468_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&450& data-rawheight=&86& class=&origin_image zh-lightbox-thumb& width=&450& data-original=&https://pic2.zhimg.com/v2-6ea2d285ad3ed1d22468_r.jpg&&&/figure&&p&&br&&/p&&blockquote&查找文件名叫做zcat的文件;复制该文件到/tmp目录;用长格式列出该文件;然后删除/tmp目录下的所有文件,并检查文件是否已被删除&/blockquote&&figure&&img src=&https://pic4.zhimg.com/v2-ccf8ff3dc60_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&444& data-rawheight=&245& class=&origin_image zh-lightbox-thumb& width=&444& data-original=&https://pic4.zhimg.com/v2-ccf8ff3dc60_r.jpg&&&/figure&&p&&br&&/p&&blockquote&复制/etc/hosts文件到账户主目录下;在账户主目录中建立一个硬链接文件(文件名为hostsYYY(YYY为学生姓名拼音缩写)),链接到主目录下的hosts文件;分别查看hosts和hostsYYY的文件的inode信息&/blockquote&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-d464ba90e2a8df38d62e77fac3577a44_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&522& data-rawheight=&318& class=&origin_image zh-lightbox-thumb& width=&522& data-original=&https://pic1.zhimg.com/v2-d464ba90e2a8df38d62e77fac3577a44_r.jpg&&&/figure&&p&&br&&/p&&blockquote&复制/usr/bin/vdir文件到账户主目录下;在账户主目录中建立一个软链接文件(文件名为newdir),链接到主目录下的vdir文件;分别查看vdir和newdir的文件的inode信息&/blockquote&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-b50eb0e873a985aa596e3_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&508& data-rawheight=&323& class=&origin_image zh-lightbox-thumb& width=&508& data-original=&https://pic1.zhimg.com/v2-b50eb0e873a985aa596e3_r.jpg&&&/figure&&p&&br&&/p&&blockquote&用长格式列出目录/usr/bin目录下的所有文件,输出重新定向到文件outXX(XX为学生学号末两位),检查结果;用长格式列出目录/etc目录下的所有文件,输出结果补充到文件outXX末尾&/blockquote&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-e49b9ac69b467c80f54d02f66c5bac2e_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&446& data-rawheight=&130& class=&origin_image zh-lightbox-thumb& width=&446& data-original=&https://pic3.zhimg.com/v2-e49b9ac69b467c80f54d02f66c5bac2e_r.jpg&&&/figure&&p&&br&&/p&&blockquote&用长格式列出/usr/bin目录下的所有文件,通过管道与more命令连接,实现对文件列表的浏览&/blockquote&&p&&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-663ecd3cefa_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&638& data-rawheight=&401& class=&origin_image zh-lightbox-thumb& width=&638& data-original=&https://pic2.zhimg.com/v2-663ecd3cefa_r.jpg&&&/figure&&p&&br&&/p&&blockquote&&code&&和&&&/code&有何区别?&/blockquote&&p&答:&code&&&/code&是&b&覆盖&/b&方式重定向到新的文件;&code&&&&/code&是以&b&补充&/b&方式,添加到原文件的末尾。&/p&&blockquote&通过管道和more命令,浏览文件列表方便在哪里?&/blockquote&&p&答:对于文件列表超出一个屏幕显示的情况,这种方式可以&b&分屏浏览,比较方便&/b&。&/p&&h2&3.2文件打包和压缩命令&/h2&&p&在Windows操作系统下,我们会使用WinRAR或者快压等等的压缩软件来进行压缩或者解压。&/p&&p&在Linux下&b&当然也存在压缩或解压的操作咯&/b&,下面我们就来学习一下在Linux下是怎么压缩和解压的!&/p&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-ac115c134dd032acc5db65a9_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1025& data-rawheight=&533& class=&origin_image zh-lightbox-thumb& width=&1025& data-original=&https://pic3.zhimg.com/v2-ac115c134dd032acc5db65a9_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-6efeebf101ba6c482b29a74e7b1b5f11_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&997& data-rawheight=&614& class=&origin_image zh-lightbox-thumb& width=&997& data-original=&https://pic4.zhimg.com/v2-6efeebf101ba6c482b29a74e7b1b5f11_r.jpg&&&/figure&&p&&br&&/p&&p&压缩的方式也是有好几种,我们&b&常用&/b&的有下面这三种:&/p&&ul&&li&gzip&/li&&li&bzip2&/li&&li&tar&/li&&/ul&&p&常用的压缩的命令就有:&/p&&ul&&li&&code&gzip filename&/code&&/li&&li&&code&bzip2 filename&/code&&/li&&li&&code&tar -czvf filename&/code&&/li&&/ul&&p&常用的解压命令有:&/p&&ul&&li&&code&gzip -d filename.gz&/code&&/li&&li&&code&bzip2 -d filename.bz2&/code&&/li&&li&&code&tar -xzvf filename.tar.gz&/code&&/li&&/ul&&h2&3.3正则表达式+grep&/h2&&p&上面我们已经学过了&code&cat、more、less、tail&/code&这些查看文本文件的命令了,但是我想&b&快速查看这个文本文件下的某些关键字是否存在&/b&,那怎么办???&/p&&p&在Windows下就比较简单的,几乎所有的文本编辑器(记事本)都支持&code&CTRL+F&/code&,往里面输入关键字就可查找出来:&/p&&p&&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-6c6fe8ca587ae49d9ba206_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1280& data-rawheight=&429& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic2.zhimg.com/v2-6c6fe8ca587ae49d9ba206_r.jpg&&&/figure&&p&&br&&/p&&p&那在Linux下,没有图形界面,没有&code&CTRL+F&/code&的情况下,&b&如果不懂一些命令的话,那还真是难找对应的字符出来&/b&。下面我就来说说如何快速&b&查找一个文本文件下的某些字符&/b&。&/p&&h2&3.3.1正则表达式&/h2&&p&首先我们就来说说正则表达式,如果接触过的同学就知道:这玩意并不好记。一旦不用就很容易就忘记了,所以只能在用的时候查查了~~~所以下面我就直接给出一些规则了,不多说啦。&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-ed48988ece4c23cd1ad865e4b5bb87d8_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1004& data-rawheight=&633& class=&origin_image zh-lightbox-thumb& width=&1004& data-original=&https://pic4.zhimg.com/v2-ed48988ece4c23cd1ad865e4b5bb87d8_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-dc43daa14f6beb7a20d9abbee2bdc8b8_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1071& data-rawheight=&572& class=&origin_image zh-lightbox-thumb& width=&1071& data-original=&https://pic3.zhimg.com/v2-dc43daa14f6beb7a20d9abbee2bdc8b8_r.jpg&&&/figure&&p&&br&&/p&&h2&3.3.2grep命令&/h2&&p&grep(global search regular expression)是一个&b&强大的文本搜索工具&/b&。grep 使用正则表达式搜索文本,并把匹配的行打印出来。&/p&&p&格式:&code&grep [options] PATTERN [FILE...]&/code&&/p&&ul&&li&PATTERN 是查找条件:&b&可以是普通字符串、可以是正则表达式&/b&,通常用单引号将RE括起来。&/li&&li&FILE 是要查找的文件,可以是用空格间隔的多个文件,也可是使用Shell的通配符在多个文件中查找PATTERN,省略时表示在标准输入中查找。&/li&&li&grep命令不会对输入文件进行任何修改或影响,可以使用输出重定向将结果存为文件&/li&&/ul&&p&例子:&/p&&ul&&li&在文件 myfile 中查找包含字符串 mystr的行&/li&&ul&&li&&code&grep -n mystr myfile&/code& &/li&&/ul&&li&显示 myfile 中第一个字符为字母的所有行&/li&&ul&&li&&code&grep '^[a-zA-Z]' myfile&/code& &/li&&/ul&&li&在文件 myfile 中查找首字符不是 # 的行(&b&即过滤掉注释行&/b&)&/li&&ul&&li&&code&grep -v '^#' myfile&/code& &/li&&/ul&&li&列出/etc目录(包括子目录)下所有文件内容中包含字符串“root”的文件名&/li&&ul&&li&&code&grep -lr root /etc/*&/code&&/li&&/ul&&/ul&&p&&br&&/p&&blockquote&用grep查找/etc/passwd文件中以a开头的行,要求显示行号;查找/etc/passwd文件中以login结束的行;&/blockquote&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-3a50effbdd4_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&616& data-rawheight=&385& class=&origin_image zh-lightbox-thumb& width=&616& data-original=&https://pic3.zhimg.com/v2-3a50effbdd4_r.jpg&&&/figure&&p&&br&&/p&&h2&3.4几种提高工作效率的方法&/h2&&ul&&li&&b&自动补全命令&/b&&/li&&ul&&li&TAB键&/li&&/ul&&li&&b&历史命令&/b&&/li&&ul&&li&上下箭头键&/li&&/ul&&li&&b&别名alias&/b&&/li&&/ul&&p&这里感觉要说说的就只有别名alias了,我们下面看看例子就懂了!&/p&&blockquote&显示shell当前已经定义的别名;执行其中的两个定义别名的命令;定义一个别名grep,要求其采用彩色方式显示结果&/blockquote&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-d05c2af9ffe9ef_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&538& data-rawheight=&269& class=&origin_image zh-lightbox-thumb& width=&538& data-original=&https://pic4.zhimg.com/v2-d05c2af9ffe9ef_r.jpg&&&/figure&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-7d2d2d68cf968e11dc1141ce2aff1047_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&485& data-rawheight=&83& class=&origin_image zh-lightbox-thumb& width=&485& data-original=&https://pic3.zhimg.com/v2-7d2d2d68cf968e11dc1141ce2aff1047_r.jpg&&&/figure&&p&&br&&/p&&h2&3.5Shell变量 和 Shell环境&/h2&&p&在Windows下有用户的环境变量,系统的环境变量。在Linux一样也是有的。&/p&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-ccb5b8c6ec82e3cc9adb2f_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&632& data-rawheight=&666& class=&origin_image zh-lightbox-thumb& width=&632& data-original=&https://pic3.zhimg.com/v2-ccb5b8c6ec82e3cc9adb2f_r.jpg&&&/figure&&p&&br&&/p&&p&Shell 变量大致可以&b&分为三类&/b&:&/p&&ul&&li&&b&内部变量&/b&:由系统提供,用户只能使用不能修改。&/li&&ul&&li&?&/li&&li&GROUPS&/li&&/ul&&li&&b&环境变量&/b&:这些变量决定了用户工作的环境,它们不需要用户去定义,可以直接在 shell 中使用,其中某些变量用户可以修改。&/li&&li&&b&用户变量&/b&:由用户建立和修改,在 shell 脚本编写中会经常用到。&/li&&ul&&li&变量赋值(定义变量)&/li&&ul&&li&&code&varName=Value&/code&&/li&&li&&code&export varName=Value&/code& &/li&&/ul&&li&引用变量&code&$varName&/code& &/li&&/ul&&/ul&&p&Shell变量的&b&作用域&/b&:&/p&&ul&&li&&b&局部变量&/b&的作用范围仅仅&b&限制在其命令行所在的Shell或Shell脚本文件中&/b&;&/li&&li&&b&全局变量&/b&的作用范围则包括&b&本Shell进程及其所有子进程&/b&。&/li&&li&局部变量与全局变量&b&互换&/b&:可以使用 &code&export&/code& 内置命令将局部变量设置为全局变量。 可以使用 &code&export&/code& 内置命令将全局变量设置为局部变量。&/li&&/ul&&p&&b&export命令&/b&:&/p&&ul&&li&&b&显示&/b&当前Shell可见的全局变量&/li&&ul&&li&&code&export [-p]&/code& &/li&&/ul&&li&&b&定义变量值的同时声明为全局变量&/b&。&/li&&ul&&li&&code&export &变量名1=值1& [&变量名2=值2& ...]&/code& &/li&&/ul&&li&声明已经赋值的某个(些)&b&局部变量为全局变量&/b&。&/li&&ul&&li&&code&export &变量名1& [&变量名2& ...]&/code& &/li&&/ul&&li&声明已经赋值的某个(些)&b&全局变量为局部变量&/b&。&/li&&ul&&li&&code&export -n &变量名1& [&变量名2& ...]&/code& &/li&&/ul&&/ul&&p&Shell环境变量:&/p&&ul&&li&环境变量定义 Shell 的&b&运行环境&/b&,保证 Shell 命令的正确执行。&/li&&li&Shell用环境变量来确定查找路径、注册目录、终端类型、终端名称、用户名等。&/li&&li&所有环境变量&b&都是全局变量&/b&(即可以传递给 Shell 的子进程),并可以由用户重新设置。&/li&&/ul&&p&&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-5e3a232eb91bb000cc4171efb1366c37_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&994& data-rawheight=&699& class=&origin_image zh-lightbox-thumb& width=&994& data-original=&https://pic2.zhimg.com/v2-5e3a232eb91bb000cc4171efb1366c37_r.jpg&&&/figure&&p&&br&&/p&&p&&b&Shell变量:查询、显示和取消&/b&:&/p&&ul&&li&显示当前已经定义的所有变量&/li&&ul&&li&所有&b&环境变量&/b&:&code&env&/code&&/li&&li&所有&b&变量和函数&/b&(包括环境变量) :&code&set&/code& &/li&&/ul&&li&显示某(些)个变量的值&/li&&ul&&li&&code&echo $NAME1 [$NAME2 ……]&/code& &/li&&/ul&&li&取消变量的声明或赋值&/li&&ul&&li&&code&unset &NAME&&/code&&/li&&/ul&&/ul&&p&&br&&/p&&h2&3.5.1Shell变量 和 Shell环境练习题&/h2&&blockquote&定义Shell变量stuXX(XX为学生学号末两位),初值为学生姓名全拼,用echo命令显示stuXX变量的值;用unset命令取消stuXX变量,检查结果;用env命令观察当前有哪些已经定义好的shell环境变量&/blockquote&&p&&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-d732c229eba2e33_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&349& data-rawheight=&132& class=&content_image& width=&349&&&/figure&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-bc18fb4e4eda_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&507& data-rawheight=&385& class=&origin_image zh-lightbox-thumb& width=&507& data-original=&https://pic4.zhimg.com/v2-bc18fb4e4eda_r.jpg&&&/figure&&p&&br&&/p&&blockquote&Shell环境变量的值是否可以修改?为什么?&/blockquote&&p&答:环境变量的值一般情况下,可以修改。但一定要&b&慎重修改&/b&,因为一旦修改错误,对shell正常运行造成严重影响,甚至导致shell无法运行。&/p&&h2&四、VI编辑器&/h2&&p&相信没有用过Linux的同学在看一些段子的时候都会看到过两个编辑器:&/p&&ul&&li&vim&/li&&li&emacs&/li&&/ul&&p&下面我们学习如何简单使用vi。vi 是 “Visual interface” 的简称,它可以执行输出、删除、查找、替换、块操作等众多文本操作,而且&b&用户可以根据自己的需要对其进行定制,这是其他编辑程序所没有的&/b&。&/p&&ul&&li&vi可以看做成我们Windows下的记事本&/li&&li&vim 即 Vi IMproved,vi 克隆版本之一&/li&&/ul&&p&使用Vi来编辑文件:&/p&&figure&&img src=&https://pic3.zhimg.com/v2-beeb7ef3f22d23ad61c81_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1020& data-rawheight=&618& class=&origin_image zh-lightbox-thumb& width=&1020& data-original=&https://pic3.zhimg.com/v2-beeb7ef3f22d23ad61c81_r.jpg&&&/figure&&p&&br&&/p&&p&Vi有三种模式:&/p&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-0faad2c75ff2da130fb93c6452dce016_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1010& data-rawheight=&635& class=&origin_image zh-lightbox-thumb& width=&1010& data-original=&https://pic1.zhimg.com/v2-0faad2c75ff2da130fb93c6452dce016_r.jpg&&&/figure&&p&&br&&/p&&h2&4.1普通模式&/h2&&ul&&li&&code&G&/code&用于直接跳转到文件尾&/li&&li&&code&ZZ&/code&用于存盘退出Vi&/li&&li&&code&ZQ&/code&用于不存盘退出Vi&/li&&li&&code&/和?&/code&用于查找字符串&/li&&li&&code&n&/code&继续查找下一个&/li&&li&&code&yy&/code&复制一行&/li&&li&&code&p&/code&粘帖在下一行,P粘贴在前一行&/li&&li&&code&dd&/code&删

我要回帖

更多关于 终端复用器功能结构 的文章

 

随机推荐